Skip to content

Commit

Permalink
Merge pull request #27 from bcgov/feature/schoolCodes
Browse files Browse the repository at this point in the history
Added pull of all school funding group codes
  • Loading branch information
arcshiftsolutions authored Mar 4, 2024
2 parents c4ea875 + 8a0623c commit cc15967
Show file tree
Hide file tree
Showing 10 changed files with 220 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,25 @@
import ca.bc.gov.educ.api.school.exception.EntityNotFoundException;
import ca.bc.gov.educ.api.school.exception.InvalidPayloadException;
import ca.bc.gov.educ.api.school.exception.errors.ApiError;
import ca.bc.gov.educ.api.school.mapper.LocalDateTimeMapper;
import ca.bc.gov.educ.api.school.mapper.v1.FedProvCodeMapper;
import ca.bc.gov.educ.api.school.mapper.v1.SchoolFundingGroupMapper;
import ca.bc.gov.educ.api.school.mapper.v1.SchoolMapper;
import ca.bc.gov.educ.api.school.service.v1.FedProvCodeService;
import ca.bc.gov.educ.api.school.service.v1.PenCoordinatorService;
import ca.bc.gov.educ.api.school.service.v1.SchoolService;
import ca.bc.gov.educ.api.school.struct.v1.FedProvSchoolCode;
import ca.bc.gov.educ.api.school.struct.v1.PenCoordinator;
import ca.bc.gov.educ.api.school.struct.v1.School;
import ca.bc.gov.educ.api.school.struct.v1.SchoolFundingGroup;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RestController;

