diff --git a/api/pom.xml b/api/pom.xml index 44ec765a..29757966 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -215,6 +215,11 @@ + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.15.2 + diff --git a/api/src/main/java/ca/bc/gov/educ/api/trax/config/GradTraxConfig.java b/api/src/main/java/ca/bc/gov/educ/api/trax/config/GradTraxConfig.java index ecdfd868..008fa673 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/trax/config/GradTraxConfig.java +++ b/api/src/main/java/ca/bc/gov/educ/api/trax/config/GradTraxConfig.java @@ -13,6 +13,8 @@ import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.codec.json.Jackson2JsonDecoder; +import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.client.RestTemplate; @@ -44,9 +46,16 @@ public RestTemplate restTemplate(RestTemplateBuilder builder) { @Bean public WebClient webClient() { + //extend buffer to 50MB + Integer CODEC_50_MB_SIZE = 50 * 1024 * 1024; HttpClient client = HttpClient.create(); client.warmup().block(); - return WebClient.builder().build(); + return WebClient.builder().codecs(clientCodecConfigurer -> { + var codec = new Jackson2JsonDecoder(); + codec.setMaxInMemorySize(CODEC_50_MB_SIZE); + clientCodecConfigurer.customCodecs().register(codec); + clientCodecConfigurer.customCodecs().register(new Jackson2JsonEncoder()); + }).build(); } /** diff --git a/api/src/main/java/ca/bc/gov/educ/api/trax/controller/SchoolController.java b/api/src/main/java/ca/bc/gov/educ/api/trax/controller/SchoolController.java index 2fc236cf..bd559707 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/trax/controller/SchoolController.java +++ b/api/src/main/java/ca/bc/gov/educ/api/trax/controller/SchoolController.java @@ -87,4 +87,13 @@ public ResponseEntity> getSchoolsByParams( public ResponseEntity checkSchoolExists(@PathVariable String minCode) { return response.GET(schoolService.existsSchool(minCode)); } + + @GetMapping(EducGradTraxApiConstants.GET_SCHOOLS_BY_SCHOOL_CATEGORY_MAPPING) + @PreAuthorize(PermissionsConstants.READ_SCHOOL_DATA) + @Operation(summary = "Check school existence by Mincode", description = "Check school existence by Mincode", tags = { "School" }) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "204", description = "NO CONTENT")}) + public ResponseEntity> getSchoolsBySchoolCategory(@RequestParam(required = false) String schoolCategory, @RequestHeader(name="Authorization") String accessToken) { + return response.GET(schoolService.getSchoolsBySchoolCategory(schoolCategory, accessToken.replace(BEARER, ""))); + } } diff --git a/api/src/main/java/ca/bc/gov/educ/api/trax/model/entity/TraxUpdatedPubEvent.java b/api/src/main/java/ca/bc/gov/educ/api/trax/model/entity/TraxUpdatedPubEvent.java index 48b5d0b0..10db141e 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/trax/model/entity/TraxUpdatedPubEvent.java +++ b/api/src/main/java/ca/bc/gov/educ/api/trax/model/entity/TraxUpdatedPubEvent.java @@ -1,16 +1,17 @@ package ca.bc.gov.educ.api.trax.model.entity; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.PastOrPresent; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; -import jakarta.persistence.*; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.PastOrPresent; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.UUID; @@ -91,7 +92,12 @@ public String getEventPayload() { * @param eventPayload the event payload */ public void setEventPayload(String eventPayload) { - setEventPayloadBytes(eventPayload.getBytes(StandardCharsets.UTF_8)); + setEventPayloadBytes(nullSafeEventPayload(eventPayload).getBytes(StandardCharsets.UTF_8)); + } + + private static String nullSafeEventPayload(String eventPayload) { + if(StringUtils.isBlank(eventPayload)) eventPayload = "{}"; + return eventPayload; } /** @@ -110,7 +116,7 @@ public static class TraxUpdatedPubEventBuilder { * @return the student event . student event builder */ public TraxUpdatedPubEventBuilder eventPayload(String eventPayload) { - this.eventPayloadBytes = eventPayload.getBytes(StandardCharsets.UTF_8); + this.eventPayloadBytes = nullSafeEventPayload(eventPayload).getBytes(StandardCharsets.UTF_8); return this; } } diff --git a/api/src/main/java/ca/bc/gov/educ/api/trax/service/SchoolService.java b/api/src/main/java/ca/bc/gov/educ/api/trax/service/SchoolService.java index e5b13b19..ed2a268e 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/trax/service/SchoolService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/trax/service/SchoolService.java @@ -140,6 +140,21 @@ public boolean existsSchool(String minCode) { return schoolRepository.countTabSchools(minCode) > 0L; } + public List getSchoolsBySchoolCategory(String schoolCategoryCode, String accessToken) { + List result = new ArrayList<>(); + if(StringUtils.isBlank(schoolCategoryCode)) { + return adaptSchools(getCommonSchools(accessToken)); + } else { + List schools = getCommonSchools(accessToken); + for (CommonSchool s : schools) { + if (StringUtils.equalsIgnoreCase(schoolCategoryCode, s.getSchoolCategoryCode())) { + result.add(adaptSchool(s)); + } + } + } + return result; + } + public CommonSchool getCommonSchool(String accessToken, String mincode) { if(StringUtils.isBlank(mincode)) { return null; @@ -178,6 +193,22 @@ public List getCommonSchools(String accessToken) { } } + private School adaptSchool(CommonSchool commonSchool) { + School school = new School(); + school.setMinCode(commonSchool.getDistNo()+commonSchool.getSchlNo()); + school.setSchoolName(commonSchool.getSchoolName()); + school.setSchoolCategory(commonSchool.getSchoolCategoryCode()); + return school; + } + + private List adaptSchools(List commonSchools) { + List result = new ArrayList<>(); + for(CommonSchool sch: commonSchools) { + result.add(adaptSchool(sch)); + } + return result; + } + private void adaptSchool(School school, CommonSchool commonSchool) { if(commonSchool == null) { return; diff --git a/api/src/main/java/ca/bc/gov/educ/api/trax/util/EducGradTraxApiConstants.java b/api/src/main/java/ca/bc/gov/educ/api/trax/util/EducGradTraxApiConstants.java index df2e5865..8ac0ae98 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/trax/util/EducGradTraxApiConstants.java +++ b/api/src/main/java/ca/bc/gov/educ/api/trax/util/EducGradTraxApiConstants.java @@ -54,6 +54,7 @@ public class EducGradTraxApiConstants { public static final String GET_DISTRICT_BY_DISTNO_MAPPING = "/{distCode}"; public static final String GET_DISTRICTS_BY_SCHOOL_CATEGORY_MAPPING = "/schoolCategories"; + public static final String GET_SCHOOLS_BY_SCHOOL_CATEGORY_MAPPING = "/schoolCategories"; public static final String GET_TRANSCRIPT_DEMOG_BY_PEN_MAPPING = "/tran-demog/{pen}"; public static final String GET_TRANSCRIPT_COURSE_BY_PEN_MAPPING = "/tran-courses/{pen}"; diff --git a/api/src/test/java/ca/bc/gov/educ/api/trax/controller/SchoolControllerTest.java b/api/src/test/java/ca/bc/gov/educ/api/trax/controller/SchoolControllerTest.java index 9b28eef5..e13f2f37 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/trax/controller/SchoolControllerTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/trax/controller/SchoolControllerTest.java @@ -90,6 +90,16 @@ public void testGetSchoolsByParams() { Mockito.verify(schoolService).getSchoolsByParams("1234567", "123", null, "accessToken"); } + @Test + public void testGetSchoolsBySchoolCategoryCode() { + final School school = new School(); + school.setMinCode("1234567"); + school.setSchoolName("Test School"); + Mockito.when(schoolService.getSchoolsBySchoolCategory("01", "accessToken")).thenReturn(Arrays.asList(school)); + schoolController.getSchoolsBySchoolCategory("01", "accessToken"); + Mockito.verify(schoolService).getSchoolsBySchoolCategory("01", "accessToken"); + } + @Test public void testCheckSchoolExists() { Mockito.when(schoolService.existsSchool("1234567")).thenReturn(true); diff --git a/api/src/test/java/ca/bc/gov/educ/api/trax/service/SchoolServiceTest.java b/api/src/test/java/ca/bc/gov/educ/api/trax/service/SchoolServiceTest.java index 5795446d..4a79f385 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/trax/service/SchoolServiceTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/trax/service/SchoolServiceTest.java @@ -364,6 +364,19 @@ void testGetSchoolsByParams() { assertThat(result).isNotNull(); } + + @Test + void testGetSchoolsBySchoolCategoryCode() { + mockCommonSchools(); + var result = schoolService.getSchoolsBySchoolCategory("02", "accessToken"); + assertThat(result).isNotNull().isNotEmpty(); + result = schoolService.getSchoolsBySchoolCategory("01", "accessToken"); + assertThat(result).isNotNull().isEmpty(); + result = schoolService.getSchoolsBySchoolCategory("", "accessToken"); + assertThat(result).isNotNull().isNotEmpty(); + + } + @Test void testGetSchoolsByParams_params() { // School @@ -468,4 +481,18 @@ void mockCommonSchool(String minCode, String schoolName) { Mockito.when(this.responseMock.bodyToMono(new ParameterizedTypeReference>() { })).thenReturn(Mono.just(List.of(commonSchool))); } + + void mockCommonSchools() { + CommonSchool commonSchool = new CommonSchool(); + commonSchool.setSchlNo("1234567"); + commonSchool.setSchoolName("Test School"); + commonSchool.setSchoolCategoryCode("02"); + + Mockito.when(this.webClient.get()).thenReturn(this.requestHeadersUriMock); + Mockito.when(this.requestHeadersUriMock.uri(constants.getAllSchoolSchoolApiUrl())).thenReturn(this.requestHeadersMock); + Mockito.when(this.requestHeadersMock.headers(any(Consumer.class))).thenReturn(this.requestHeadersMock); + Mockito.when(this.requestHeadersMock.retrieve()).thenReturn(this.responseMock); + Mockito.when(this.responseMock.bodyToMono(new ParameterizedTypeReference>() { + })).thenReturn(Mono.just(List.of(commonSchool))); + } }