@@ -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,8 +18,8 @@ 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);
|
||||||
tariff.setPrice(price);
|
tariff.setPrice(price);
|
||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user