import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
Expand All @@ -45,6 +44,7 @@ public class SchoolAPIController implements SchoolAPIEndpoint {
* The constant mapper.
*/
private static final SchoolMapper mapper = SchoolMapper.mapper;
private static final SchoolFundingGroupMapper fundingMapper = SchoolFundingGroupMapper.mapper;
private static final FedProvCodeMapper fedProvCodeMapper = FedProvCodeMapper.mapper;
@Getter(AccessLevel.PRIVATE)
private final SchoolService service;
Expand All @@ -70,6 +70,11 @@ public School getSchoolByMinCode(String mincode) {
return mapper.toStructure(getService().retrieveSchoolByMincode(mincode));
}

@Override
public List<SchoolFundingGroup> getAllSchoolFundingGroups() {
return getService().retrieveAllFundingGroups().stream().map(fundingMapper::toStructure).toList();
}

@Override
public List<School> getAllSchools() {
return getService().retrieveAllSchoolStructs();
Expand All @@ -92,7 +97,7 @@ public List<PenCoordinator> getPenCoordinators() {

@Override
public List<FedProvSchoolCode> getFedProvCodes() {
return this.fedProvCodeService.getFedProvCodes("NOM_SCHL").stream().filter(Objects::nonNull).map(fedProvCodeMapper::toStruct).collect(Collectors.toList());
return this.fedProvCodeService.getFedProvCodes("NOM_SCHL").stream().filter(Objects::nonNull).map(fedProvCodeMapper::toStruct).toList();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import ca.bc.gov.educ.api.school.struct.v1.FedProvSchoolCode;
import ca.bc.gov.educ.api.school.struct.v1.PenCoordinator;
import ca.bc.gov.educ.api.school.struct.v1.School;
import ca.bc.gov.educ.api.school.struct.v1.SchoolFundingGroup;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.media.Schema;
Expand All @@ -15,6 +16,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
/**
* The interface School api endpoint.
Expand All @@ -37,6 +39,14 @@ public interface SchoolAPIEndpoint {
@Schema(name = "School", implementation = School.class)
School getSchoolByMinCode(@PathVariable("minCode") String mincode);

@GetMapping("/fundingGroups")
@PreAuthorize("hasAuthority('SCOPE_READ_SCHOOL')")
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "NOT FOUND")})
@Transactional(readOnly = true)
@Tag(name = "Endpoint to get All School Funding Groups.", description = "Endpoint to get All School Funding Groups.")
@Schema(name = "School", implementation = School.class)
List<SchoolFundingGroup> getAllSchoolFundingGroups();

/**
* Gets all schools.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ca.bc.gov.educ.api.school.mapper.v1;

import ca.bc.gov.educ.api.school.mapper.LocalDateTimeMapper;
import ca.bc.gov.educ.api.school.mapper.StringMapper;
import ca.bc.gov.educ.api.school.model.v1.SchoolFundingGroupEntity;
import ca.bc.gov.educ.api.school.struct.v1.SchoolFundingGroup;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper(uses = {LocalDateTimeMapper.class, StringMapper.class})
@SuppressWarnings("squid:S1214")
public interface SchoolFundingGroupMapper {

SchoolFundingGroupMapper mapper = Mappers.getMapper(SchoolFundingGroupMapper.class);

@Mapping(target = "distNo", source = "schoolFundingGroupEntity.schoolFundingGroupID.distNo")
@Mapping(target = "schlNo", source = "schoolFundingGroupEntity.schoolFundingGroupID.schlNo")
@Mapping(target = "fundingGroupCode", source = "schoolFundingGroupEntity.schoolFundingGroupID.fundingGroupCode")
@Mapping(target = "fundingGroupSubCode", source = "schoolFundingGroupEntity.schoolFundingGroupID.fundingGroupSubCode")
@Mapping(target = "mincode", expression = "java(org.apache.commons.lang3.StringUtils.trimToEmpty(schoolFundingGroupEntity.getSchoolFundingGroupID().getDistNo()).concat(org.apache.commons.lang3.StringUtils.trimToEmpty(schoolFundingGroupEntity.getSchoolFundingGroupID().getSchlNo())))")
SchoolFundingGroup toStructure(SchoolFundingGroupEntity schoolFundingGroupEntity);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package ca.bc.gov.educ.api.school.model.v1;

import jakarta.persistence.Column;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* The type School entity.
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "SCHOOL_FUNDING_MASTER")
public class SchoolFundingGroupEntity {
@EmbeddedId
private SchoolFundingGroupID schoolFundingGroupID;

@Column(name = "FORM_ID")
private String formID;

@Column(name = "ARCHIVE_STATUS")
private String archiveStatus;

@Column(name = "CREATE_DATE")
private String createDate;

@Column(name = "CREATE_TIME")
private String createTime;

@Column(name = "CREATE_USERNAME")
private String createUsername;

@Column(name = "EDIT_DATE")
private String editDate;

@Column(name = "EDIT_TIME")
private String editTime;

@Column(name = "EDIT_USERNAME")
private String editUsername;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ca.bc.gov.educ.api.school.model.v1;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Embeddable
public class SchoolFundingGroupID implements Serializable {

@Column(name = "DISTNO", nullable = false, length = 3)
protected String distNo;

@Column(name = "SCHLNO", nullable = false, length = 5)
protected String schlNo;

@Column(name = "FUNDING_GROUP_CODE")
private String fundingGroupCode;

@Column(name = "FUNDING_GROUP_SUBCODE")
private String fundingGroupSubCode;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ca.bc.gov.educ.api.school.repository.v1;

import ca.bc.gov.educ.api.school.model.v1.Mincode;
import ca.bc.gov.educ.api.school.model.v1.SchoolFundingGroupEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface SchoolFundingGroupRepository extends JpaRepository<SchoolFundingGroupEntity, Mincode> {

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@
import ca.bc.gov.educ.api.school.mapper.v1.SchoolMapper;
import ca.bc.gov.educ.api.school.model.v1.Mincode;
import ca.bc.gov.educ.api.school.model.v1.SchoolEntity;
import ca.bc.gov.educ.api.school.model.v1.SchoolFundingGroupEntity;
import ca.bc.gov.educ.api.school.repository.v1.SchoolFundingGroupRepository;
import ca.bc.gov.educ.api.school.repository.v1.SchoolRepository;
import ca.bc.gov.educ.api.school.struct.v1.School;
import jakarta.annotation.PostConstruct;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
Expand All @@ -15,7 +18,6 @@
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import jakarta.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
Expand All @@ -41,17 +43,21 @@ public class SchoolService {
*/
@Getter(PRIVATE)
private final SchoolRepository schoolRepository;
@Getter(PRIVATE)
private final SchoolFundingGroupRepository schoolFundingGroupRepository;
private List<School> schools = new ArrayList<>();
private Map<Mincode, SchoolEntity> mincodeSchoolEntityMap;

/**
* Instantiates a new School service.
*
* @param schoolRepository School repository
* @param schoolRepository School repository
* @param schoolFundingGroupRepository
*/
@Autowired
public SchoolService(SchoolRepository schoolRepository) {
public SchoolService(SchoolRepository schoolRepository, SchoolFundingGroupRepository schoolFundingGroupRepository) {
this.schoolRepository = schoolRepository;
this.schoolFundingGroupRepository = schoolFundingGroupRepository;
}

/**
Expand All @@ -74,6 +80,10 @@ public SchoolEntity retrieveSchoolByMincode(String mincode) {
}
}

public List<SchoolFundingGroupEntity> retrieveAllFundingGroups() {
return this.schoolFundingGroupRepository.findAll();
}

/**
* Retrieve all schools list.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package ca.bc.gov.educ.api.school.struct.v1;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* The type School entity.
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class SchoolFundingGroup {

@Size(max = 3)
@NotNull(message = "distNo can not be null.")
private String distNo;

@Size(max = 5)
@NotNull(message = "schlNo can not be null.")
private String schlNo;

private String mincode;

private String fundingGroupCode;

private String fundingGroupSubCode;

private String formID;

private String archiveStatus;

private String createDate;

private String createTime;

private String createUsername;

private String editDate;

private String editTime;

private String editUsername;

}
1 change: 1 addition & 0 deletions api/src/main/resources/db/migration/V1.0.3__SCHOOL_API.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CREATE SYNONYM SCHOOL_FUNDING_MASTER FOR SCHOOL_FUNDING_MASTER@SPMLINK.WORLD;
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@
import ca.bc.gov.educ.api.school.mapper.v1.PenCoordinatorMapper;
import ca.bc.gov.educ.api.school.model.v1.Mincode;
import ca.bc.gov.educ.api.school.model.v1.SchoolEntity;
import ca.bc.gov.educ.api.school.model.v1.SchoolFundingGroupEntity;
import ca.bc.gov.educ.api.school.model.v1.SchoolFundingGroupID;
import ca.bc.gov.educ.api.school.repository.v1.FedProvCodeRepository;
import ca.bc.gov.educ.api.school.repository.v1.PenCoordinatorRepository;
import ca.bc.gov.educ.api.school.repository.v1.SchoolFundingGroupRepository;
import ca.bc.gov.educ.api.school.repository.v1.SchoolRepository;
import ca.bc.gov.educ.api.school.service.v1.FedProvCodeService;
import ca.bc.gov.educ.api.school.service.v1.SchoolService;
Expand Down Expand Up @@ -69,6 +72,9 @@ public class SchoolAPIControllerTest {
@Autowired
SchoolRepository schoolRepository;

@Autowired
SchoolFundingGroupRepository schoolFundingGroupRepository;

@Autowired
FedProvCodeRepository fedProvCodeRepository;

Expand Down Expand Up @@ -123,6 +129,22 @@ public void testGetAllSchool_GivenNoInput_ShouldReturnStatusOK() throws Exceptio
this.mockMvc.perform(get("/api/v1/schools").with(mockAuthority)).andDo(print()).andExpect(status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$").isArray()).andExpect(jsonPath("$", hasSize(1)));
}

@Test
public void testGetAllSchoolFundingGroups_GivenNoInput_ShouldReturnStatusOK() throws Exception {
schoolService.reloadCache();
SchoolFundingGroupEntity entity = new SchoolFundingGroupEntity();
SchoolFundingGroupID groupID = new SchoolFundingGroupID();
groupID.setDistNo("035");
groupID.setSchlNo("12345");
groupID.setFundingGroupCode("02");
groupID.setFundingGroupSubCode("05");
entity.setSchoolFundingGroupID(groupID);
schoolFundingGroupRepository.save(entity);
GrantedAuthority grantedAuthority = () -> "SCOPE_READ_SCHOOL";
var mockAuthority = oidcLogin().authorities(grantedAuthority);
this.mockMvc.perform(get("/api/v1/schools/fundingGroups").with(mockAuthority)).andDo(print()).andExpect(status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$").isArray()).andExpect(jsonPath("$", hasSize(1)));
}

@Test
public void testGetSchool_GivenNotExistMincode_ShouldReturnStatusNotFound() throws Exception {
GrantedAuthority grantedAuthority = () -> "SCOPE_READ_SCHOOL";
Expand Down

0 comments on commit cc15967

Please sign in to comment.