dev add tariff endpoints
Test Workflow / test (push) Successful in 4s

This commit is contained in:
vladp
2026-02-02 15:00:18 +07:00
parent 4395654b0d
commit 22b487da22
9 changed files with 184 additions and 31 deletions
@@ -20,7 +20,8 @@ public class HandlerConfig {
ImageFoundRequestHandler imageFoundRequestHandler, ImageFoundRequestHandler imageFoundRequestHandler,
VerifyRegisterUserHandler verifyRegisterUser, VerifyRegisterUserHandler verifyRegisterUser,
AuthRequestHandler authRequestHandler, AuthRequestHandler authRequestHandler,
CompanyHandler companyHandler CompanyHandler companyHandler,
TariffHandler tariffHandler
) { ) {
Map<Integer, RequestHandler> map = new HashMap<>(); Map<Integer, RequestHandler> map = new HashMap<>();
map.put(20001, login); map.put(20001, login);
@@ -32,6 +33,7 @@ public class HandlerConfig {
map.put(20008, authRequestHandler); map.put(20008, authRequestHandler);
map.put(20009, verifyRegisterUser); map.put(20009, verifyRegisterUser);
map.put(30000, companyHandler); map.put(30000, companyHandler);
map.put(30001, tariffHandler);
return map; return map;
} }
@@ -422,23 +422,6 @@ public class ApiController {
return ResponseEntity.ok().body(noCopyCheckResult); return ResponseEntity.ok().body(noCopyCheckResult);
} }
private ResponseEntity<BaseResponse> checkForDuplicates(String uploadId) throws IOException {
Optional<FileEntity> uploadedFile = fileEntityRepository.findByUploadSessionId(uploadId);
if (uploadedFile.isEmpty() || !uploadedFile.get().getMimeType().equals("image")) {
return null;
}
FileEntity fileEntity = uploadedFile.get();
List<SimilarFileDTO> similarFiles = fileSimilarityService.findSimilarFiles(fileEntity.getId());
if (hasDuplicate(similarFiles)) {
return handleDuplicate(fileEntity, similarFiles);
}
return null;
}
private boolean hasDuplicate(List<SimilarFileDTO> similarFiles) { private boolean hasDuplicate(List<SimilarFileDTO> similarFiles) {
return similarFiles.stream().anyMatch(f -> f.getHammingDistance() <= 5); return similarFiles.stream().anyMatch(f -> f.getHammingDistance() <= 5);
} }
@@ -30,6 +30,10 @@ public enum MessageCode {
SIMILAR_FILES_FOUND(0, "Similar files found"), SIMILAR_FILES_FOUND(0, "Similar files found"),
FILE_IS_PROTECTED(0, "File is protected"), FILE_IS_PROTECTED(0, "File is protected"),
FILE_IS_NOT_PROTECTED(0, "File is not protected"), FILE_IS_NOT_PROTECTED(0, "File is not protected"),
TARIFF_IS_ADD(0, "Tariff is added"),
TARIFF_IS_DELETED(0, "Tariff is deleted"),
TARIFF_IS_UPDATED(0, "Tariff is updated"),
TARIFF_IS_NOT_FOUND(0, "Tariff is not found"),
VALIDATION_ERROR(2, "Validation error"), VALIDATION_ERROR(2, "Validation error"),
RESOURCE_NOT_FOUND(4, "Resource not found"), RESOURCE_NOT_FOUND(4, "Resource not found"),
INTERNAL_ERROR(4, "Internal server error"), INTERNAL_ERROR(4, "Internal server error"),
@@ -0,0 +1,49 @@
package ru.soune.nocopy.dto.tarriff;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TariffRequest {
private Long id;
@NotNull
@NotBlank
@JsonProperty("type")
private String type;
@NotNull
@NotBlank
@JsonProperty("tariff_name")
private String name;
@Min(value = 0, message = "Price cannot be negative")
@JsonProperty("tariff_price")
private double price;
@Min(value = 0, message = "Tokens must be at least 0")
@JsonProperty("tariff_tokens")
private int tokens;
@Min(value = 0, message = "Max files count must be at least 0")
@JsonProperty("max_files")
private int maxFilesCount;
@Min(value = 0, message = "Disk size must be at least 0")
@JsonProperty("disk_size")
private int diskSize;
@Min(value = 0, message = "Max users must be at least 0")
@JsonProperty("max_users")
private int maxUsers;
@JsonProperty("action")
private String action;
}
@@ -0,0 +1,12 @@
package ru.soune.nocopy.dto.tarriff;
import lombok.Builder;
import lombok.Data;
import ru.soune.nocopy.entity.tarif.Tariff;
@Data
@Builder
public class TariffResponse {
private String tariffName;
private String tariffType;
}
@@ -1,6 +1,7 @@
package ru.soune.nocopy.entity.tarif; package ru.soune.nocopy.entity.tarif;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -13,13 +14,11 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class Tariff { public class Tariff {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
@Column(name = "type") @Column(name = "type", unique = true, nullable = false)
private String type; private String type;
@Column(name = "tariff_name") @Column(name = "tariff_name")
@@ -0,0 +1,111 @@
package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import ru.soune.nocopy.dto.BaseRequest;
import ru.soune.nocopy.dto.BaseResponse;
import ru.soune.nocopy.dto.MessageCode;
import ru.soune.nocopy.dto.tarriff.TariffDTO;
import ru.soune.nocopy.dto.tarriff.TariffRequest;
import ru.soune.nocopy.dto.tarriff.TariffResponse;
import ru.soune.nocopy.service.tariff.TariffService;
import java.util.Map;
@Component
@Slf4j
@RequiredArgsConstructor
public class TariffHandler implements RequestHandler {
private final ObjectMapper objectMapper;
private final TariffService tariffService;
@Override
public BaseResponse handle(BaseRequest request) throws Exception {
try {
TariffRequest tariffRequest = objectMapper.convertValue(request.getMessageBody(), TariffRequest.class);
String action = tariffRequest.getAction();
switch (action) {
case "add":
return handleAddTariff(request, tariffRequest);
case "remove":
return handleRemoveTariff(request, tariffRequest);
case "update":
return null;
}
} catch (Exception e) {
log.error("Error add tariff", e);
return new BaseResponse(
request.getMsgId(),
MessageCode.SUCCESS.getCode(),
"Error processing request: " + e.getMessage(),
null);
}
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(),
MessageCode.SUCCESS.getDescription(), null);
}
private BaseResponse handleAddTariff(BaseRequest request, TariffRequest tariffRequest) {
tariffService.addTariff(tariffRequest.getName(), tariffRequest.getPrice(), tariffRequest.getType(),
tariffRequest.getTokens(), tariffRequest.getDiskSize(), tariffRequest.getMaxUsers(),
tariffRequest.getMaxFilesCount());
TariffResponse tariffResponse = TariffResponse.builder()
.tariffName(tariffRequest.getName())
.tariffType(tariffRequest.getType())
.build();
return new BaseResponse(request.getMsgId(), MessageCode.TARIFF_IS_ADD.getCode(),
MessageCode.TARIFF_IS_ADD.getDescription(),
tariffResponse);
}
private BaseResponse handleRemoveTariff(BaseRequest request, TariffRequest tariffRequest) {
TariffDTO tariff = tariffService.getTariffById(tariffRequest.getId());
if (tariff == null) {
return new BaseResponse(request.getMsgId(), MessageCode.TARIFF_IS_NOT_FOUND.getCode(),
MessageCode.TARIFF_IS_NOT_FOUND.getDescription(),
Map.of("id", tariffRequest.getId()));
}
TariffResponse tariffResponse = TariffResponse.builder()
.tariffName(tariff.getName())
.tariffType(tariff.getType())
.build();
tariffService.deleteTariff(tariffRequest.getId());
return new BaseResponse(request.getMsgId(), MessageCode.TARIFF_IS_DELETED.getCode(),
MessageCode.TARIFF_IS_DELETED.getDescription(),
tariffResponse);
}
private BaseResponse handleUpdateTariff(BaseRequest request, TariffRequest tariffRequest) {
TariffDTO tariff = tariffService.getTariffById(tariffRequest.getId());
if (tariff == null) {
return new BaseResponse(request.getMsgId(), MessageCode.TARIFF_IS_NOT_FOUND.getCode(),
MessageCode.TARIFF_IS_NOT_FOUND.getDescription(),
Map.of("id", tariffRequest.getId()));
}
TariffDTO tariffDTO = tariffService.updateTariff(tariffRequest.getId(), tariff);
TariffResponse tariffResponse = TariffResponse.builder()
.tariffName(tariffDTO.getName())
.tariffType(tariffDTO.getType())
.build();
return new BaseResponse(request.getMsgId(), MessageCode.TARIFF_IS_UPDATED.getCode(),
MessageCode.TARIFF_IS_UPDATED.getDescription(),
tariffResponse);
}
}
@@ -88,13 +88,6 @@ public class TariffInitializationService {
if (existingTariffs.isEmpty()) { if (existingTariffs.isEmpty()) {
createDefaultTariffs(); createDefaultTariffs();
} else {
Map<TariffType, Boolean> existingTypes = new HashMap<>();
existingTariffs.forEach(tariff -> existingTypes.put(TariffType.valueOf(tariff.getType()), true));
Arrays.stream(TariffType.values())
.filter(type -> !existingTypes.containsKey(type))
.forEach(this::createDefaultTariff);
} }
} }
@@ -18,7 +18,7 @@ public class TariffService {
private final TariffRepository tariffRepository; private final TariffRepository tariffRepository;
public Tariff addTariff(String tariffName, double price, String type, int tokens, long diskSize, long maxUsers, public void addTariff(String tariffName, double price, String type, int tokens, long diskSize, long maxUsers,
int maxFilesCount) { int maxFilesCount) {
Tariff tariff = new Tariff(); Tariff tariff = new Tariff();
tariff.setName(tariffName); tariff.setName(tariffName);
@@ -29,7 +29,7 @@ public class TariffService {
tariff.setMaxUsers(maxUsers); tariff.setMaxUsers(maxUsers);
tariff.setMaxFilesCount(maxFilesCount); tariff.setMaxFilesCount(maxFilesCount);
return tariffRepository.save(tariff); tariffRepository.save(tariff);
} }
public List<TariffDTO> getAllTariffs() { public List<TariffDTO> getAllTariffs() {