@@ -28,6 +28,7 @@ public class HandlerConfig {
|
||||
DaDataHandler daDataHandler,
|
||||
PaymentHandler paymentHandler,
|
||||
GetViolationsHandler getViolationsHandler,
|
||||
CostHandler costHandler,
|
||||
MonitoringHandler monitoringHandler
|
||||
) {
|
||||
Map<Integer, RequestHandler> 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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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<AuthToken> 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user