From 1c47b48167df4ad6b620d1909210d2edb166bbaf Mon Sep 17 00:00:00 2001 From: brunoMarchiEncora Date: Fri, 17 Feb 2023 12:24:21 -0300 Subject: [PATCH 1/9] feat: persist client information in postgres --- .../gov/app/dto/client/ClientAddressDto.java | 16 +++++ .../app/dto/client/ClientBusinessTypeDto.java | 4 ++ .../gov/app/dto/client/ClientContactDto.java | 10 +++ .../app/dto/client/ClientInformationDto.java | 11 ++++ .../gov/app/dto/client/ClientLocationDto.java | 6 ++ .../app/dto/client/ClientSubmissionDto.java | 8 +++ .../entity/client/SubmissionDetailEntity.java | 58 ++++++++++++++++ .../app/entity/client/SubmissionEntity.java | 45 +++++++++++++ .../SubmissionLocationContactEntity.java | 38 +++++++++++ .../client/SubmissionLocationEntity.java | 50 ++++++++++++++ .../client/ClientSubmissionHandler.java | 64 ++++++++++++++++++ .../client/ClientTypeCodeHandler.java | 1 - .../models/client/SubmissionStatusEnum.java | 16 +++++ .../client/SubmissionDetailRepository.java | 10 +++ .../SubmissionLocationContactRepository.java | 10 +++ .../client/SubmissionLocationRepository.java | 10 +++ .../client/SubmissionRepository.java | 9 +++ .../gov/app/routes/client/ClientRouter.java | 11 +++- .../gov/app/service/client/ClientService.java | 66 +++++++++++++++++++ .../java/ca/bc/gov/app/util/ClientMapper.java | 59 +++++++++++++++++ .../client/ClientHandlerIntegrationTest.java | 42 ++++++++++++ 21 files changed, 541 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/ca/bc/gov/app/dto/client/ClientAddressDto.java create mode 100644 backend/src/main/java/ca/bc/gov/app/dto/client/ClientBusinessTypeDto.java create mode 100644 backend/src/main/java/ca/bc/gov/app/dto/client/ClientContactDto.java create mode 100644 backend/src/main/java/ca/bc/gov/app/dto/client/ClientInformationDto.java create mode 100644 backend/src/main/java/ca/bc/gov/app/dto/client/ClientLocationDto.java create mode 100644 backend/src/main/java/ca/bc/gov/app/dto/client/ClientSubmissionDto.java create mode 100644 backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java create mode 100644 backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java create mode 100644 backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationContactEntity.java create mode 100644 backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationEntity.java create mode 100644 backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java create mode 100644 backend/src/main/java/ca/bc/gov/app/models/client/SubmissionStatusEnum.java create mode 100644 backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionDetailRepository.java create mode 100644 backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionLocationContactRepository.java create mode 100644 backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionLocationRepository.java create mode 100644 backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionRepository.java create mode 100644 backend/src/main/java/ca/bc/gov/app/util/ClientMapper.java diff --git a/backend/src/main/java/ca/bc/gov/app/dto/client/ClientAddressDto.java b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientAddressDto.java new file mode 100644 index 0000000000..37265f81f2 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientAddressDto.java @@ -0,0 +1,16 @@ +package ca.bc.gov.app.dto.client; + +import java.util.List; + +public record ClientAddressDto( + String streetAddress, + String country, + String province, + String city, + String postalCode, + String businessPhone, + String email, + int index, + List clientContactDtoList +) { +} diff --git a/backend/src/main/java/ca/bc/gov/app/dto/client/ClientBusinessTypeDto.java b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientBusinessTypeDto.java new file mode 100644 index 0000000000..f6154d0a8d --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientBusinessTypeDto.java @@ -0,0 +1,4 @@ +package ca.bc.gov.app.dto.client; + +public record ClientBusinessTypeDto(String clientType){ +} diff --git a/backend/src/main/java/ca/bc/gov/app/dto/client/ClientContactDto.java b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientContactDto.java new file mode 100644 index 0000000000..9bbc0d5d9f --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientContactDto.java @@ -0,0 +1,10 @@ +package ca.bc.gov.app.dto.client; + +public record ClientContactDto( + String contactType, + String name, + String businessPhone, + String email, + int index +) { +} diff --git a/backend/src/main/java/ca/bc/gov/app/dto/client/ClientInformationDto.java b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientInformationDto.java new file mode 100644 index 0000000000..84c2cb9ac4 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientInformationDto.java @@ -0,0 +1,11 @@ +package ca.bc.gov.app.dto.client; + +public record ClientInformationDto( + String firstName, + String lastName, + String birthdate, + String incorporationNumber, + String doingBusinessAsName, + String businessName +) { +} diff --git a/backend/src/main/java/ca/bc/gov/app/dto/client/ClientLocationDto.java b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientLocationDto.java new file mode 100644 index 0000000000..4de4f62fcc --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientLocationDto.java @@ -0,0 +1,6 @@ +package ca.bc.gov.app.dto.client; + +import java.util.List; + +public record ClientLocationDto(List clientAddressDto) { +} diff --git a/backend/src/main/java/ca/bc/gov/app/dto/client/ClientSubmissionDto.java b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientSubmissionDto.java new file mode 100644 index 0000000000..77f5c11bdb --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/dto/client/ClientSubmissionDto.java @@ -0,0 +1,8 @@ +package ca.bc.gov.app.dto.client; + +public record ClientSubmissionDto( + ClientBusinessTypeDto clientBusinessTypeDto, + ClientInformationDto clientInformationDto, + ClientLocationDto clientLocationDto +) { +} diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java new file mode 100644 index 0000000000..e9b1c2c928 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java @@ -0,0 +1,58 @@ +package ca.bc.gov.app.entity.client; + +import ca.bc.gov.app.ApplicationConstant; +import java.time.LocalDate; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.With; +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Column; +import org.springframework.data.relational.core.mapping.Table; + +@Table(name = "submission", schema = ApplicationConstant.POSTGRES_ATTRIBUTE_SCHEMA) +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@With +public class SubmissionDetailEntity { + + @Id + @Column("submission_detail_id") + private int submissionDetailId; + + @Column("submission_id") + private int submissionId; + + @Column("incorporation_number") + private String incorporationNumber; + + @Column("organization_name") + private String organizationName; + + @Column("first_name") + private String firstName; + + @Column("middle_name") + private String middleName; + + @Column("last_name") + private String lastName; + + @Column("client_type_code") + private String clientTypeCode; + + @Column("date_of_birth") + private LocalDate dateOfBirth; + + @Column("doing_business_as_ind") + private String doingBusinessAsInd; + + @Column("doingBusinessAsName") + private String doingBusinessAsName; + + @Column("has_additional_location_ind") + private String hasAdditionalLocationInd; +} diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java new file mode 100644 index 0000000000..c6248b51c4 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java @@ -0,0 +1,45 @@ +package ca.bc.gov.app.entity.client; + +import ca.bc.gov.app.ApplicationConstant; +import ca.bc.gov.app.models.client.SubmissionStatusEnum; +import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.With; +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Column; +import org.springframework.data.relational.core.mapping.Table; + +@Table(name = "submission", schema = ApplicationConstant.POSTGRES_ATTRIBUTE_SCHEMA) +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@With +public class SubmissionEntity { + @Id + @Column("submission_id") + private int submissionId; + + @Column("submitter_user_guid") + private String submitterUserId; + + @Column("submission_status_code") + private SubmissionStatusEnum submissionStatus; + + @Column("submission_date") + private LocalDateTime submissionDate; + + @Column("update_timestamp") + private LocalDateTime updateTimestamp; + + @NotNull + @Column("create_user") + private String createUser; + + @Column("update_user") + private String updateUser; +} diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationContactEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationContactEntity.java new file mode 100644 index 0000000000..13d1b25a6a --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationContactEntity.java @@ -0,0 +1,38 @@ +package ca.bc.gov.app.entity.client; + +import ca.bc.gov.app.ApplicationConstant; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.With; +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Column; +import org.springframework.data.relational.core.mapping.Table; + +@Table(name = "submission_location_contact", schema = ApplicationConstant.POSTGRES_ATTRIBUTE_SCHEMA) +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@With +public class SubmissionLocationContactEntity { + @Id + @Column("submission_location_id") + private Integer submissionLocationContactId; + + @Column("submission_location_id") + private Integer submissionLocationId; + + @Column("name_department") + private String nameDepartment; + + @Column("contact_type_code") + private String contactTypeCode; + + @Column("business_phone_number") + private String businessPhoneNumber; + + @Column("email_address") + private String emailAddress; +} diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationEntity.java new file mode 100644 index 0000000000..f50c995b9c --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationEntity.java @@ -0,0 +1,50 @@ +package ca.bc.gov.app.entity.client; + +import ca.bc.gov.app.ApplicationConstant; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.With; +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Column; +import org.springframework.data.relational.core.mapping.Table; + +@Table(name = "submission_location", schema = ApplicationConstant.POSTGRES_ATTRIBUTE_SCHEMA) +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@With +public class SubmissionLocationEntity { + @Id + @Column("submission_location_id") + private int submissionLocationId; + + @Column("submission_id") + private int submissionId; + + @Column("street_address") + private String streetAddress; + + @Column("country_code") + private String countryCode; + + @Column("province_code") + private String provinceCode; + + @Column("city_name") + private String cityName; + + @Column("postal_code") + private String postalCode; + + @Column("business_phone_number") + private String businessPhoneNumber; + + @Column("email_address") + private String emailAddress; + + @Column("main_address_ind") + private String mainAddressInd; +} diff --git a/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java b/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java new file mode 100644 index 0000000000..946ae3f95d --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java @@ -0,0 +1,64 @@ +package ca.bc.gov.app.handlers.client; + +import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; +import static org.springdoc.core.fn.builders.arrayschema.Builder.arraySchemaBuilder; +import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; +import static org.springdoc.core.fn.builders.requestbody.Builder.requestBodyBuilder; +import static org.springdoc.core.fn.builders.schema.Builder.schemaBuilder; + +import ca.bc.gov.app.dto.client.ClientNameCodeDto; +import ca.bc.gov.app.dto.client.ClientSubmissionDto; +import ca.bc.gov.app.handlers.BaseHandler; +import ca.bc.gov.app.service.client.ClientService; +import ca.bc.gov.app.util.HandlerUtil; +import java.util.function.Consumer; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springdoc.core.fn.builders.operation.Builder; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.ResponseStatusException; +import reactor.core.publisher.Mono; + +@Component +@Slf4j +@RequiredArgsConstructor +public class ClientSubmissionHandler implements BaseHandler { + + private final ClientService clientService; + + @Override + public Mono handle(ServerRequest serverRequest) { + return + ServerResponse + .ok() + .contentType(serverRequest.headers().contentType().orElse(MediaType.APPLICATION_JSON)) + .body( + serverRequest + .bodyToMono(ClientSubmissionDto.class) + .flatMap(clientService::submit), + ClientSubmissionHandler.class) + .doOnError(ResponseStatusException.class, HandlerUtil.handleStatusResponse()) + .doOnError(HandlerUtil.handleError()); + } + + @Override + public Consumer documentation(String tag) { + return ops -> ops + .tag(tag) + .description("Submit client data") + .beanClass(ClientSubmissionHandler.class) + .beanMethod("handle") + .operationId("handle") + .requestBody( + requestBodyBuilder() + .implementation(ClientSubmissionDto.class)) + .response( + responseBuilder() + .responseCode("200") + .description("OK") + ); + } +} diff --git a/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientTypeCodeHandler.java b/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientTypeCodeHandler.java index 28878230c3..a9a867b768 100644 --- a/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientTypeCodeHandler.java +++ b/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientTypeCodeHandler.java @@ -6,7 +6,6 @@ import static org.springdoc.core.fn.builders.requestbody.Builder.requestBodyBuilder; import static org.springdoc.core.fn.builders.schema.Builder.schemaBuilder; -import ca.bc.gov.app.dto.client.ClientCodeTypeDto; import ca.bc.gov.app.dto.client.ClientNameCodeDto; import ca.bc.gov.app.handlers.BaseHandler; import ca.bc.gov.app.service.client.ClientService; diff --git a/backend/src/main/java/ca/bc/gov/app/models/client/SubmissionStatusEnum.java b/backend/src/main/java/ca/bc/gov/app/models/client/SubmissionStatusEnum.java new file mode 100644 index 0000000000..b6372ec467 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/models/client/SubmissionStatusEnum.java @@ -0,0 +1,16 @@ +package ca.bc.gov.app.models.client; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum SubmissionStatusEnum { + P("In Progress"), + A("Approved"), + R("Rejected"), + D("Deleted"), + S("Submitted"); + + private final String description; +} diff --git a/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionDetailRepository.java b/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionDetailRepository.java new file mode 100644 index 0000000000..aaed03b182 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionDetailRepository.java @@ -0,0 +1,10 @@ +package ca.bc.gov.app.repository.client; + +import ca.bc.gov.app.entity.client.SubmissionDetailEntity; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SubmissionDetailRepository extends + ReactiveCrudRepository { +} diff --git a/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionLocationContactRepository.java b/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionLocationContactRepository.java new file mode 100644 index 0000000000..b916197a6c --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionLocationContactRepository.java @@ -0,0 +1,10 @@ +package ca.bc.gov.app.repository.client; + +import ca.bc.gov.app.entity.client.SubmissionLocationContactEntity; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SubmissionLocationContactRepository extends + ReactiveCrudRepository { +} diff --git a/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionLocationRepository.java b/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionLocationRepository.java new file mode 100644 index 0000000000..3845b4a8d3 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionLocationRepository.java @@ -0,0 +1,10 @@ +package ca.bc.gov.app.repository.client; + +import ca.bc.gov.app.entity.client.SubmissionLocationEntity; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SubmissionLocationRepository extends + ReactiveCrudRepository { +} diff --git a/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionRepository.java b/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionRepository.java new file mode 100644 index 0000000000..160979e602 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/repository/client/SubmissionRepository.java @@ -0,0 +1,9 @@ +package ca.bc.gov.app.repository.client; + +import ca.bc.gov.app.entity.client.SubmissionEntity; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SubmissionRepository extends ReactiveCrudRepository { +} diff --git a/backend/src/main/java/ca/bc/gov/app/routes/client/ClientRouter.java b/backend/src/main/java/ca/bc/gov/app/routes/client/ClientRouter.java index cb00271861..3213a940ff 100644 --- a/backend/src/main/java/ca/bc/gov/app/routes/client/ClientRouter.java +++ b/backend/src/main/java/ca/bc/gov/app/routes/client/ClientRouter.java @@ -5,6 +5,7 @@ import ca.bc.gov.app.handlers.client.ClientCountryCodeHandler; import ca.bc.gov.app.handlers.client.ClientProvinceCodeHandler; +import ca.bc.gov.app.handlers.client.ClientSubmissionHandler; import ca.bc.gov.app.handlers.client.ClientTypeCodeHandler; import ca.bc.gov.app.handlers.client.ContactTypeCodeHandler; import ca.bc.gov.app.routes.BaseRouter; @@ -21,8 +22,8 @@ public class ClientRouter implements BaseRouter { private final ClientProvinceCodeHandler provinceCodeHandler; private final ClientTypeCodeHandler clientHandler; private final ClientCountryCodeHandler countryCodeHandler; - private final ContactTypeCodeHandler contactTypeCodeHandler; + private final ClientSubmissionHandler clientSubmissionHandler; @Override public String basePath() { @@ -36,7 +37,7 @@ public String routeTagName() { @Override public String routeTagDescription() { - return "The FSA Client endpoint, responsible for returning client data"; + return "The FSA Client endpoint, responsible for handling client data"; } @Override @@ -66,6 +67,12 @@ public RouterFunction routerRoute() { contactTypeCodeHandler::handle, contactTypeCodeHandler.documentation(routeTagName()) ) + .POST( + "/submit", + accept(MediaType.ALL), + clientSubmissionHandler::handle, + clientSubmissionHandler.documentation(routeTagName()) + ) .build(); } } diff --git a/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java b/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java index 50fb2f019d..1bf12d9564 100644 --- a/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java +++ b/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java @@ -1,16 +1,31 @@ package ca.bc.gov.app.service.client; +import static ca.bc.gov.app.util.ClientMapper.mapToSubmissionDetailEntity; +import static ca.bc.gov.app.util.ClientMapper.mapToSubmissionLocationContactEntity; +import static ca.bc.gov.app.util.ClientMapper.mapToSubmissionLocationEntity; + +import ca.bc.gov.app.dto.client.ClientAddressDto; +import ca.bc.gov.app.dto.client.ClientLocationDto; import ca.bc.gov.app.dto.client.ClientNameCodeDto; +import ca.bc.gov.app.dto.client.ClientSubmissionDto; +import ca.bc.gov.app.entity.client.SubmissionEntity; +import ca.bc.gov.app.models.client.SubmissionStatusEnum; import ca.bc.gov.app.repository.client.ClientTypeCodeRepository; import ca.bc.gov.app.repository.client.ContactTypeCodeRepository; import ca.bc.gov.app.repository.client.CountryCodeRepository; import ca.bc.gov.app.repository.client.ProvinceCodeRepository; +import ca.bc.gov.app.repository.client.SubmissionDetailRepository; +import ca.bc.gov.app.repository.client.SubmissionLocationContactRepository; +import ca.bc.gov.app.repository.client.SubmissionLocationRepository; +import ca.bc.gov.app.repository.client.SubmissionRepository; import java.time.LocalDate; +import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; @Service @RequiredArgsConstructor @@ -19,6 +34,10 @@ public class ClientService { private final CountryCodeRepository countryCodeRepository; private final ProvinceCodeRepository provinceCodeRepository; private final ContactTypeCodeRepository contactTypeCodeRepository; + private final SubmissionRepository submissionRepository; + private final SubmissionDetailRepository submissionDetailRepository; + private final SubmissionLocationRepository submissionLocationRepository; + private final SubmissionLocationContactRepository submissionLocationContactRepository; /** *

Find Active Client Type Codes

@@ -91,4 +110,51 @@ public Flux listClientContactTypeCodes(int page, int size) { entity.getContactTypeCode(), entity.getDescription())); } + + public Mono submit(ClientSubmissionDto clientSubmissionDto) { + String userId = "TEMPORARY_USER_ID"; + SubmissionEntity submissionEntity = + new SubmissionEntity() + .withSubmitterUserId(userId) + .withSubmissionStatus(SubmissionStatusEnum.S) + .withSubmissionDate(LocalDateTime.now()); + + return submissionRepository.save(submissionEntity) + .map(submission -> + mapToSubmissionDetailEntity( + submission.getSubmissionId(), + clientSubmissionDto)) + .flatMap(submissionDetailRepository::save) + .flatMap(submissionDetail -> + submitLocations( + clientSubmissionDto.clientLocationDto(), + submissionDetail.getSubmissionId()) + ); + } + + private Mono submitLocations(ClientLocationDto clientLocationDto, Integer submissionId) { + return Flux.fromIterable(clientLocationDto + .clientAddressDto()) + .flatMap(addressDto -> + submissionLocationRepository + .save(mapToSubmissionLocationEntity(submissionId, addressDto)) + .flatMap(location -> + submitLocationContacts(addressDto, location.getSubmissionLocationId()) + ) + ) + .then(); + } + + private Mono submitLocationContacts(ClientAddressDto addressDto, Integer submissionLocationId) { + return Flux + .fromIterable(addressDto.clientContactDtoList()) + .flatMap(contactDto -> + submissionLocationContactRepository.save( + mapToSubmissionLocationContactEntity( + submissionLocationId, + contactDto) + ) + ) + .then(); + } } diff --git a/backend/src/main/java/ca/bc/gov/app/util/ClientMapper.java b/backend/src/main/java/ca/bc/gov/app/util/ClientMapper.java new file mode 100644 index 0000000000..108cfd2989 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/util/ClientMapper.java @@ -0,0 +1,59 @@ +package ca.bc.gov.app.util; + +import ca.bc.gov.app.dto.client.ClientAddressDto; +import ca.bc.gov.app.dto.client.ClientContactDto; +import ca.bc.gov.app.dto.client.ClientInformationDto; +import ca.bc.gov.app.dto.client.ClientSubmissionDto; +import ca.bc.gov.app.entity.client.SubmissionDetailEntity; +import ca.bc.gov.app.entity.client.SubmissionLocationContactEntity; +import ca.bc.gov.app.entity.client.SubmissionLocationEntity; +import java.time.LocalDate; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ClientMapper { + + public static SubmissionDetailEntity mapToSubmissionDetailEntity( + Integer submissionId, + ClientSubmissionDto clientSubmissionDto) { + + ClientInformationDto clientInformationDto = clientSubmissionDto.clientInformationDto(); + + return new SubmissionDetailEntity() + .withSubmissionId(submissionId) + .withIncorporationNumber(clientInformationDto.incorporationNumber()) + .withOrganizationName(clientInformationDto.businessName()) + .withFirstName(clientInformationDto.firstName()) + .withLastName(clientInformationDto.lastName()) + .withClientTypeCode(clientSubmissionDto.clientBusinessTypeDto().clientType()) + .withDateOfBirth(LocalDate.parse(clientInformationDto.birthdate())) + .withDoingBusinessAsName(clientInformationDto.doingBusinessAsName()); + } + + public static SubmissionLocationEntity mapToSubmissionLocationEntity( + Integer submissionId, + ClientAddressDto clientAddressDto) { + return new SubmissionLocationEntity() + .withSubmissionId(submissionId) + .withStreetAddress(clientAddressDto.streetAddress()) + .withCountryCode(clientAddressDto.country()) + .withProvinceCode(clientAddressDto.province()) + .withCityName(clientAddressDto.city()) + .withPostalCode(clientAddressDto.postalCode()) + .withBusinessPhoneNumber(clientAddressDto.businessPhone()) + .withEmailAddress(clientAddressDto.email()); + } + + public static SubmissionLocationContactEntity mapToSubmissionLocationContactEntity( + Integer submissionLocationId, + ClientContactDto clientContactDto + ) { + return new SubmissionLocationContactEntity() + .withSubmissionLocationId(submissionLocationId) + .withNameDepartment(clientContactDto.name()) + .withContactTypeCode(clientContactDto.contactType()) + .withBusinessPhoneNumber(clientContactDto.businessPhone()) + .withEmailAddress(clientContactDto.email()); + } +} diff --git a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java index 560e379f0a..2523eae3ea 100644 --- a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java +++ b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java @@ -1,8 +1,16 @@ package ca.bc.gov.app.endpoints.client; +import ca.bc.gov.app.dto.client.ClientAddressDto; +import ca.bc.gov.app.dto.client.ClientBusinessTypeDto; +import ca.bc.gov.app.dto.client.ClientContactDto; +import ca.bc.gov.app.dto.client.ClientInformationDto; +import ca.bc.gov.app.dto.client.ClientLocationDto; +import ca.bc.gov.app.dto.client.ClientSubmissionDto; import ca.bc.gov.app.extensions.AbstractTestContainerIntegrationTest; import java.net.URI; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; @@ -15,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.web.util.UriBuilder; +import reactor.core.publisher.Mono; @Slf4j @DisplayName("Integrated Test | FSA Client Controller") @@ -171,4 +180,37 @@ private static Stream contactTypeCodes() { Arguments.of(22, 1, "TP", "EDI Trading Partner") ); } + + @DisplayName("Submit client data") + void shouldSubmitClientData() { + ClientSubmissionDto clientSubmissionDto = + new ClientSubmissionDto( + new ClientBusinessTypeDto("A"), + new ClientInformationDto( + "James", "Bond", "2007/07/07", + "12345", "MI6", "Espionage"), + new ClientLocationDto( + List.of( + new ClientAddressDto( + "3570 S Las Vegas Blvd", + "US", + "NV", + "Las Vegas", + "89109", + "007", + "bond_james_bond@007.com", + 0, + List.of( + new ClientContactDto( + "LP", "James", "007", + "bond_james_bond@007.com", 0)) + ))) + ); + client + .post() + .uri("/api/clients/activeContactTypeCodes") + .body(Mono.just(clientSubmissionDto), ClientSubmissionDto.class) + .exchange() + .expectStatus().isOk(); + } } From bbaa5b1c8412879d251e4c098a849ecc70268c85 Mon Sep 17 00:00:00 2001 From: brunoMarchiEncora Date: Fri, 17 Feb 2023 12:50:23 -0300 Subject: [PATCH 2/9] Fix imports --- .../bc/gov/app/handlers/client/ClientSubmissionHandler.java | 4 ---- .../app/endpoints/client/ClientHandlerIntegrationTest.java | 1 - 2 files changed, 5 deletions(-) diff --git a/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java b/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java index 946ae3f95d..7b135261a7 100644 --- a/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java +++ b/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java @@ -1,12 +1,8 @@ package ca.bc.gov.app.handlers.client; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; -import static org.springdoc.core.fn.builders.arrayschema.Builder.arraySchemaBuilder; -import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; import static org.springdoc.core.fn.builders.requestbody.Builder.requestBodyBuilder; -import static org.springdoc.core.fn.builders.schema.Builder.schemaBuilder; -import ca.bc.gov.app.dto.client.ClientNameCodeDto; import ca.bc.gov.app.dto.client.ClientSubmissionDto; import ca.bc.gov.app.handlers.BaseHandler; import ca.bc.gov.app.service.client.ClientService; diff --git a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java index 2523eae3ea..be228027c3 100644 --- a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java +++ b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java @@ -8,7 +8,6 @@ import ca.bc.gov.app.dto.client.ClientSubmissionDto; import ca.bc.gov.app.extensions.AbstractTestContainerIntegrationTest; import java.net.URI; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; From 7c26b760e9d0fb07e948a758c1e30d6697dc1de3 Mon Sep 17 00:00:00 2001 From: brunoMarchiEncora Date: Fri, 17 Feb 2023 14:55:05 -0300 Subject: [PATCH 3/9] Add test annotation --- .../gov/app/endpoints/client/ClientHandlerIntegrationTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java index be228027c3..25e6e9908b 100644 --- a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java +++ b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java @@ -180,6 +180,7 @@ private static Stream contactTypeCodes() { ); } + @Test @DisplayName("Submit client data") void shouldSubmitClientData() { ClientSubmissionDto clientSubmissionDto = From 95ab02580b9bf7a48ebe74cea85d465863a69891 Mon Sep 17 00:00:00 2001 From: brunoMarchiEncora Date: Fri, 17 Feb 2023 15:01:24 -0300 Subject: [PATCH 4/9] Fix test route --- .../gov/app/endpoints/client/ClientHandlerIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java index 25e6e9908b..41ccbd105e 100644 --- a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java +++ b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java @@ -208,7 +208,7 @@ void shouldSubmitClientData() { ); client .post() - .uri("/api/clients/activeContactTypeCodes") + .uri("/api/clients/submit") .body(Mono.just(clientSubmissionDto), ClientSubmissionDto.class) .exchange() .expectStatus().isOk(); From d59c6f402d28cdf8a90f2d2473ae1c6592622515 Mon Sep 17 00:00:00 2001 From: brunoMarchiEncora Date: Fri, 17 Feb 2023 15:54:19 -0300 Subject: [PATCH 5/9] Update entities id type --- .../ca/bc/gov/app/entity/client/SubmissionDetailEntity.java | 4 ++-- .../java/ca/bc/gov/app/entity/client/SubmissionEntity.java | 2 +- .../ca/bc/gov/app/entity/client/SubmissionLocationEntity.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java index e9b1c2c928..b6ffeff8b4 100644 --- a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java @@ -21,10 +21,10 @@ public class SubmissionDetailEntity { @Id @Column("submission_detail_id") - private int submissionDetailId; + private Integer submissionDetailId; @Column("submission_id") - private int submissionId; + private Integer submissionId; @Column("incorporation_number") private String incorporationNumber; diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java index c6248b51c4..0f5c782313 100644 --- a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java @@ -22,7 +22,7 @@ public class SubmissionEntity { @Id @Column("submission_id") - private int submissionId; + private Integer submissionId; @Column("submitter_user_guid") private String submitterUserId; diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationEntity.java index f50c995b9c..a32f6569a7 100644 --- a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationEntity.java +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionLocationEntity.java @@ -19,10 +19,10 @@ public class SubmissionLocationEntity { @Id @Column("submission_location_id") - private int submissionLocationId; + private Integer submissionLocationId; @Column("submission_id") - private int submissionId; + private Integer submissionId; @Column("street_address") private String streetAddress; From b5d199576dd865829ed72f1346698ded9cd3c720 Mon Sep 17 00:00:00 2001 From: Paulo Gomes da Cruz Junior Date: Tue, 21 Feb 2023 15:11:56 -0800 Subject: [PATCH 6/9] fix: fixing date format --- .../gov/app/endpoints/client/ClientHandlerIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java index 41ccbd105e..1de2f44e3e 100644 --- a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java +++ b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java @@ -187,7 +187,7 @@ void shouldSubmitClientData() { new ClientSubmissionDto( new ClientBusinessTypeDto("A"), new ClientInformationDto( - "James", "Bond", "2007/07/07", + "James", "Bond", "2007-07-07", "12345", "MI6", "Espionage"), new ClientLocationDto( List.of( From 3fd3cdedb67a4f9e980f12ee452c928a36d697de Mon Sep 17 00:00:00 2001 From: Paulo Gomes da Cruz Junior Date: Tue, 21 Feb 2023 15:14:10 -0800 Subject: [PATCH 7/9] fix: fixing base entity format --- .../bc/gov/app/entity/client/BaseEntity.java | 20 ++--------- .../entity/client/ClientTypeCodeEntity.java | 2 +- .../app/entity/client/CountryCodeEntity.java | 6 +++- .../entity/client/ExpirableBaseEntity.java | 34 +++++++++++++++++++ .../app/entity/client/ProvinceCodeEntity.java | 6 +++- 5 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 backend/src/main/java/ca/bc/gov/app/entity/client/ExpirableBaseEntity.java diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/BaseEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/BaseEntity.java index 6eaeb4a79b..2f4dfc8e07 100644 --- a/backend/src/main/java/ca/bc/gov/app/entity/client/BaseEntity.java +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/BaseEntity.java @@ -1,37 +1,23 @@ package ca.bc.gov.app.entity.client; -import jakarta.validation.constraints.NotNull; -import java.time.LocalDate; import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import org.springframework.data.relational.core.mapping.Column; +@SuperBuilder @Data @NoArgsConstructor @AllArgsConstructor public abstract class BaseEntity { - @NotNull - protected String description; - - @NotNull - @Column("effective_date") - protected LocalDate effectiveAt; - - @NotNull - @Column("expiry_date") - protected LocalDate expiredAt; - - @Column("create_timestamp") - protected LocalDateTime createdAt; - @Column("update_timestamp") protected LocalDateTime updatedAt; @Column("create_user") - private String createdBy; + protected String createdBy; @Column("update_user") protected String updatedBy; diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/ClientTypeCodeEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/ClientTypeCodeEntity.java index ce9efda70f..018ae6746b 100644 --- a/backend/src/main/java/ca/bc/gov/app/entity/client/ClientTypeCodeEntity.java +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/ClientTypeCodeEntity.java @@ -21,7 +21,7 @@ @NoArgsConstructor @AllArgsConstructor @With -public class ClientTypeCodeEntity extends BaseEntity { +public class ClientTypeCodeEntity extends ExpirableBaseEntity { @Id @Column("client_type_code") diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/CountryCodeEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/CountryCodeEntity.java index 446ede8758..ad6e5b45f8 100644 --- a/backend/src/main/java/ca/bc/gov/app/entity/client/CountryCodeEntity.java +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/CountryCodeEntity.java @@ -6,7 +6,9 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.ToString; import lombok.With; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Column; @@ -14,11 +16,13 @@ @Table(name = "country_code", schema = ApplicationConstant.POSTGRES_ATTRIBUTE_SCHEMA) @Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor @With -public class CountryCodeEntity extends BaseEntity { +public class CountryCodeEntity extends ExpirableBaseEntity { @Id @Column("country_code") @NotNull diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/ExpirableBaseEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/ExpirableBaseEntity.java new file mode 100644 index 0000000000..88530429b4 --- /dev/null +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/ExpirableBaseEntity.java @@ -0,0 +1,34 @@ +package ca.bc.gov.app.entity.client; + +import jakarta.validation.constraints.NotNull; +import java.time.LocalDate; +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; +import org.springframework.data.relational.core.mapping.Column; + +@SuperBuilder +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public abstract class ExpirableBaseEntity extends BaseEntity { + @NotNull + protected String description; + + @Column("create_timestamp") + protected LocalDateTime createdAt; + + @NotNull + @Column("effective_date") + protected LocalDate effectiveAt; + + @NotNull + @Column("expiry_date") + protected LocalDate expiredAt; +} diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/ProvinceCodeEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/ProvinceCodeEntity.java index aa74e6e484..88cf80292d 100644 --- a/backend/src/main/java/ca/bc/gov/app/entity/client/ProvinceCodeEntity.java +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/ProvinceCodeEntity.java @@ -6,7 +6,9 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.ToString; import lombok.With; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Column; @@ -14,11 +16,13 @@ @Table(name = "province_code", schema = ApplicationConstant.POSTGRES_ATTRIBUTE_SCHEMA) @Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor @With -public class ProvinceCodeEntity extends BaseEntity { +public class ProvinceCodeEntity extends ExpirableBaseEntity { @Id @Column("province_code") From 5114bbe8d3c1bfc5998e71c5d81c14f1b6a46649 Mon Sep 17 00:00:00 2001 From: Paulo Gomes da Cruz Junior Date: Tue, 21 Feb 2023 15:14:36 -0800 Subject: [PATCH 8/9] fix: fixing entity and sequences --- .../entity/client/SubmissionDetailEntity.java | 4 ++-- .../app/entity/client/SubmissionEntity.java | 22 ++++++++----------- .../gov/app/service/client/ClientService.java | 14 +++++++----- .../db/migration/V1__initializing_data.sql | 9 ++++++++ 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java index b6ffeff8b4..f2fc3a11d6 100644 --- a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionDetailEntity.java @@ -11,7 +11,7 @@ import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; -@Table(name = "submission", schema = ApplicationConstant.POSTGRES_ATTRIBUTE_SCHEMA) +@Table(name = "submission_detail", schema = ApplicationConstant.POSTGRES_ATTRIBUTE_SCHEMA) @Data @Builder @NoArgsConstructor @@ -50,7 +50,7 @@ public class SubmissionDetailEntity { @Column("doing_business_as_ind") private String doingBusinessAsInd; - @Column("doingBusinessAsName") + @Column("doing_business_as_name") private String doingBusinessAsName; @Column("has_additional_location_ind") diff --git a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java index 0f5c782313..172909a671 100644 --- a/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java +++ b/backend/src/main/java/ca/bc/gov/app/entity/client/SubmissionEntity.java @@ -2,24 +2,28 @@ import ca.bc.gov.app.ApplicationConstant; import ca.bc.gov.app.models.client.SubmissionStatusEnum; -import jakarta.validation.constraints.NotNull; import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.ToString; import lombok.With; +import lombok.experimental.SuperBuilder; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; @Table(name = "submission", schema = ApplicationConstant.POSTGRES_ATTRIBUTE_SCHEMA) @Data -@Builder +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@SuperBuilder @NoArgsConstructor @AllArgsConstructor @With -public class SubmissionEntity { +public class SubmissionEntity extends BaseEntity { @Id @Column("submission_id") private Integer submissionId; @@ -31,15 +35,7 @@ public class SubmissionEntity { private SubmissionStatusEnum submissionStatus; @Column("submission_date") - private LocalDateTime submissionDate; + @Builder.Default + private LocalDateTime submissionDate = LocalDateTime.now(); - @Column("update_timestamp") - private LocalDateTime updateTimestamp; - - @NotNull - @Column("create_user") - private String createUser; - - @Column("update_user") - private String updateUser; } diff --git a/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java b/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java index 1bf12d9564..742cc38d94 100644 --- a/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java +++ b/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java @@ -20,6 +20,7 @@ import ca.bc.gov.app.repository.client.SubmissionRepository; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; @@ -112,12 +113,15 @@ public Flux listClientContactTypeCodes(int page, int size) { } public Mono submit(ClientSubmissionDto clientSubmissionDto) { - String userId = "TEMPORARY_USER_ID"; SubmissionEntity submissionEntity = - new SubmissionEntity() - .withSubmitterUserId(userId) - .withSubmissionStatus(SubmissionStatusEnum.S) - .withSubmissionDate(LocalDateTime.now()); + SubmissionEntity + .builder() + .createdBy(UUID.randomUUID().toString()) //TODO: receive user id + .submissionDate(LocalDateTime.now()) + .submitterUserId(UUID.randomUUID().toString()) //TODO: set the correct user + .submissionStatus(SubmissionStatusEnum.S) + .submissionDate(LocalDateTime.now()) + .build(); return submissionRepository.save(submissionEntity) .map(submission -> diff --git a/backend/src/main/resources/db/migration/V1__initializing_data.sql b/backend/src/main/resources/db/migration/V1__initializing_data.sql index a07dffc12d..92ebcae956 100644 --- a/backend/src/main/resources/db/migration/V1__initializing_data.sql +++ b/backend/src/main/resources/db/migration/V1__initializing_data.sql @@ -144,7 +144,16 @@ create table if not exists nrfc.submission_location_contact ( -- create sequence if not exists nrfc.submission_id_seq start 1; +alter table nrfc.submission alter column submission_id set default nextval('nrfc.submission_id_seq'); + create sequence if not exists nrfc.submission_detail_id_seq start 1; +alter table nrfc.submission_detail alter column submission_detail_id set default nextval('nrfc.submission_detail_id_seq'); + +create sequence if not exists nrfc.submission_location_seq start 1; +alter table nrfc.submission_location alter column submission_location_id set default nextval('nrfc.submission_location_seq'); + +create sequence if not exists nrfc.submission_location_contact_seq start 1; +alter table nrfc.submission_location_contact alter column submission_location_contact_id set default nextval('nrfc.submission_location_contact_seq'); -- -- INSERT STATIC DATA From 5f8dad1adf3dd18626b1c5275026542741b24577 Mon Sep 17 00:00:00 2001 From: Paulo Gomes da Cruz Junior Date: Tue, 21 Feb 2023 15:56:16 -0800 Subject: [PATCH 9/9] chore: adjusting the API A few things that require some adjustments are: - [x] the return of the submission needs to be 201 - [x] after creating, return the Location header - [x] after creating, return the x-sub-id header - [x] the URL should be /api/clients/submissions --- .../client/ClientSubmissionHandler.java | 48 ++++++++++++++----- .../gov/app/routes/client/ClientRouter.java | 2 +- .../gov/app/service/client/ClientService.java | 18 ++++--- .../client/ClientHandlerIntegrationTest.java | 7 ++- 4 files changed, 54 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java b/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java index 7b135261a7..7c0a2315e7 100644 --- a/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java +++ b/backend/src/main/java/ca/bc/gov/app/handlers/client/ClientSubmissionHandler.java @@ -1,17 +1,20 @@ package ca.bc.gov.app.handlers.client; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; +import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; +import static org.springdoc.core.fn.builders.header.Builder.headerBuilder; import static org.springdoc.core.fn.builders.requestbody.Builder.requestBodyBuilder; +import static org.springdoc.core.fn.builders.schema.Builder.schemaBuilder; import ca.bc.gov.app.dto.client.ClientSubmissionDto; import ca.bc.gov.app.handlers.BaseHandler; import ca.bc.gov.app.service.client.ClientService; import ca.bc.gov.app.util.HandlerUtil; +import java.net.URI; import java.util.function.Consumer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springdoc.core.fn.builders.operation.Builder; -import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; @@ -28,14 +31,17 @@ public class ClientSubmissionHandler implements BaseHandler { @Override public Mono handle(ServerRequest serverRequest) { return - ServerResponse - .ok() - .contentType(serverRequest.headers().contentType().orElse(MediaType.APPLICATION_JSON)) - .body( - serverRequest - .bodyToMono(ClientSubmissionDto.class) - .flatMap(clientService::submit), - ClientSubmissionHandler.class) + serverRequest + .bodyToMono(ClientSubmissionDto.class) + .flatMap(clientService::submit) + .flatMap(submissionId -> + ServerResponse + .created( + URI.create(String.format("/api/clients/submissions/%d", submissionId)) + ) + .header("x-sub-id",String.valueOf(submissionId)) + .build() + ) .doOnError(ResponseStatusException.class, HandlerUtil.handleStatusResponse()) .doOnError(HandlerUtil.handleError()); } @@ -53,8 +59,28 @@ public Consumer documentation(String tag) { .implementation(ClientSubmissionDto.class)) .response( responseBuilder() - .responseCode("200") - .description("OK") + .responseCode("201") + .description("New client submission posted") + .content(contentBuilder()) + .header( + headerBuilder() + .name("Location") + .schema( + schemaBuilder() + .implementation(String.class) + .example("/api/clients/submissions/0") + ) + ) + .header( + headerBuilder() + .name("x-sub-id") + .description("ID of the submission that was created") + .schema( + schemaBuilder() + .implementation(String.class) + .example("0") + ) + ) ); } } diff --git a/backend/src/main/java/ca/bc/gov/app/routes/client/ClientRouter.java b/backend/src/main/java/ca/bc/gov/app/routes/client/ClientRouter.java index 3213a940ff..c5db1e95d1 100644 --- a/backend/src/main/java/ca/bc/gov/app/routes/client/ClientRouter.java +++ b/backend/src/main/java/ca/bc/gov/app/routes/client/ClientRouter.java @@ -68,7 +68,7 @@ public RouterFunction routerRoute() { contactTypeCodeHandler.documentation(routeTagName()) ) .POST( - "/submit", + "/submissions", accept(MediaType.ALL), clientSubmissionHandler::handle, clientSubmissionHandler.documentation(routeTagName()) diff --git a/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java b/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java index 742cc38d94..ee0fb4e37f 100644 --- a/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java +++ b/backend/src/main/java/ca/bc/gov/app/service/client/ClientService.java @@ -58,8 +58,8 @@ public Flux findActiveClientTypeCodes(LocalDate targetDate) { clientTypeCodeRepository .findActiveAt(targetDate) .map(entity -> new ClientNameCodeDto( - entity.getCode(), - entity.getDescription() + entity.getCode(), + entity.getDescription() ) ); } @@ -112,7 +112,7 @@ public Flux listClientContactTypeCodes(int page, int size) { entity.getDescription())); } - public Mono submit(ClientSubmissionDto clientSubmissionDto) { + public Mono submit(ClientSubmissionDto clientSubmissionDto) { SubmissionEntity submissionEntity = SubmissionEntity .builder() @@ -127,18 +127,21 @@ public Mono submit(ClientSubmissionDto clientSubmissionDto) { .map(submission -> mapToSubmissionDetailEntity( submission.getSubmissionId(), - clientSubmissionDto)) + clientSubmissionDto) + ) .flatMap(submissionDetailRepository::save) .flatMap(submissionDetail -> submitLocations( clientSubmissionDto.clientLocationDto(), - submissionDetail.getSubmissionId()) + submissionDetail.getSubmissionId() + ) + .thenReturn(submissionDetail.getSubmissionId()) ); } private Mono submitLocations(ClientLocationDto clientLocationDto, Integer submissionId) { return Flux.fromIterable(clientLocationDto - .clientAddressDto()) + .clientAddressDto()) .flatMap(addressDto -> submissionLocationRepository .save(mapToSubmissionLocationEntity(submissionId, addressDto)) @@ -149,7 +152,8 @@ private Mono submitLocations(ClientLocationDto clientLocationDto, Integer .then(); } - private Mono submitLocationContacts(ClientAddressDto addressDto, Integer submissionLocationId) { + private Mono submitLocationContacts(ClientAddressDto addressDto, + Integer submissionLocationId) { return Flux .fromIterable(addressDto.clientContactDtoList()) .flatMap(contactDto -> diff --git a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java index 1de2f44e3e..6c15778baa 100644 --- a/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java +++ b/backend/src/test/java/ca/bc/gov/app/endpoints/client/ClientHandlerIntegrationTest.java @@ -208,9 +208,12 @@ void shouldSubmitClientData() { ); client .post() - .uri("/api/clients/submit") + .uri("/api/clients/submissions") .body(Mono.just(clientSubmissionDto), ClientSubmissionDto.class) .exchange() - .expectStatus().isOk(); + .expectStatus().isCreated() + .expectHeader().location("/api/clients/submissions/1") + .expectHeader().valueEquals("x-sub-id",1) + .expectBody().isEmpty(); } }