Skip to content

Commit

Permalink
Created messaging subscribers for Institute contact events (#325)
Browse files Browse the repository at this point in the history
* Initial commit of Event handling for Institute Events

* Replace logger with slf4j

* Added model and services for contact updates

* Added handler services for institute contact events

* Updating events

* Minor change

* Flyway to expand update and create user in replication table to be in line with edx, institute.

* Flyway to expand update and create user in replication table to be in line with edx, institute.

* Added unit testing.

* Removed TODOs

* Added another test.

* Bumping test coverage again.

* Addressing maintainability issues.

---------

Co-authored-by: chris.ditcher <[email protected]>
  • Loading branch information
cditcher and chris.ditcher authored May 29, 2024
1 parent d297cab commit 021f044
Show file tree
Hide file tree
Showing 48 changed files with 975 additions and 71 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package ca.bc.gov.educ.api.trax.choreographer;

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.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;
Expand Down Expand Up @@ -41,25 +46,68 @@ 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:
log.warn("Silently ignoring event: {}", event);
break;
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);
}
} 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,36 @@
package ca.bc.gov.educ.api.trax.model.dto;

import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@Builder
@EqualsAndHashCode(callSuper = true)
public class AuthorityContact extends BaseModel {

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,38 @@
package ca.bc.gov.educ.api.trax.model.dto;

import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@Builder
@EqualsAndHashCode(callSuper = true)
public class DistrictContact extends BaseModel {

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;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package ca.bc.gov.educ.api.trax.model.dto;

import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@Builder
@EqualsAndHashCode(callSuper = true)
public class SchoolContact extends BaseModel {

private String schoolContactId;

private String schoolId;

private String schoolContactTypeCode;

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;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ca.bc.gov.educ.api.trax.service;

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.entity.Event;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class AuthorityContactCreatedService extends EventBaseService<AuthorityContact> {

@Override
public void processEvent(final AuthorityContact districtContact, Event event) {
log.debug("Processing Authority Contact Created");
// process the event here as per https://eccbc.atlassian.net/browse/GRAD2-2648
this.updateEvent(event);
}

@Override
public String getEventType() {
return EventType.CREATE_AUTHORITY_CONTACT.toString();
}

}
Loading

0 comments on commit 021f044

Please sign in to comment.