diff --git a/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java b/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java index 40361d4..386bb20 100644 --- a/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java +++ b/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java @@ -28,6 +28,7 @@ public class HandlerConfig { DaDataHandler daDataHandler, PaymentHandler paymentHandler, GetViolationsHandler getViolationsHandler, + CostHandler costHandler, MonitoringHandler monitoringHandler ) { Map map = new HashMap<>(); @@ -48,6 +49,7 @@ public class HandlerConfig { map.put(30005, paymentHandler); map.put(30006, getViolationsHandler); map.put(30007, monitoringHandler); + map.put(30008, costHandler); return map; } diff --git a/src/main/java/ru/soune/nocopy/dto/cost/CostRequest.java b/src/main/java/ru/soune/nocopy/dto/cost/CostRequest.java new file mode 100644 index 0000000..66a3b17 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/cost/CostRequest.java @@ -0,0 +1,18 @@ +package ru.soune.nocopy.dto.cost; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class CostRequest { + String action; + + @JsonProperty("file_type") + String fileType; + + @JsonProperty("count_files") + Integer countFilesForProtect; + + @JsonProperty("auth_token") + String authToken; +} diff --git a/src/main/java/ru/soune/nocopy/dto/cost/CostResponse.java b/src/main/java/ru/soune/nocopy/dto/cost/CostResponse.java new file mode 100644 index 0000000..68b3058 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/cost/CostResponse.java @@ -0,0 +1,16 @@ +package ru.soune.nocopy.dto.cost; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CostResponse { + private int cost; + + private Boolean success; + + @JsonProperty("tokens_count") + private int needTokensCount; +} diff --git a/src/main/java/ru/soune/nocopy/handler/CostHandler.java b/src/main/java/ru/soune/nocopy/handler/CostHandler.java new file mode 100644 index 0000000..b6b130f --- /dev/null +++ b/src/main/java/ru/soune/nocopy/handler/CostHandler.java @@ -0,0 +1,86 @@ +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.cost.CostRequest; +import ru.soune.nocopy.dto.cost.CostResponse; +import ru.soune.nocopy.entity.user.AuthToken; +import ru.soune.nocopy.entity.user.User; +import ru.soune.nocopy.repository.AuthTokenRepository; +import ru.soune.nocopy.service.cost.CostService; + +import java.util.Optional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class CostHandler implements RequestHandler { + + private final CostService costService; + + private final AuthTokenRepository authTokenRepository; + + private final ObjectMapper objectMapper; + + @Override + public BaseResponse handle(BaseRequest request) throws Exception { + CostRequest costRequest = objectMapper.convertValue(request.getMessageBody(), CostRequest.class); + String action = costRequest.getAction(); + + return switch (action) { + case "costFileProtect" -> handleFileProtectCost(costRequest, request); + case "checkTokensForProtect" -> handleCheckTokensForFilesProtect(costRequest, request); + default -> new BaseResponse( + request.getMsgId(), + MessageCode.INVALID_ACTION.getCode(), + "Invalid action: " + action, + null); + }; + } + + private BaseResponse handleFileProtectCost(CostRequest costRequest, BaseRequest request) { + int cost = costService.protectFileCost(costRequest.getFileType()); + + return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), + CostResponse.builder() + .cost(cost) + .build()); + } + + private BaseResponse handleCheckTokensForFilesProtect(CostRequest costRequest, BaseRequest request) { + String authToken = costRequest.getAuthToken(); + Optional token = authTokenRepository.findByToken(authToken); + + if (token.isEmpty()) { + return new BaseResponse( + request.getMsgId(), + MessageCode.AUTH_TOKEN_NOT_FOUND.getCode(), + MessageCode.AUTH_TOKEN_NOT_FOUND.getDescription(), + null); + } + + User user = token.get().getUser(); + Integer tokens = user.getActiveTariffInfo().getTokens(); + + int cost = costService.protectFileCost(costRequest.getFileType()); + int count = costRequest.getCountFilesForProtect(); + int totalCost = count * cost; + boolean success = totalCost <= tokens; + int needToken = success ? 0: tokens - totalCost; + + CostResponse costResponse = CostResponse.builder() + .cost(totalCost) + .success(totalCost <= tokens) + .needTokensCount(Math.abs(needToken)) + .build(); + + return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), costResponse); + } +} diff --git a/src/main/java/ru/soune/nocopy/service/cost/CostService.java b/src/main/java/ru/soune/nocopy/service/cost/CostService.java new file mode 100644 index 0000000..782f89f --- /dev/null +++ b/src/main/java/ru/soune/nocopy/service/cost/CostService.java @@ -0,0 +1,29 @@ +package ru.soune.nocopy.service.cost; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.soune.nocopy.service.tariff.TariffConstants; + +@Slf4j +@Component +@RequiredArgsConstructor +public class CostService { + + public int protectFileCost(String fileType) { + int cost = 0; + + switch (fileType) { + case "video": + return TariffConstants.VIDEO_TOKEN_VALUE; + case "image": + return TariffConstants.IMAGE_TOKEN_VALUE; + case "audio": + return TariffConstants.AUDIO_TOKEN_VALUE; + case "document": + return TariffConstants.PDF_TOKEN_VALUE; + } + + return cost; + } +} diff --git a/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java b/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java index cfcba2c..f0a8050 100644 --- a/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java +++ b/src/main/java/ru/soune/nocopy/service/file/impl/FileUploadServiceImpl.java @@ -23,9 +23,9 @@ import ru.soune.nocopy.repository.FileUploadSessionRepository; import ru.soune.nocopy.repository.SimilarImageProjection; import ru.soune.nocopy.service.FileSimilarityService; import ru.soune.nocopy.service.ImageHashService; +import ru.soune.nocopy.service.cost.CostService; import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileUploadService; -import ru.soune.nocopy.service.tariff.TariffConstants; import ru.soune.nocopy.service.tariff.TariffInfoService; import ru.soune.nocopy.util.FileUtil; @@ -75,6 +75,8 @@ public class FileUploadServiceImpl implements FileUploadService { @Autowired private FileEntityService fileEntityService; + private final CostService costService; + @Lazy private final NoCopyFileService noCopyFileService; @@ -374,7 +376,7 @@ public class FileUploadServiceImpl implements FileUploadService { if (status != FileStatus.TEMP) { String fileType = session.getFileType(); - tariffInfoService.writeOffTokens(session.getUserId(), protectCost(fileType)); + tariffInfoService.writeOffTokens(session.getUserId(), costService.protectFileCost(fileType)); } } else { sessionRepository.save(session); @@ -494,24 +496,6 @@ public class FileUploadServiceImpl implements FileUploadService { } } - - private int protectCost(String fileType) { - int cost = 0; - - switch (fileType) { - case "video": - return TariffConstants.VIDEO_TOKEN_VALUE; - case "image": - return TariffConstants.IMAGE_TOKEN_VALUE; - case "audio": - return TariffConstants.AUDIO_TOKEN_VALUE; - case "document": - return TariffConstants.PDF_TOKEN_VALUE; - } - - return cost; - } - private String assembleFileSynchronously(FileUploadSession session) throws IOException { Path finalFilePath = prepareFinalFile(session); log.info("file path: " + finalFilePath);