Skip to content

Commit

Permalink
Merge pull request #328 from bcgov/grad-release
Browse files Browse the repository at this point in the history
Grad release 1.20.0
  • Loading branch information
githubmamatha authored Jun 4, 2024
2 parents 23562a3 + 68cd916 commit 5f4eca5
Show file tree
Hide file tree
Showing 49 changed files with 1,008 additions and 71 deletions.
2 changes: 1 addition & 1 deletion api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>ca.bc.gov.educ</groupId>
<artifactId>educ-grad-trax-api</artifactId>
<version>1.8.54</version>
<version>1.8.55</version>
<name>educ-grad-trax-api</name>
<description>Ministry of Education GRAD TRAX API</description>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
package ca.bc.gov.educ.api.trax.choreographer;

import ca.bc.gov.educ.api.trax.constant.EventStatus;
import ca.bc.gov.educ.api.trax.constant.EventType;
import ca.bc.gov.educ.api.trax.model.dto.AuthorityContact;
import ca.bc.gov.educ.api.trax.model.dto.DistrictContact;
import ca.bc.gov.educ.api.trax.model.dto.GradStatusEventPayloadDTO;
import ca.bc.gov.educ.api.trax.model.dto.SchoolContact;
import ca.bc.gov.educ.api.trax.model.entity.Event;
import ca.bc.gov.educ.api.trax.repository.EventRepository;
import ca.bc.gov.educ.api.trax.service.EventService;
import ca.bc.gov.educ.api.trax.util.JsonUtil;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.jboss.threads.EnhancedQueueExecutor;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -29,8 +37,11 @@ public class ChoreographEventHandler {
private final Executor eventExecutor;
private final Map<String, EventService> eventServiceMap;

public ChoreographEventHandler(final List<EventService> eventServices) {
private final EventRepository eventRepository;

public ChoreographEventHandler(final List<EventService> eventServices, final EventRepository eventRepository) {
this.eventServiceMap = new HashMap<>();
this.eventRepository = eventRepository;
this.eventExecutor = new EnhancedQueueExecutor.Builder()
.setThreadFactory(new ThreadFactoryBuilder().setNameFormat("event-executor-%d").build())
.setCorePoolSize(10).setMaximumPoolSize(20).setKeepAliveTime(Duration.ofSeconds(60)).build();
Expand All @@ -41,25 +52,76 @@ public void handleEvent(@NonNull final Event event) {
//only one thread will process all the request. since RDB won't handle concurrent requests.
this.eventExecutor.execute(() -> {
try {
switch (event.getEventType()) {
case "GRAD_STUDENT_GRADUATED":
switch (EventType.valueOf(event.getEventType())) {
case GRAD_STUDENT_GRADUATED -> {
log.debug("Processing GRAD_STUDENT_GRADUATED event record :: {} ", event);
final GradStatusEventPayloadDTO eventPayload1 = JsonUtil.getJsonObjectFromString(GradStatusEventPayloadDTO.class, event.getEventPayload());
this.eventServiceMap.get(GRAD_STUDENT_GRADUATED.toString()).processEvent(eventPayload1, event);
break;
case "GRAD_STUDENT_UPDATED":
val studentGraduated = JsonUtil.getJsonObjectFromString(GradStatusEventPayloadDTO.class, event.getEventPayload());
this.eventServiceMap.get(GRAD_STUDENT_GRADUATED.toString()).processEvent(studentGraduated, event);
}
case GRAD_STUDENT_UPDATED -> {
log.debug("Processing GRAD_STUDENT_UPDATED event record :: {} ", event);
final GradStatusEventPayloadDTO eventPayload2 = JsonUtil.getJsonObjectFromString(GradStatusEventPayloadDTO.class, event.getEventPayload());
this.eventServiceMap.get(GRAD_STUDENT_UPDATED.toString()).processEvent(eventPayload2, event);
break;
case "GRAD_STUDENT_UNDO_COMPLETION":
val studentUpdated = JsonUtil.getJsonObjectFromString(GradStatusEventPayloadDTO.class, event.getEventPayload());
this.eventServiceMap.get(GRAD_STUDENT_UPDATED.toString()).processEvent(studentUpdated, event);
}
case GRAD_STUDENT_UNDO_COMPLETION -> {
log.debug("Processing GRAD_STUDENT_UNDO_COMPLETION event record :: {} ", event);
final GradStatusEventPayloadDTO eventPayload3 = JsonUtil.getJsonObjectFromString(GradStatusEventPayloadDTO.class, event.getEventPayload());
this.eventServiceMap.get(GRAD_STUDENT_UNDO_COMPLETION.toString()).processEvent(eventPayload3, event);
break;
default:
val studentUndoCompletion = JsonUtil.getJsonObjectFromString(GradStatusEventPayloadDTO.class, event.getEventPayload());
this.eventServiceMap.get(GRAD_STUDENT_UNDO_COMPLETION.toString()).processEvent(studentUndoCompletion, event);
}
case CREATE_SCHOOL_CONTACT -> {
log.debug("Processing {} event record :: {} ", event.getEventType(), event);
val schoolContactCreated = JsonUtil.getJsonObjectFromString(SchoolContact.class, event.getEventPayload());
this.eventServiceMap.get(CREATE_SCHOOL_CONTACT.toString()).processEvent(schoolContactCreated, event);
}
case UPDATE_SCHOOL_CONTACT -> {
log.debug("Processing {} event record :: {} ", event.getEventType(), event);
val schoolContactUpdated = JsonUtil.getJsonObjectFromString(SchoolContact.class, event.getEventPayload());
this.eventServiceMap.get(UPDATE_SCHOOL_CONTACT.toString()).processEvent(schoolContactUpdated, event);
}
case DELETE_SCHOOL_CONTACT -> {
log.debug("Processing {} event record :: {} ", event.getEventType(), event);
val schoolContactDeleted = JsonUtil.getJsonObjectFromString(SchoolContact.class, event.getEventPayload());
this.eventServiceMap.get(DELETE_SCHOOL_CONTACT.toString()).processEvent(schoolContactDeleted, event);
}
case CREATE_AUTHORITY_CONTACT -> {
log.debug("Processing {} event record :: {} ", event.getEventType(), event);
val authorityContactCreated = JsonUtil.getJsonObjectFromString(AuthorityContact.class, event.getEventPayload());
this.eventServiceMap.get(CREATE_AUTHORITY_CONTACT.toString()).processEvent(authorityContactCreated, event);
}
case UPDATE_AUTHORITY_CONTACT -> {
log.debug("Processing {} event record :: {} ", event.getEventType(), event);
val authorityContactUpdated = JsonUtil.getJsonObjectFromString(AuthorityContact.class, event.getEventPayload());
this.eventServiceMap.get(UPDATE_AUTHORITY_CONTACT.toString()).processEvent(authorityContactUpdated, event);
}
case DELETE_AUTHORITY_CONTACT -> {
log.debug("Processing {} event record :: {} ", event.getEventType(), event);
val authorityContactDeleted = JsonUtil.getJsonObjectFromString(AuthorityContact.class, event.getEventPayload());
this.eventServiceMap.get(DELETE_AUTHORITY_CONTACT.toString()).processEvent(authorityContactDeleted, event);
}
case CREATE_DISTRICT_CONTACT -> {
log.debug("Processing {} event record :: {} ", event.getEventType(), event);
val districtContactCreated = JsonUtil.getJsonObjectFromString(DistrictContact.class, event.getEventPayload());
this.eventServiceMap.get(CREATE_DISTRICT_CONTACT.toString()).processEvent(districtContactCreated, event);
}
case UPDATE_DISTRICT_CONTACT -> {
log.debug("Processing {} event record :: {} ", event.getEventType(), event);
val districtContactUpdated = JsonUtil.getJsonObjectFromString(DistrictContact.class, event.getEventPayload());
this.eventServiceMap.get(UPDATE_DISTRICT_CONTACT.toString()).processEvent(districtContactUpdated, event);
}
case DELETE_DISTRICT_CONTACT -> {
log.debug("Processing {} event record :: {} ", event.getEventType(), event);
val districtContactDeleted = JsonUtil.getJsonObjectFromString(DistrictContact.class, event.getEventPayload());
this.eventServiceMap.get(DELETE_DISTRICT_CONTACT.toString()).processEvent(districtContactDeleted, event);
}
default -> {
log.warn("Silently ignoring event: {}", event);
this.eventRepository.findByEventId(event.getEventId()).ifPresent(existingEvent -> {
existingEvent.setEventStatus(EventStatus.PROCESSED.toString());
existingEvent.setUpdateDate(LocalDateTime.now());
this.eventRepository.save(existingEvent);
});
break;
}
}
} catch (final Exception exception) {
log.error("Exception while processing event :: {}", event, exception);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package ca.bc.gov.educ.api.trax.config;

import ca.bc.gov.educ.api.trax.exception.BusinessException;
import ca.bc.gov.educ.api.trax.util.ApiResponseMessage.MessageTypeEnum;
import ca.bc.gov.educ.api.trax.exception.GradBusinessRuleException;
import ca.bc.gov.educ.api.trax.util.ApiResponseMessage.MessageTypeEnum;
import ca.bc.gov.educ.api.trax.util.ApiResponseModel;
import ca.bc.gov.educ.api.trax.util.GradValidation;
import org.hibernate.dialect.lock.OptimisticEntityLockException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,45 @@ public enum EventOutcome {
* Student updated event outcome.
*/
TRAX_STUDENT_MASTER_UPDATED,

/**
* Institute API even outcomes
*/
SCHOOL_UPDATED,

SCHOOL_CREATED,

DISTRICT_UPDATED,

DISTRICT_CREATED,

AUTHORITY_UPDATED,

AUTHORITY_CREATED,

AUTHORITY_FOUND,

AUTHORITY_NOT_FOUND,

SCHOOL_NOT_FOUND,

SCHOOL_MOVED,

SCHOOL_CONTACT_CREATED,

SCHOOL_CONTACT_UPDATED,

SCHOOL_CONTACT_DELETED,

DISTRICT_CONTACT_CREATED,

DISTRICT_CONTACT_UPDATED,

DISTRICT_CONTACT_DELETED,

AUTHORITY_CONTACT_CREATED,

AUTHORITY_CONTACT_UPDATED,

AUTHORITY_CONTACT_DELETED
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,46 @@ public enum EventType {
XPROGRAM,
ASSESSMENT,
COURSE,
FI10ADD
FI10ADD,

/**
* INSTITUTE API EVENT TYPES
*/
UPDATE_SCHOOL,

CREATE_SCHOOL,

UPDATE_DISTRICT,

CREATE_DISTRICT,

UPDATE_AUTHORITY,

CREATE_AUTHORITY,

GET_AUTHORITY,

GET_PAGINATED_SCHOOLS,

GET_PAGINATED_AUTHORITIES,

MOVE_SCHOOL,

CREATE_SCHOOL_CONTACT,

UPDATE_SCHOOL_CONTACT,

DELETE_SCHOOL_CONTACT,

CREATE_DISTRICT_CONTACT,

UPDATE_DISTRICT_CONTACT,

DELETE_DISTRICT_CONTACT,

CREATE_AUTHORITY_CONTACT,

UPDATE_AUTHORITY_CONTACT,

DELETE_AUTHORITY_CONTACT
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public enum Topics {
/**
* TraxUpdate events topic.
*/
TRAX_UPDATE_EVENT_TOPIC
TRAX_UPDATE_EVENT_TOPIC,
INSTITUTE_EVENTS_TOPIC

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ private void initializeStreamTopicMap() {
final List<String> traxStatusEventsTopics = new ArrayList<>();
traxStatusEventsTopics.add(Topics.TRAX_UPDATE_EVENT_TOPIC.name());
this.streamTopicsMap.put(EducGradTraxApiConstants.TRAX_STREAM_NAME, traxStatusEventsTopics);

final List<String> instituteEventsTopics = new ArrayList<>();
instituteEventsTopics.add(Topics.INSTITUTE_EVENTS_TOPIC.name());
this.streamTopicsMap.put(EducGradTraxApiConstants.INSTITUTE_STREAM_NAME, instituteEventsTopics);

}

@PostConstruct
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package ca.bc.gov.educ.api.trax.model.dto;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;

@Data
@EqualsAndHashCode(callSuper = true)
@JsonIgnoreProperties(ignoreUnknown = true)
public class AuthorityContact extends BaseModel implements Serializable {

/**
* The constant serialVersionUID.
*/
private static final long serialVersionUID = 1L;

private String authorityContactId;

private String independentAuthorityId;

private String authorityContactTypeCode;

private String phoneNumber;

private String phoneExtension;

private String alternatePhoneNumber;

private String alternatePhoneExtension;

private String email;

private String firstName;

private String lastName;

private String effectiveDate;

private String expiryDate;

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

import lombok.Data;

import java.sql.Date;

@Data
public class BaseModel {
private String createUser;
private Date createDate;
private String createDate;
private String updateUser;
private Date updateDate;
private String updateDate;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package ca.bc.gov.educ.api.trax.model.dto;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;

@Data
@EqualsAndHashCode(callSuper = true)
@JsonIgnoreProperties(ignoreUnknown = true)
public class DistrictContact extends BaseModel implements Serializable {

/**
* The constant serialVersionUID.
*/
private static final long serialVersionUID = 1L;

private String districtContactId;

private String districtId;

private String districtContactTypeCode;

private String phoneNumber;

private String jobTitle;

private String phoneExtension;

private String alternatePhoneNumber;

private String alternatePhoneExtension;

private String email;

private String firstName;

private String lastName;

private String effectiveDate;

private String expiryDate;

}
Loading

0 comments on commit 5f4eca5

Please sign in to comment.