use of ca.bc.gov.educ.penreg.api.struct.v1.Saga in project EDUC-PEN-REG-BATCH-API by bcgov.
the class PenRequestBatchSagaController method processBatchRequest.
private ResponseEntity<List<ArchiveAndReturnSagaResponse>> processBatchRequest(final SagaEnum sagaName, final PenRequestBatchArchiveAndReturnAllSagaData penRequestBatchArchiveAndReturnAllSagaData) {
final var penRequestBatchIDs = penRequestBatchArchiveAndReturnAllSagaData.getPenRequestBatchArchiveAndReturnSagaData().stream().map(PenRequestBatchArchiveAndReturnSagaData::getPenRequestBatchID).collect(Collectors.toList());
final var sagaInProgress = !this.getSagaService().findAllByPenRequestBatchIDInAndStatusIn(penRequestBatchIDs, this.getStatusesFilter()).isEmpty();
if (sagaInProgress) {
return ResponseEntity.status(HttpStatus.CONFLICT).build();
}
try {
final var updateUser = penRequestBatchArchiveAndReturnAllSagaData.getUpdateUser();
final var payloads = penRequestBatchArchiveAndReturnAllSagaData.getPenRequestBatchArchiveAndReturnSagaData().stream().map(sagaData -> {
sagaData.setUpdateUser(updateUser);
try {
val payload = JsonUtil.getJsonStringFromObject(sagaData);
return Pair.of(sagaData.getPenRequestBatchID(), payload);
} catch (final JsonProcessingException e) {
throw new InvalidParameterException(e.getMessage());
}
}).collect(Collectors.toList());
final var sagas = this.getOrchestratorMap().get(sagaName.toString()).saveMultipleSagas(payloads, penRequestBatchArchiveAndReturnAllSagaData.getCreateUser());
for (val saga : sagas) {
this.getOrchestratorMap().get(sagaName.toString()).startSaga(saga);
}
return ResponseEntity.ok(sagas.stream().map(archiveAndReturnSagaResponseMapper::toStruct).collect(Collectors.toList()));
} catch (final Exception e) {
throw new SagaRuntimeException(e.getMessage());
}
}
use of ca.bc.gov.educ.penreg.api.struct.v1.Saga in project EDUC-PEN-REG-BATCH-API by bcgov.
the class BaseUserActionsOrchestrator method updatePenRequestBatchStudent.
/**
* Update PEN Request Batch record and PRB Student record.
*
* @param event the event
* @param saga the saga
* @param t the pen request batch student saga data
* @throws JsonProcessingException the json processing exception
*/
protected void updatePenRequestBatchStudent(final Event event, final Saga saga, final T t) throws JsonProcessingException {
final PenRequestBatchStudent prbStudent = this.createPRBStudent(event, t);
saga.setSagaState(UPDATE_PEN_REQUEST_BATCH_STUDENT.toString());
final SagaEvent eventStates = this.createEventState(saga, event.getEventType(), event.getEventOutcome(), event.getEventPayload());
this.getSagaService().updateAttachedSagaWithEvents(saga, eventStates);
final Event nextEvent = Event.builder().sagaId(saga.getSagaId()).eventType(UPDATE_PEN_REQUEST_BATCH_STUDENT).replyTo(this.getTopicToSubscribe()).eventPayload(JsonUtil.getJsonStringFromObject(prbStudent)).build();
this.postMessageToTopic(PEN_REQUEST_BATCH_API_TOPIC.toString(), nextEvent);
log.info("message sent to PEN_REQUEST_BATCH_API_TOPIC for UPDATE_PEN_REQUEST_BATCH_STUDENT Event. :: {}", saga.getSagaId());
}
use of ca.bc.gov.educ.penreg.api.struct.v1.Saga in project EDUC-PEN-REG-BATCH-API by bcgov.
the class PenReqBatchNewPenOrchestrator method addPossibleMatchesToStudent.
private void addPossibleMatchesToStudent(final Event event, final Saga saga, final PenRequestBatchUserActionsSagaData penRequestBatchUserActionsSagaData) throws JsonProcessingException {
final String studentID;
// this scenario might occur during replay when message could not reach batch api from student-api and batch api retried the same flow.
if (event.getEventOutcome() == STUDENT_ALREADY_EXIST) {
studentID = event.getEventPayload();
} else {
final Student student = JsonUtil.getJsonObjectFromString(Student.class, event.getEventPayload());
studentID = student.getStudentID();
}
penRequestBatchUserActionsSagaData.setStudentID(studentID);
final SagaEvent eventStates = this.createEventState(saga, event.getEventType(), event.getEventOutcome(), event.getEventPayload());
// set current event as saga state.
saga.setSagaState(ADD_POSSIBLE_MATCH.toString());
// resave the updated saga data.
saga.setPayload(JsonUtil.getJsonStringFromObject(penRequestBatchUserActionsSagaData));
this.getSagaService().updateAttachedSagaWithEvents(saga, eventStates);
final var possibleMatches = penRequestBatchUserActionsSagaData.getMatchedStudentIDList().stream().map(matchedStudentID -> PossibleMatch.builder().createUser(penRequestBatchUserActionsSagaData.getCreateUser()).updateUser(penRequestBatchUserActionsSagaData.getUpdateUser()).studentID(studentID).matchedStudentID(matchedStudentID).matchReasonCode(TwinReasonCodes.PENCREATE.getCode()).build()).collect(Collectors.toList());
final Event nextEvent = Event.builder().sagaId(saga.getSagaId()).eventType(ADD_POSSIBLE_MATCH).replyTo(this.getTopicToSubscribe()).eventPayload(JsonUtil.getJsonStringFromObject(possibleMatches)).build();
this.postMessageToTopic(PEN_MATCH_API_TOPIC.toString(), nextEvent);
log.info("message sent to PEN_MATCH_API_TOPIC for ADD_POSSIBLE_MATCH Event.");
}
use of ca.bc.gov.educ.penreg.api.struct.v1.Saga in project EDUC-PEN-REG-BATCH-API by bcgov.
the class PenReqBatchNewPenOrchestrator method updateSagaData.
/**
* Update saga data.
*
* @param event the event
* @param penRequestBatchUserActionsSagaData the pen request batch user actions saga data
* @return the pen request batch user actions saga data
* @throws JsonProcessingException the json processing exception
*/
protected PenRequestBatchUserActionsSagaData updateSagaData(final Event event, final PenRequestBatchUserActionsSagaData penRequestBatchUserActionsSagaData) throws JsonProcessingException {
if (event.getEventType() == CREATE_STUDENT) {
if (event.getEventOutcome() == STUDENT_ALREADY_EXIST) {
penRequestBatchUserActionsSagaData.setStudentID(event.getEventPayload());
} else {
final Student student = JsonUtil.getJsonObjectFromString(Student.class, event.getEventPayload());
penRequestBatchUserActionsSagaData.setStudentID(student.getStudentID());
}
}
return penRequestBatchUserActionsSagaData;
}
use of ca.bc.gov.educ.penreg.api.struct.v1.Saga in project EDUC-PEN-REG-BATCH-API by bcgov.
the class PenReqBatchNewPenOrchestrator method updatePenRequestBatchStudent.
/**
* Update PEN Request Batch record and PRB Student record.
*
* @param event the event
* @param saga the saga
* @param penRequestBatchUserActionsSagaData the pen request batch student saga data
* @throws JsonProcessingException the json processing exception
*/
@Override
protected void updatePenRequestBatchStudent(final Event event, final Saga saga, final PenRequestBatchUserActionsSagaData penRequestBatchUserActionsSagaData) throws JsonProcessingException {
this.updateSagaData(event, penRequestBatchUserActionsSagaData);
saga.setSagaState(UPDATE_PEN_REQUEST_BATCH_STUDENT.toString());
saga.setPayload(JsonUtil.getJsonStringFromObject(penRequestBatchUserActionsSagaData));
final SagaEvent eventStates = this.createEventState(saga, event.getEventType(), event.getEventOutcome(), event.getEventPayload());
this.getSagaService().updateAttachedSagaWithEvents(saga, eventStates);
if (penRequestBatchUserActionsSagaData.getStudentID() == null) {
log.info("studentID in saga data is null for batch student id :: {} and saga id :: {}, setting it from event states table", penRequestBatchUserActionsSagaData.getPenRequestBatchStudentID(), saga.getSagaId());
val sagaEventOptional = this.getSagaService().findSagaEvent(saga, CREATE_STUDENT.toString(), 3);
if (sagaEventOptional.isPresent()) {
val sagaEvent = sagaEventOptional.get();
if (STUDENT_CREATED.toString().equals(sagaEvent.getSagaEventOutcome())) {
final Student student = JsonUtil.getJsonObjectFromString(Student.class, sagaEvent.getSagaEventResponse());
penRequestBatchUserActionsSagaData.setStudentID(student.getStudentID());
} else if (STUDENT_ALREADY_EXIST.toString().equals(sagaEvent.getSagaEventOutcome())) {
penRequestBatchUserActionsSagaData.setStudentID(sagaEvent.getSagaEventResponse());
} else {
throw new PenRegAPIRuntimeException("CREATE_STUDENT event with outcome not found in event states table for saga id :: " + saga.getSagaId());
}
} else {
throw new PenRegAPIRuntimeException("CREATE_STUDENT event not found in event states table for saga id :: " + saga.getSagaId());
}
}
final PenRequestBatchStudent prbStudent = this.createPRBStudent(event, penRequestBatchUserActionsSagaData);
final Event nextEvent = Event.builder().sagaId(saga.getSagaId()).eventType(UPDATE_PEN_REQUEST_BATCH_STUDENT).replyTo(this.getTopicToSubscribe()).eventPayload(JsonUtil.getJsonStringFromObject(prbStudent)).build();
this.postMessageToTopic(PEN_REQUEST_BATCH_API_TOPIC.toString(), nextEvent);
log.info("message sent to PEN_REQUEST_BATCH_API_TOPIC for UPDATE_PEN_REQUEST_BATCH_STUDENT Event. :: {}", saga.getSagaId());
}
Aggregations