mirror of
https://github.com/valitydev/disputes-api.git
synced 2024-11-06 00:55:23 +00:00
This commit is contained in:
parent
35a88aedd9
commit
87994147b4
@ -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` которая автоматически вызывает апи провайдера для проверки статуса
|
||||
|
||||
# Схема аппрува корректировок
|
||||
|
@ -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());
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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()));
|
||||
// }
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user