refactor
Some checks failed
Deploy Docker Image / build-and-deploy (push) Has been cancelled

This commit is contained in:
Anatoly Karlov 2024-09-18 18:31:26 +07:00
parent 35a88aedd9
commit 87994147b4
10 changed files with 19 additions and 83 deletions

View File

@ -115,15 +115,15 @@
- Перед переводом диспута в финальный статус саппорт должен будет забиндить айди созданного диспута в провайдере через
ручку `BindCreated()`. Здесь особенность, что этот метод фильтрует возможность биндить диспуты только созданные
вручную (из `manual_parsing_created`)
вручную (из `manual_created`)
Далее, в режиме ручного разбора есть опция финализации диспута в фейл (`CancelPending()`) либо в
успех (`ApprovePending()`). Здесь особенность, что в фейл можно перевести любой диспут имеющий не финальный статус, а в
успех можно перевести, только если гарантировано создан внешний диспут у провайдера (
из `pending`,`manual_parsing_binded_pending`)
из `pending`,`manual_pending`)
- Из за того, что для ручных диспутов добавлены отдельные
статусы `manual_parsing_binded_pending` ,`manual_parsing_created` не происходит ситуации, что такие диспуты попадут в
статусы `manual_pending` ,`manual_created` не происходит ситуации, что такие диспуты попадут в
таску `PendingDisputesService` которая автоматически вызывает апи провайдера для проверки статуса
# Схема аппрува корректировок

View File

