|
|
|
|
@ -8,6 +8,7 @@ import com.yau.digitalrmb.issuance.application.query.CommercialBankInventoryView
|
|
|
|
|
import com.yau.digitalrmb.issuance.application.query.IssuanceRequestView;
|
|
|
|
|
import com.yau.digitalrmb.issuance.domain.model.DenominationItem;
|
|
|
|
|
import com.yau.digitalrmb.issuance.domain.model.IssuanceApplicationId;
|
|
|
|
|
import com.yau.digitalrmb.issuance.domain.model.IssuanceAuditActor;
|
|
|
|
|
import com.yau.digitalrmb.issuance.domain.model.IssuanceBankInventory;
|
|
|
|
|
import com.yau.digitalrmb.issuance.domain.model.IssuanceRequest;
|
|
|
|
|
import com.yau.digitalrmb.issuance.domain.repository.IssuanceRequestRepository;
|
|
|
|
|
@ -58,96 +59,124 @@ public class CommercialBankIssuanceApplicationService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Transactional
|
|
|
|
|
public IssuanceRequestView create(CreateIssuanceRequestCommand command, String authenticatedAccountName) {
|
|
|
|
|
public IssuanceRequestView create(CreateIssuanceRequestCommand command, IssuanceAuditActor auditActor) {
|
|
|
|
|
try {
|
|
|
|
|
UUID id = UUID.randomUUID();
|
|
|
|
|
IssuanceRequest request = IssuanceRequest.create(new IssuanceApplicationId(id), requestNo(id),
|
|
|
|
|
command.getBankCode(), command.getOrganizationId(), command.getTotalAmount(), command.getCurrency(),
|
|
|
|
|
command.getDenominations());
|
|
|
|
|
repository.save(request, auditActor(authenticatedAccountName));
|
|
|
|
|
repository.save(request, auditActor(auditActor));
|
|
|
|
|
return IssuanceRequestView.from(request);
|
|
|
|
|
} catch (IllegalArgumentException | IllegalStateException | NullPointerException exception) {
|
|
|
|
|
throw validationError(exception);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IssuanceRequestView create(CreateIssuanceRequestCommand command, String username) {
|
|
|
|
|
return create(command, legacyAuditActor(username));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Transactional
|
|
|
|
|
public IssuanceRequestView update(UUID id, UpdateIssuanceRequestCommand command, String authenticatedAccountName) {
|
|
|
|
|
public IssuanceRequestView update(UUID id, UpdateIssuanceRequestCommand command, IssuanceAuditActor auditActor) {
|
|
|
|
|
try {
|
|
|
|
|
IssuanceRequest request = requireRequest(id);
|
|
|
|
|
request.updateDraft(command.getTotalAmount(), command.getCurrency(), command.getDenominations());
|
|
|
|
|
repository.save(request, auditActor(authenticatedAccountName));
|
|
|
|
|
repository.save(request, auditActor(auditActor));
|
|
|
|
|
return IssuanceRequestView.from(request);
|
|
|
|
|
} catch (IllegalArgumentException | IllegalStateException | NullPointerException exception) {
|
|
|
|
|
throw validationError(exception);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IssuanceRequestView update(UUID id, UpdateIssuanceRequestCommand command, String username) {
|
|
|
|
|
return update(id, command, legacyAuditActor(username));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Transactional
|
|
|
|
|
public IssuanceRequestView prepareMessage(UUID id, String authenticatedAccountName) {
|
|
|
|
|
public IssuanceRequestView prepareMessage(UUID id, IssuanceAuditActor auditActor) {
|
|
|
|
|
try {
|
|
|
|
|
IssuanceRequest request = requireRequest(id);
|
|
|
|
|
String timestamp = LocalDateTime.now().format(TIMESTAMP_FORMAT);
|
|
|
|
|
String message = messageComposer.compose(request.getBankCode(), request.getOrganizationId(),
|
|
|
|
|
request.getTotalAmount(), request.getDenominations(), request.getCurrency(), timestamp);
|
|
|
|
|
request.prepareMessage(timestamp, message);
|
|
|
|
|
repository.save(request, auditActor(authenticatedAccountName));
|
|
|
|
|
repository.save(request, auditActor(auditActor));
|
|
|
|
|
return IssuanceRequestView.from(request);
|
|
|
|
|
} catch (IllegalArgumentException | IllegalStateException | NullPointerException exception) {
|
|
|
|
|
throw validationError(exception);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IssuanceRequestView prepareMessage(UUID id, String username) {
|
|
|
|
|
return prepareMessage(id, legacyAuditActor(username));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Transactional
|
|
|
|
|
public IssuanceRequestView digest(UUID id, String authenticatedAccountName) {
|
|
|
|
|
public IssuanceRequestView digest(UUID id, IssuanceAuditActor auditActor) {
|
|
|
|
|
try {
|
|
|
|
|
IssuanceRequest request = requireRequest(id);
|
|
|
|
|
SignedIssuancePayload signedPayload = signatureService.sign(SIGNING_KEY_REF, request.getMessageText());
|
|
|
|
|
request.recordDigest(signedPayload.getDigest());
|
|
|
|
|
repository.save(request, auditActor(authenticatedAccountName));
|
|
|
|
|
repository.save(request, auditActor(auditActor));
|
|
|
|
|
return IssuanceRequestView.from(request);
|
|
|
|
|
} catch (IllegalArgumentException | IllegalStateException | NullPointerException exception) {
|
|
|
|
|
throw validationError(exception);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IssuanceRequestView digest(UUID id, String username) {
|
|
|
|
|
return digest(id, legacyAuditActor(username));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Transactional
|
|
|
|
|
public IssuanceRequestView sign(UUID id, String authenticatedAccountName) {
|
|
|
|
|
public IssuanceRequestView sign(UUID id, IssuanceAuditActor auditActor) {
|
|
|
|
|
try {
|
|
|
|
|
IssuanceRequest request = requireRequest(id);
|
|
|
|
|
SignedIssuancePayload signedPayload = signatureService.sign(SIGNING_KEY_REF, request.getMessageText());
|
|
|
|
|
request.recordSignature(signedPayload.getSigningKeyRef(), signedPayload.getSignature());
|
|
|
|
|
repository.save(request, auditActor(authenticatedAccountName));
|
|
|
|
|
repository.save(request, auditActor(auditActor));
|
|
|
|
|
return IssuanceRequestView.from(request);
|
|
|
|
|
} catch (IllegalArgumentException | IllegalStateException | NullPointerException exception) {
|
|
|
|
|
throw validationError(exception);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IssuanceRequestView sign(UUID id, String username) {
|
|
|
|
|
return sign(id, legacyAuditActor(username));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Transactional
|
|
|
|
|
public IssuanceRequestView packagePayload(UUID id, String authenticatedAccountName) {
|
|
|
|
|
public IssuanceRequestView packagePayload(UUID id, IssuanceAuditActor auditActor) {
|
|
|
|
|
try {
|
|
|
|
|
IssuanceRequest request = requireRequest(id);
|
|
|
|
|
request.packagePayload(payloadFor(request));
|
|
|
|
|
repository.save(request, auditActor(authenticatedAccountName));
|
|
|
|
|
repository.save(request, auditActor(auditActor));
|
|
|
|
|
return IssuanceRequestView.from(request);
|
|
|
|
|
} catch (IllegalArgumentException | IllegalStateException | NullPointerException exception) {
|
|
|
|
|
throw validationError(exception);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IssuanceRequestView packagePayload(UUID id, String username) {
|
|
|
|
|
return packagePayload(id, legacyAuditActor(username));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Transactional
|
|
|
|
|
public IssuanceRequestView send(UUID id, String authenticatedAccountName) {
|
|
|
|
|
public IssuanceRequestView send(UUID id, IssuanceAuditActor auditActor) {
|
|
|
|
|
try {
|
|
|
|
|
IssuanceRequest request = requireRequest(id);
|
|
|
|
|
request.sendToCentralBank(Instant.now());
|
|
|
|
|
repository.save(request, auditActor(authenticatedAccountName));
|
|
|
|
|
repository.save(request, auditActor(auditActor));
|
|
|
|
|
return IssuanceRequestView.from(request);
|
|
|
|
|
} catch (IllegalArgumentException | IllegalStateException | NullPointerException exception) {
|
|
|
|
|
throw validationError(exception);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IssuanceRequestView send(UUID id, String username) {
|
|
|
|
|
return send(id, legacyAuditActor(username));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Transactional(readOnly = true)
|
|
|
|
|
public IssuanceRequestView getCommercialBankView(UUID id) {
|
|
|
|
|
return IssuanceRequestView.from(requireRequest(id));
|
|
|
|
|
@ -204,11 +233,15 @@ public class CommercialBankIssuanceApplicationService {
|
|
|
|
|
return "ISSUE_REQ_" + id.toString().replace("-", "").toUpperCase(Locale.ROOT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static String auditActor(String authenticatedAccountName) {
|
|
|
|
|
if (authenticatedAccountName == null || authenticatedAccountName.trim().isEmpty()) {
|
|
|
|
|
throw new IllegalArgumentException("authenticated account name must not be blank");
|
|
|
|
|
private static IssuanceAuditActor auditActor(IssuanceAuditActor auditActor) {
|
|
|
|
|
if (auditActor == null) {
|
|
|
|
|
throw new IllegalArgumentException("audit actor must not be null");
|
|
|
|
|
}
|
|
|
|
|
return authenticatedAccountName;
|
|
|
|
|
return auditActor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static IssuanceAuditActor legacyAuditActor(String username) {
|
|
|
|
|
return new IssuanceAuditActor(0L, username);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static BusinessException validationError(RuntimeException exception) {
|
|
|
|
|
|