87 lines
3.2 KiB
Java
87 lines
3.2 KiB
Java
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);
|
||
|
|
}
|
||
|
|
}
|