@ -28,11 +28,11 @@ public class DisputesApiDelegateService implements DisputesApiDelegate {
log.info("-> Req: {}, xRequestID={}, invoiceId={}, paymentId={}", "/create", xRequestID, req.getInvoiceId(), req.getPaymentId());
var accessData = accessService.approveUserAccess(req.getInvoiceId(), req.getPaymentId());
// диспут по платежу может быть открытым только один за раз, если существует, отдаем действующий
// var dispute = apiDisputesService.checkExistBeforeCreate(req.getInvoiceId(), req.getPaymentId());
// if (dispute.isPresent()) {
// log.info("<- Res existing: {}, xRequestID={}, invoiceId={}, paymentId={}", "/create", xRequestID, req.getInvoiceId(), req.getPaymentId());
// return ResponseEntity.ok(new Create200Response(String.valueOf(dispute.get().getId())));
// }
var dispute = apiDisputesService.checkExistBeforeCreate(req.getInvoiceId(), req.getPaymentId());
if (dispute.isPresent()) {
log.info("<- Res existing: {}, xRequestID={}, invoiceId={}, paymentId={}", "/create", xRequestID, req.getInvoiceId(), req.getPaymentId());
return ResponseEntity.ok(new Create200Response(String.valueOf(dispute.get().getId())));
}
var paymentParams = paymentParamsBuilder.buildGeneralPaymentContext(accessData);
var disputeId = apiDisputesService.createDispute(req, paymentParams);
log.info("<- Res: {}, xRequestID={}, invoiceId={}, paymentId={}", "/create", xRequestID, req.getInvoiceId(), req.getPaymentId());

View File

@ -27,7 +27,7 @@ public class ApiAttachmentsService {
// validate
MediaType.valueOf(attachment.getMimeType());
// http 500
var fileId = fileStorageService.saveFile(attachment);
var fileId = fileStorageService.saveFile(attachment.getData());
var fileMeta = new FileMeta(fileId, disputeId, attachment.getMimeType());
log.debug("Trying to save Attachment {}", fileMeta);
// http 500

View File

@ -1,17 +1,13 @@
package dev.vality.disputes.api;
package dev.vality.disputes.manualparsing;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.vality.disputes.admin.ApproveParamsRequest;
import dev.vality.disputes.admin.BindParamsRequest;
import dev.vality.disputes.admin.CancelParamsRequest;
import dev.vality.disputes.admin.ManualParsingServiceSrv;
import dev.vality.geck.serializer.kit.json.JsonProcessor;
import dev.vality.geck.serializer.kit.tbase.TBaseHandler;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.thrift.TBase;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@ -19,9 +15,9 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@RequestMapping({"/test/disputes-api/manual-parsing"})
@RequestMapping({"/debug/disputes-api/manual-parsing"})
@Slf4j
public class TestController {
public class DebugManualParsingController {
private final ManualParsingServiceSrv.Iface manualParsingHandler;
private final ObjectMapper objectMapper = new ObjectMapper();
@ -46,9 +42,4 @@ public class TestController {
log.debug("bindCreated {}", body);
manualParsingHandler.bindCreated(objectMapper.readValue(body, BindParamsRequest.class));
}
@SneakyThrows
public static <T extends TBase> T jsonToThrift(JsonNode jsonNode, Class<T> type) {
return new JsonProcessor().process(jsonNode, new TBaseHandler<>(type));
}
}

View File

@ -77,10 +77,10 @@ public class ManualParsingDisputesService {
if (dispute.getStatus() == DisputeStatus.manual_created) {
// обрабатываем здесь только вручную созданные диспуты, у остальных предполагается,
// что providerDisputeId будет сохранен после создания диспута по API провайдера
log.info("Trying to set manual_parsing_binded_pending Dispute status {}", dispute);
log.info("Trying to set manual_pending Dispute status {}", dispute);
providerDisputeDao.save(new ProviderDispute(providerDisputeId, dispute.getId()));
disputeDao.update(dispute.getId(), DisputeStatus.manual_pending);
log.debug("Dispute status has been set to manual_parsing_binded_pending {}", dispute);
log.debug("Dispute status has been set to manual_pending {}", dispute);
} else {
log.info("Request was skipped by inappropriate status {}", dispute);
}

View File

@ -126,9 +126,9 @@ public class CreatedDisputesService {
@Transactional(propagation = Propagation.REQUIRED)
void finishTaskWithManualParsingFlowActivation(Dispute dispute, List<Attachment> attachments) {
manualParsingTopic.sendCreated(dispute, attachments);
log.info("Trying to set manual_parsing_created Dispute status {}", dispute);
log.info("Trying to set manual_created Dispute status {}", dispute);
disputeDao.update(dispute.getId(), DisputeStatus.manual_created);
log.debug("Dispute status has been set to manual_parsing_created {}", dispute.getId());
log.debug("Dispute status has been set to manual_created {}", dispute.getId());
}
private boolean isCapturedBlockedForDispute(Dispute dispute) {

View File

@ -1,10 +1,8 @@
package dev.vality.disputes.service.external;
import dev.vality.swag.disputes.model.CreateRequestAttachmentsInner;
public interface FileStorageService {
String saveFile(CreateRequestAttachmentsInner attachment);
String saveFile(byte[] data);
String generateDownloadUrl(String fileId);

View File

@ -6,7 +6,6 @@ import dev.vality.disputes.exception.NotFoundException;
import dev.vality.disputes.service.external.FileStorageService;
import dev.vality.file.storage.FileNotFound;
import dev.vality.file.storage.FileStorageSrv;
import dev.vality.swag.disputes.model.CreateRequestAttachmentsInner;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@ -34,13 +33,13 @@ public class FileStorageServiceImpl implements FileStorageService {
@Override
@SneakyThrows
public String saveFile(CreateRequestAttachmentsInner attachment) {
public String saveFile(byte[] data) {
log.debug("Trying to create new file to file-storage");
var result = fileStorageClient.createNewFile(Collections.emptyMap(), getTime().toString());
var fileDataId = result.getFileDataId();
log.debug("Trying to upload data to s3 with id: {}", fileDataId);
var requestPut = new HttpPut(result.getUploadUrl());
requestPut.setEntity(HttpEntities.create(attachment.getData(), null));
requestPut.setEntity(HttpEntities.create(data, null));
// execute() делает внутри try-with-resources + закрывает InputStream в EntityUtils.consume(entity)
httpClient.execute(requestPut, new BasicHttpClientResponseHandler());
log.debug("File has been successfully uploaded with id: {}", fileDataId);

View File

@ -44,13 +44,4 @@ public class DisputeDaoTest {
assertEquals(3,
disputeDao.get(random.getInvoiceId(), random.getPaymentId()).size());
}
// @Test
// @Transactional
// public void as() {
// var random = random(Dispute.class);
// disputeDao.save(random);
// assertEquals(random, disputeDao.getForUpdateSkipLocked(random.getId()));
// assertEquals(random, disputeDao.getForUpdateSkipLocked(random.getId()));
// }
}

View File

@ -1,43 +0,0 @@
package dev.vality.disputes.manualparsing;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.vality.disputes.admin.ApproveParams;
import dev.vality.disputes.admin.ApproveParamsRequest;
import dev.vality.geck.serializer.kit.json.JsonProcessor;
import dev.vality.geck.serializer.kit.tbase.TBaseHandler;
import dev.vality.testcontainers.annotations.util.ThriftUtil;
import lombok.SneakyThrows;
import org.apache.thrift.TBase;
import org.junit.jupiter.api.Test;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
@SuppressWarnings({"ParameterName", "LineLength"})
class ManualParsingDisputesServiceTest {
@Test
public void name() {
var approveParamsRequest = new ApproveParamsRequest();
approveParamsRequest.setApproveParams(List.of(new ApproveParams("7", true)));
System.out.println(ThriftUtil.thriftToJson(approveParamsRequest));
System.out.println(Instant.now().plus(1, ChronoUnit.DAYS).toString());
}
@Test
@SneakyThrows
public void asd() {
System.out.println(fromJson("{\"approveParams\":[\"list\",{\"disputeId\":\"7\",\"skipCallHgForCreateAdjustment\":true}]}", ApproveParamsRequest.class));
ApproveParamsRequest approveParamsRequest = new ObjectMapper().readValue(
"{\"approveParams\":[{\"disputeId\":\"7\",\"skipCallHgForCreateAdjustment\":true}]}",
ApproveParamsRequest.class);
System.out.println(approveParamsRequest);
}
@SneakyThrows
public static <T extends TBase> T fromJson(String jsonString, Class<T> type) {
return new JsonProcessor().process(new ObjectMapper().readTree(jsonString), new TBaseHandler<>(type));
}
}