dev add monitoring basic
Test Workflow / test (push) Successful in 2s

This commit is contained in:
vladp
2026-03-03 15:43:47 +07:00
parent 404e1a6bee
commit 38e7a382c7
6 changed files with 155 additions and 20 deletions
@@ -28,6 +28,7 @@ public class HandlerConfig {
DaDataHandler daDataHandler, DaDataHandler daDataHandler,
PaymentHandler paymentHandler, PaymentHandler paymentHandler,
GetViolationsHandler getViolationsHandler, GetViolationsHandler getViolationsHandler,
CostHandler costHandler,
MonitoringHandler monitoringHandler MonitoringHandler monitoringHandler
) { ) {
Map<Integer, RequestHandler> map = new HashMap<>(); Map<Integer, RequestHandler> map = new HashMap<>();
@@ -48,6 +49,7 @@ public class HandlerConfig {
map.put(30005, paymentHandler); map.put(30005, paymentHandler);
map.put(30006, getViolationsHandler); map.put(30006, getViolationsHandler);
map.put(30007, monitoringHandler); map.put(30007, monitoringHandler);
map.put(30008, costHandler);
return map; 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.repository.SimilarImageProjection;
import ru.soune.nocopy.service.FileSimilarityService; import ru.soune.nocopy.service.FileSimilarityService;
import ru.soune.nocopy.service.ImageHashService; 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.FileEntityService;
import ru.soune.nocopy.service.file.FileUploadService; 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.service.tariff.TariffInfoService;
import ru.soune.nocopy.util.FileUtil; import ru.soune.nocopy.util.FileUtil;
@@ -75,6 +75,8 @@ public class FileUploadServiceImpl implements FileUploadService {
@Autowired @Autowired
private FileEntityService fileEntityService; private FileEntityService fileEntityService;
private final CostService costService;
@Lazy @Lazy
private final NoCopyFileService noCopyFileService; private final NoCopyFileService noCopyFileService;
@@ -374,7 +376,7 @@ public class FileUploadServiceImpl implements FileUploadService {
if (status != FileStatus.TEMP) { if (status != FileStatus.TEMP) {
String fileType = session.getFileType(); String fileType = session.getFileType();
tariffInfoService.writeOffTokens(session.getUserId(), protectCost(fileType)); tariffInfoService.writeOffTokens(session.getUserId(), costService.protectFileCost(fileType));
} }
} else { } else {
sessionRepository.save(session); 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 { private String assembleFileSynchronously(FileUploadSession session) throws IOException {
Path finalFilePath = prepareFinalFile(session); Path finalFilePath = prepareFinalFile(session);
log.info("file path: " + finalFilePath); log.info("file path: " + finalFilePath);