Skip to content

Commit

Permalink
Splitting the update and create logic in the project service to reduc…
Browse files Browse the repository at this point in the history
…e complexity (#380)
  • Loading branch information
agordon-vivid authored Dec 19, 2024
1 parent 648f0e7 commit 774cdc1
Show file tree
Hide file tree
Showing 6 changed files with 381 additions and 260 deletions.
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ services:
command: [
"liquibase",
"--url=jdbc:postgresql://wfprev-postgres:5432/wfprev",
"--changelog-file=db/main-changelog.json",
"--changelog-file=db/wfprev-changelog.json",
"--username=wfprev",
"--password=${POSTGRES_PASSWORD}",
"update"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,5 @@
package ca.bc.gov.nrs.wfprev.controllers;

import java.util.Date;
import java.util.UUID;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.hateoas.CollectionModel;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import ca.bc.gov.nrs.common.wfone.rest.resource.HeaderConstants;
import ca.bc.gov.nrs.common.wfone.rest.resource.MessageListRsrc;
import ca.bc.gov.nrs.wfone.common.service.api.ServiceException;
Expand All @@ -23,7 +8,6 @@
import ca.bc.gov.nrs.wfprev.services.ProjectService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.extensions.Extension;
import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
Expand All @@ -34,6 +18,19 @@
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.hateoas.CollectionModel;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

@RestController
@Slf4j
Expand Down Expand Up @@ -118,7 +115,7 @@ public ResponseEntity<ProjectModel> createProject(@RequestBody ProjectModel reso
resource.setUpdateUser(getWebAdeAuthentication().getUserId());
resource.setRevisionCount(0);

ProjectModel newResource = projectService.createOrUpdateProject(resource);
ProjectModel newResource = projectService.createProject(resource);
response = newResource == null ? badRequest() : created(newResource);
} catch (DataIntegrityViolationException e) {
response = conflict();
Expand Down Expand Up @@ -150,12 +147,12 @@ public ResponseEntity<ProjectModel> updateProject(@RequestBody ProjectModel reso
resource.setUpdateUser(getWebAdeAuthentication().getUserId());
// ensure that the user hasn't changed the primary key
if (id.equalsIgnoreCase(resource.getProjectGuid())) {
ProjectModel updatedResource = projectService.createOrUpdateProject(resource);
ProjectModel updatedResource = projectService.updateProject(resource);
response = updatedResource == null ? notFound(): ok(updatedResource);
} else {
response = badRequest();
}
} catch(ServiceException e) {
} catch(Exception e) {
// most responses here will actually be Bad Requests, not Internal Server Errors
// This would be an ideal place to expand the "Catch" and return sensible
// HTTP status codes
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
package ca.bc.gov.nrs.wfprev.data.assemblers;

import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;

import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport;
import org.springframework.stereotype.Component;

import ca.bc.gov.nrs.wfprev.controllers.ProjectController;
import ca.bc.gov.nrs.wfprev.data.entities.ForestAreaCodeEntity;
import ca.bc.gov.nrs.wfprev.data.entities.GeneralScopeCodeEntity;
Expand All @@ -16,9 +9,17 @@
import ca.bc.gov.nrs.wfprev.data.models.GeneralScopeCodeModel;
import ca.bc.gov.nrs.wfprev.data.models.ProjectModel;
import ca.bc.gov.nrs.wfprev.data.models.ProjectTypeCodeModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport;
import org.springframework.stereotype.Component;

import java.util.UUID;

import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;

@Slf4j
@Component
public class ProjectResourceAssembler extends RepresentationModelAssemblerSupport<ProjectEntity, ProjectModel> {

Expand Down Expand Up @@ -165,27 +166,50 @@ private GeneralScopeCodeEntity toGeneralScopeCodeEntity(GeneralScopeCodeModel co
return ra.toEntity(code);
}

public void updateEntity(ProjectModel model, ProjectEntity entity) {
entity.setProjectName(model.getProjectName());
entity.setProjectDescription(model.getProjectDescription());
entity.setTotalActualProjectSizeHa(model.getTotalActualProjectSizeHa());
entity.setTotalActualCostPerHectareAmount(model.getTotalActualCostPerHectareAmount());
entity.setTotalActualAmount(model.getTotalActualAmount());
entity.setTotalAllocatedAmount(model.getTotalAllocatedAmount());
entity.setTotalFundingRequestAmount(model.getTotalFundingRequestAmount());
entity.setTotalPlannedCostPerHectare(model.getTotalPlannedCostPerHectare());
entity.setTotalPlannedProjectSizeHa(model.getTotalPlannedProjectSizeHa());
entity.setIsMultiFiscalYearProj(model.getIsMultiFiscalYearProj());
entity.setLatitude(model.getLatitude());
entity.setLongitude(model.getLongitude());
entity.setIsMultiFiscalYearProj(model.getIsMultiFiscalYearProj());
entity.setTotalActualAmount(model.getTotalActualAmount());
entity.setForestAreaCode(toForestAreaCodeEntity(model.getForestAreaCode()));


// Optionally handle `revision_count` if required
if (model.getRevisionCount() != null) {
entity.setRevisionCount(model.getRevisionCount());
}
public ProjectEntity updateEntity(ProjectModel model, ProjectEntity existingEntity) {
log.debug(">> updateEntity");
System.out.println("In updateEntity");
ProjectEntity entity = new ProjectEntity();
entity.setProjectGuid(existingEntity.getProjectGuid());
entity.setProjectName(nonNullOrDefault(model.getProjectName(), existingEntity.getProjectName()));
entity.setProjectDescription(nonNullOrDefault(model.getProjectDescription(), existingEntity.getProjectDescription()));
entity.setTotalActualProjectSizeHa(nonNullOrDefault(model.getTotalActualProjectSizeHa(), existingEntity.getTotalActualProjectSizeHa()));
entity.setTotalActualCostPerHectareAmount(nonNullOrDefault(model.getTotalActualCostPerHectareAmount(), existingEntity.getTotalActualCostPerHectareAmount()));
entity.setTotalActualAmount(nonNullOrDefault(model.getTotalActualAmount(), existingEntity.getTotalActualAmount()));
entity.setTotalAllocatedAmount(nonNullOrDefault(model.getTotalAllocatedAmount(), existingEntity.getTotalAllocatedAmount()));
entity.setTotalFundingRequestAmount(nonNullOrDefault(model.getTotalFundingRequestAmount(), existingEntity.getTotalFundingRequestAmount()));
entity.setTotalPlannedCostPerHectare(nonNullOrDefault(model.getTotalPlannedCostPerHectare(), existingEntity.getTotalPlannedCostPerHectare()));
entity.setTotalPlannedProjectSizeHa(nonNullOrDefault(model.getTotalPlannedProjectSizeHa(), existingEntity.getTotalPlannedProjectSizeHa()));
entity.setIsMultiFiscalYearProj(nonNullOrDefault(model.getIsMultiFiscalYearProj(), existingEntity.getIsMultiFiscalYearProj()));
entity.setLatitude(nonNullOrDefault(model.getLatitude(), existingEntity.getLatitude()));
entity.setLongitude(nonNullOrDefault(model.getLongitude(), existingEntity.getLongitude()));
entity.setForestAreaCode(nonNullOrDefault(toForestAreaCodeEntity(model.getForestAreaCode()), existingEntity.getForestAreaCode()));
entity.setRevisionCount(nonNullOrDefault(model.getRevisionCount(), existingEntity.getRevisionCount()));
entity.setProjectStatusCode(existingEntity.getProjectStatusCode());
entity.setSiteUnitName(nonNullOrDefault(model.getSiteUnitName(), existingEntity.getSiteUnitName()));
entity.setProgramAreaGuid(existingEntity.getProgramAreaGuid());
entity.setForestRegionOrgUnitId(nonNullOrDefault(model.getForestRegionOrgUnitId(), existingEntity.getForestRegionOrgUnitId()));
entity.setForestDistrictOrgUnitId(nonNullOrDefault(model.getForestDistrictOrgUnitId(), existingEntity.getForestDistrictOrgUnitId()));
entity.setFireCentreOrgUnitId(nonNullOrDefault(model.getFireCentreOrgUnitId(), existingEntity.getFireCentreOrgUnitId()));
entity.setBcParksRegionOrgUnitId(nonNullOrDefault(model.getBcParksRegionOrgUnitId(), existingEntity.getBcParksRegionOrgUnitId()));
entity.setBcParksSectionOrgUnitId(nonNullOrDefault(model.getBcParksSectionOrgUnitId(), existingEntity.getBcParksSectionOrgUnitId()));
entity.setProjectLead(nonNullOrDefault(model.getProjectLead(), existingEntity.getProjectLead()));
entity.setProjectLeadEmailAddress(nonNullOrDefault(model.getProjectLeadEmailAddress(), existingEntity.getProjectLeadEmailAddress()));
entity.setClosestCommunityName(nonNullOrDefault(model.getClosestCommunityName(), existingEntity.getClosestCommunityName()));
entity.setLastProgressUpdateTimestamp(nonNullOrDefault(model.getLastProgressUpdateTimestamp(), existingEntity.getLastProgressUpdateTimestamp()));
entity.setCreateUser(existingEntity.getCreateUser());
entity.setCreateDate(existingEntity.getCreateDate());
entity.setUpdateUser(existingEntity.getUpdateUser());
entity.setUpdateDate(existingEntity.getUpdateDate());
entity.setProjectTypeCode(existingEntity.getProjectTypeCode());
entity.setGeneralScopeCode(existingEntity.getGeneralScopeCode());
entity.setProjectNumber(existingEntity.getProjectNumber());

log.error("Updated entity: " + entity);
return entity;
}

private <T> T nonNullOrDefault(T newValue, T existingValue) {
return newValue != null ? newValue : existingValue;
}
}
Loading

0 comments on commit 774cdc1

Please sign in to comment.