Skip to content
This repository has been archived by the owner on Dec 17, 2024. It is now read-only.

Commit

Permalink
feat: implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
daho4b committed Dec 16, 2020
1 parent 8538d5a commit 5b6993d
Show file tree
Hide file tree
Showing 23 changed files with 422 additions and 54 deletions.
10 changes: 8 additions & 2 deletions api/agencyadminservice.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ paths:
operationId: updateAgency
requestBody:
content:
'application/hal+json':
'application/json':
schema:
$ref: '#/components/schemas/UpdateAgencyDTO'
required: true
Expand All @@ -207,11 +207,13 @@ paths:
200:
description: OK - agency was updated successfully
content:
'application/json':
'application/hal+json':
schema:
$ref: '#/components/schemas/UpdateAgencyResponseDTO'
400:
description: BAD REQUEST - invalid/incomplete request
404:
description: NOT FOUND - agency not found
401:
description: UNAUTHORIZED - no/invalid role/authorization
500:
Expand Down Expand Up @@ -627,15 +629,19 @@ components:
name:
type: string
example: "Beratungstelle"
minLength: 1
maxLength: 100
description:
type: string
example: "Beschreibung Beratungstelle..."
maxLength: 10000
postcode:
type: string
example: "79106"
city:
type: string
example: "Muenchen"
maxLength: 100
offline:
type: boolean
example: false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import de.caritas.cob.agencyservice.api.exception.httpresponses.InternalServerErrorException;
import de.caritas.cob.agencyservice.api.exception.httpresponses.InvalidConsultingTypeException;
import de.caritas.cob.agencyservice.api.exception.httpresponses.InvalidDioceseException;
import de.caritas.cob.agencyservice.api.exception.httpresponses.InvalidOfflineStatusException;
import de.caritas.cob.agencyservice.api.exception.httpresponses.InvalidPostcodeException;
import de.caritas.cob.agencyservice.api.exception.httpresponses.NotFoundException;
import de.caritas.cob.agencyservice.api.service.LogService;
import java.net.UnknownHostException;
import javax.validation.ConstraintViolationException;
Expand Down Expand Up @@ -162,7 +164,7 @@ public ResponseEntity<Object> handleInternal(
* @return a ResponseEntity instance
*/
@ExceptionHandler({InvalidPostcodeException.class, InvalidConsultingTypeException.class,
InvalidDioceseException.class
InvalidDioceseException.class, InvalidOfflineStatusException.class
})
public ResponseEntity<Object> handleInternal(
final CustomValidationHttpStatusException ex, final WebRequest request) {
Expand All @@ -175,4 +177,23 @@ public ResponseEntity<Object> handleInternal(
HttpStatus.BAD_REQUEST,
request);
}

/**
* 404 - Not found.
*
* @param ex {@link NotFoundException}
* @param request WebRequest
* @return a ResponseEntity instance
*/
@ExceptionHandler({NotFoundException.class})
public ResponseEntity<Object> handleInternal(
final NotFoundException ex, final WebRequest request) {

return handleExceptionInternal(
null,
null,
new HttpHeaders(),
HttpStatus.NOT_FOUND,
request);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import de.caritas.cob.agencyservice.api.model.CreateAgencyResponseDTO;
import de.caritas.cob.agencyservice.api.model.DioceseAdminResultDTO;
import de.caritas.cob.agencyservice.api.model.RootDTO;
import de.caritas.cob.agencyservice.api.model.UpdateAgencyDTO;
import de.caritas.cob.agencyservice.api.model.UpdateAgencyResponseDTO;
import de.caritas.cob.agencyservice.generated.api.admin.controller.AgencyadminApi;
import io.swagger.annotations.Api;
import javax.validation.Valid;
Expand Down Expand Up @@ -114,4 +116,20 @@ public ResponseEntity<AgencyPostcodeRangesResultDTO> getAgencyPostcodeRanges(@Pa
return ResponseEntity.ok(postCodeRangesForAgency);
}

/**
* Entry point to update a specific agency.
*
* @param agencyId Agency Id (required)
* @param updateAgencyDTO (required)
* @return a {@link CreateAgencyResponseDTO} entity
*/
@Override
public ResponseEntity<UpdateAgencyResponseDTO> updateAgency(@PathVariable Long agencyId,
@Valid UpdateAgencyDTO updateAgencyDTO) {

agencyValidator.validate(agencyId, updateAgencyDTO);
UpdateAgencyResponseDTO updateAgencyResponseDTO = agencyAdminService.updateAgency(agencyId, updateAgencyDTO);

return new ResponseEntity<>(updateAgencyResponseDTO, HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,23 @@
import de.caritas.cob.agencyservice.api.admin.service.agency.AgencyAdminResponseDTOBuilder;
import de.caritas.cob.agencyservice.api.exception.httpresponses.BadRequestException;
import de.caritas.cob.agencyservice.api.exception.httpresponses.InternalServerErrorException;
import de.caritas.cob.agencyservice.api.exception.httpresponses.NotFoundException;
import de.caritas.cob.agencyservice.api.model.AgencyAdminResponseDTO;
import de.caritas.cob.agencyservice.api.model.AgencyDTO;
import de.caritas.cob.agencyservice.api.model.CreateAgencyResponseDTO;
import de.caritas.cob.agencyservice.api.model.CreateLinks;
import de.caritas.cob.agencyservice.api.model.UpdateAgencyDTO;
import de.caritas.cob.agencyservice.api.model.UpdateAgencyResponseDTO;
import de.caritas.cob.agencyservice.api.model.UpdateLinks;
import de.caritas.cob.agencyservice.api.repository.agency.Agency;
import de.caritas.cob.agencyservice.api.repository.agency.AgencyRepository;
import de.caritas.cob.agencyservice.api.repository.agency.ConsultingType;
import de.caritas.cob.agencyservice.api.service.LogService;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.DataAccessException;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Service;

/**
Expand Down Expand Up @@ -70,9 +74,61 @@ private Agency fromAgencyDTO(AgencyDTO agencyDTO) {
.teamAgency(agencyDTO.getTeamAgency())
.consultingType(
ConsultingType.valueOf(agencyDTO.getConsultingType())
.orElseThrow(() -> new BadRequestException("Consulting type of agency dto does not exist")))
.orElseThrow(
() -> new BadRequestException("Consulting type of agency dto does not exist")))
.createDate(LocalDateTime.now(ZoneOffset.UTC))
.updateDate(LocalDateTime.now(ZoneOffset.UTC))
.build();
}

/**
* Updates an agency in the database.
*
* @param updateAgencyDTO (required)
* @return an {@link UpdateAgencyResponseDTO} instance
*/
public UpdateAgencyResponseDTO updateAgency(Long agencyId, UpdateAgencyDTO updateAgencyDTO) {
Agency updatedAgency;
try {
Agency agency = agencyRepository.findById(agencyId)
.orElseThrow(NotFoundException::new);
updatedAgency = agencyRepository.save(mergeAgencies(agency, updateAgencyDTO));
} catch (DataAccessException ex) {
throw new InternalServerErrorException(
LogService::logDatabaseError, "Database error while saving agency");
}

UpdateLinks updateLinks =
UpdateAgencyLinkBuilder.getInstance(updatedAgency).buildUpdateAgencyLinks();

return new UpdateAgencyResponseDTO()
.embedded(new AgencyAdminResponseDTOBuilder(updatedAgency).fromAgency())
.links(updateLinks);

}

/**
* Converts a {@link UpdateAgencyDTO} to an {@link Agency}.
*
* @param updateAgencyDTO (required)
* @return an {@link Agency} instance
*/
private Agency mergeAgencies(Agency agency, UpdateAgencyDTO updateAgencyDTO) {

return Agency.builder()
.id(agency.getId())
.dioceseId(updateAgencyDTO.getDioceseId())
.name(updateAgencyDTO.getName())
.description(updateAgencyDTO.getDescription())
.postCode(updateAgencyDTO.getPostcode())
.city(updateAgencyDTO.getCity())
.offline(updateAgencyDTO.getOffline())
.teamAgency(agency.isTeamAgency())
.consultingType(agency.getConsultingType())
.createDate(agency.getCreateDate())
.updateDate(LocalDateTime.now(ZoneOffset.UTC))
.deleteDate(agency.getDeleteDate())
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package de.caritas.cob.agencyservice.api.admin.service;

import static java.util.Objects.requireNonNull;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;

import de.caritas.cob.agencyservice.api.admin.hallink.CreateAgencyLinkBuilder;
import de.caritas.cob.agencyservice.api.admin.hallink.HalLinkBuilder;
import de.caritas.cob.agencyservice.api.model.HalLink;
import de.caritas.cob.agencyservice.api.model.HalLink.MethodEnum;
import de.caritas.cob.agencyservice.api.model.UpdateLinks;
import de.caritas.cob.agencyservice.api.repository.agency.Agency;
import de.caritas.cob.agencyservice.generated.api.admin.controller.AgencyadminApi;

/**
* Link builder to create hal links for update agency results.
*/
public class UpdateAgencyLinkBuilder implements HalLinkBuilder {

private final Agency agency;

private UpdateAgencyLinkBuilder(Agency agency) {
this.agency = agency;
}

/**
* Creates an {@link CreateAgencyLinkBuilder} instance.
*
* @return a instance of {@link CreateAgencyLinkBuilder}
*/
public static UpdateAgencyLinkBuilder getInstance(Agency agency) {
requireNonNull(agency);
return new UpdateAgencyLinkBuilder(agency);
}

/**
* Creates the {@link CreateAgencyLinkBuilder}.
*
* @return the generated {@link CreateAgencyLinkBuilder}
*/
public UpdateLinks buildUpdateAgencyLinks() {
return new UpdateLinks()
.self(buildSelfLink())
.delete(buildDeleteHalLink())
.agency(buildAgencyLink());
}

private HalLink buildAgencyLink() {
return buildHalLink(methodOn(AgencyadminApi.class).getAgency(agency.getId()), MethodEnum.GET);
}

private HalLink buildDeleteHalLink() {
return buildHalLink(
methodOn(AgencyadminApi.class).deleteAgency(agency.getId()), MethodEnum.DELETE);
}

private HalLink buildSelfLink() {
return buildHalLink(
methodOn(AgencyadminApi.class).updateAgency(agency.getId(), null), MethodEnum.PUT);
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package de.caritas.cob.agencyservice.api.admin.validation;

import de.caritas.cob.agencyservice.api.admin.validation.validators.ConcreteAgencyValidator;
import de.caritas.cob.agencyservice.api.admin.validation.validators.annotation.CreateAgencyValidator;
import de.caritas.cob.agencyservice.api.admin.validation.validators.annotation.UpdateAgencyValidator;
import de.caritas.cob.agencyservice.api.admin.validation.validators.model.ValidateAgencyDto;
import de.caritas.cob.agencyservice.api.exception.httpresponses.NotFoundException;
import de.caritas.cob.agencyservice.api.model.AgencyDTO;
import de.caritas.cob.agencyservice.api.model.UpdateAgencyDTO;
import de.caritas.cob.agencyservice.api.repository.agency.Agency;
import de.caritas.cob.agencyservice.api.repository.agency.AgencyRepository;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationContext;
Expand All @@ -14,17 +21,58 @@
@RequiredArgsConstructor
public class AgencyValidator {

private final @NonNull AgencyRepository agencyRepository;
private final @NonNull ApplicationContext applicationContext;

/**
* Validates an {@link AgencyDTO}.
*
* @param agencyDTO (required)
* @param agencyDto (required)
*/
public void validate(AgencyDTO agencyDTO) {
public void validate(AgencyDTO agencyDto) {
this.applicationContext
.getBeansOfType(ConcreteAgencyValidator.class)
.values()
.forEach(validator -> validator.validate(agencyDTO));
.stream()
.filter(c -> c.getClass().isAnnotationPresent(CreateAgencyValidator.class))
.forEach(validator -> validator.validate(fromAgencyDto(agencyDto)));
}

/**
* Validates an {@link UpdateAgencyDTO}.
*
* @param updateAgencyDTO (required)
*/
public void validate(Long agencyId, UpdateAgencyDTO updateAgencyDTO) {
this.applicationContext
.getBeansOfType(ConcreteAgencyValidator.class)
.values()
.stream()
.filter(c -> c.getClass().isAnnotationPresent(UpdateAgencyValidator.class))
.forEach(validator -> validator.validate(fromUpdateAgencyDto(agencyId, updateAgencyDTO)));
}

private ValidateAgencyDto fromAgencyDto(AgencyDTO agencyDto) {
return ValidateAgencyDto.builder()
.dioceseId(agencyDto.getDioceseId())
.name(agencyDto.getName())
.description(agencyDto.getDescription())
.postcode(agencyDto.getPostcode())
.city(agencyDto.getCity())
.teamAgency(agencyDto.getTeamAgency())
.consultingType(agencyDto.getConsultingType())
.build();
}

private ValidateAgencyDto fromUpdateAgencyDto(Long agencyId, UpdateAgencyDTO updateAgencyDTO) {
return ValidateAgencyDto.builder()
.id(agencyId)
.dioceseId(updateAgencyDTO.getDioceseId())
.name(updateAgencyDTO.getName())
.description(updateAgencyDTO.getDescription())
.postcode(updateAgencyDTO.getPostcode())
.city(updateAgencyDTO.getCity())
.offline(updateAgencyDTO.getOffline())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
package de.caritas.cob.agencyservice.api.admin.validation.validators;

import de.caritas.cob.agencyservice.api.admin.validation.validators.annotation.CreateAgencyValidator;
import de.caritas.cob.agencyservice.api.admin.validation.validators.model.ValidateAgencyDto;
import de.caritas.cob.agencyservice.api.exception.httpresponses.InvalidConsultingTypeException;
import de.caritas.cob.agencyservice.api.model.AgencyDTO;
import de.caritas.cob.agencyservice.api.repository.agency.ConsultingType;
import org.springframework.stereotype.Component;

/**
* Consulting type validator for an {@link AgencyDTO}.
* Consulting type validator for an {@link ValidateAgencyDto}.
*/
@Component
@CreateAgencyValidator
public class AgencyConsultingTypeValidator implements ConcreteAgencyValidator {

/**
* Validates the diocese id of an {@link AgencyDTO}.
* Validates the diocese id of an {@link ValidateAgencyDto}.
*
* @param agencyDTO (required)
* @param validateAgencyDto (required)
*/
public void validate(AgencyDTO agencyDTO) {
if (!ConsultingType.valueOf(agencyDTO.getConsultingType()).isPresent()) {
public void validate(ValidateAgencyDto validateAgencyDto) {
if (!ConsultingType.valueOf(validateAgencyDto.getConsultingType()).isPresent()) {
throw new InvalidConsultingTypeException();
}
}
Expand Down
Loading

0 comments on commit 5b6993d

Please sign in to comment.