diff --git a/.github/workflows/dockerImage.yml b/.github/workflows/dockerImage.yml index 90e787aa..3e9e0050 100644 --- a/.github/workflows/dockerImage.yml +++ b/.github/workflows/dockerImage.yml @@ -65,7 +65,7 @@ jobs: push_to_registry: strategy: matrix: - registry: ["docker.pkg.github.com", "ghcr.io"] + registry: ["ghcr.io"] needs: [test] name: Push Docker image to GitHub Packages runs-on: ubuntu-latest diff --git a/api/agencyadminservice.yaml b/api/agencyadminservice.yaml index 237dbf1c..835dbe9b 100644 --- a/api/agencyadminservice.yaml +++ b/api/agencyadminservice.yaml @@ -524,6 +524,9 @@ components: dataProtection: type: object $ref: '#/components/schemas/DataProtectionDTO' + agencyLogo: + type: string + example: "base64 encoded image" DataProtectionDTO: type: object @@ -630,6 +633,12 @@ components: items: type: string enum: [ RELATIVE_COUNSELLING, SELF_COUNSELLING, PARENTAL_COUNSELLING] + dataProtection: + type: object + $ref: '#/components/schemas/DataProtectionDTO' + agencyLogo: + type: string + example: "base64 encoded image" AgencyAdminFullResponseDTO: type: object @@ -693,6 +702,9 @@ components: dataProtection: type: object $ref: '#/components/schemas/DataProtectionDTO' + agencyLogo: + type: string + example: "base64 encoded image" DemographicsDTO: type: object diff --git a/api/agencyservice.yaml b/api/agencyservice.yaml index 4ca5efa9..35ab4208 100644 --- a/api/agencyservice.yaml +++ b/api/agencyservice.yaml @@ -15,7 +15,7 @@ paths: parameters: - name: postcode in: query - required: true + required: false description: The postcode the user entered schema: type: string @@ -175,6 +175,13 @@ components: agencySpecificPrivacy: type: string example: "specific for agency privacy text" + topicIds: + type: array + items: + type: long + agencyLogo: + type: string + example: "base64 encoded image" FullAgencyResponseDTO: type: object diff --git a/src/main/java/de/caritas/cob/agencyservice/api/admin/service/AgencyAdminService.java b/src/main/java/de/caritas/cob/agencyservice/api/admin/service/AgencyAdminService.java index 07b9438c..34967f15 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/admin/service/AgencyAdminService.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/admin/service/AgencyAdminService.java @@ -49,14 +49,13 @@ public class AgencyAdminService { private final @NonNull AgencyTopicMergeService agencyTopicMergeService; private final @NonNull AppointmentService appointmentService; + private final @NonNull DataProtectionConverter dataProtectionConverter; @Autowired(required = false) private AgencyTopicEnrichmentService agencyTopicEnrichmentService; @Autowired(required = false) private DemographicsConverter demographicsConverter; - @Autowired - private DataProtectionConverter dataProtectionConverter; @Value("${feature.topics.enabled}") private boolean featureTopicsEnabled; @@ -141,13 +140,15 @@ private Agency fromAgencyDTO(AgencyDTO agencyDTO) { .url(agencyDTO.getUrl()) .isExternal(agencyDTO.getExternal()) .counsellingRelations(Joiner.on(",").join(agencyDTO.getCounsellingRelations())) + .agencyLogo(agencyDTO.getAgencyLogo()) .createDate(LocalDateTime.now(ZoneOffset.UTC)) .updateDate(LocalDateTime.now(ZoneOffset.UTC)); + if (featureDemographicsEnabled && agencyDTO.getDemographics() != null) { demographicsConverter.convertToEntity(agencyDTO.getDemographics(), agencyBuilder); } - + dataProtectionConverter.convertToEntity(agencyDTO.getDataProtection(), agencyBuilder); var agencyToCreate = agencyBuilder.build(); if (featureTopicsEnabled) { @@ -208,11 +209,10 @@ private Agency mergeAgencies(Agency agency, UpdateAgencyDTO updateAgencyDTO) { .createDate(agency.getCreateDate()) .updateDate(LocalDateTime.now(ZoneOffset.UTC)) .counsellingRelations(agency.getCounsellingRelations()) - .deleteDate(agency.getDeleteDate()); + .deleteDate(agency.getDeleteDate()) + .agencyLogo(updateAgencyDTO.getAgencyLogo()); - if (dataProtectionConverter != null) { - dataProtectionConverter.convertToEntity(updateAgencyDTO.getDataProtection(), agencyBuilder); - } + dataProtectionConverter.convertToEntity(updateAgencyDTO.getDataProtection(), agencyBuilder); if (nonNull(updateAgencyDTO.getConsultingType())) { agencyBuilder.consultingTypeId(updateAgencyDTO.getConsultingType()); diff --git a/src/main/java/de/caritas/cob/agencyservice/api/admin/service/agency/AgencyAdminFullResponseDTOBuilder.java b/src/main/java/de/caritas/cob/agencyservice/api/admin/service/agency/AgencyAdminFullResponseDTOBuilder.java index ce0ef0b9..a7a6c9f9 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/admin/service/agency/AgencyAdminFullResponseDTOBuilder.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/admin/service/agency/AgencyAdminFullResponseDTOBuilder.java @@ -53,7 +53,8 @@ private AgencyAdminResponseDTO createAgency() { .createDate(String.valueOf(this.agency.getCreateDate())) .updateDate(String.valueOf(this.agency.getUpdateDate())) .deleteDate(String.valueOf(this.agency.getDeleteDate())) - .dataProtection(new DataProtectionDTOBuilder(this.agency).fromAgency()); + .dataProtection(new DataProtectionDTOBuilder(this.agency).fromAgency()) + .agencyLogo(this.agency.getAgencyLogo()); responseDTO.demographics(getDemographics(this.agency)); return responseDTO; diff --git a/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/AgencyValidator.java b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/AgencyValidator.java index 35044052..08c869bb 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/AgencyValidator.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/AgencyValidator.java @@ -4,8 +4,10 @@ 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.BadRequestException; import de.caritas.cob.agencyservice.api.model.AgencyDTO; import de.caritas.cob.agencyservice.api.model.UpdateAgencyDTO; +import de.caritas.cob.agencyservice.api.repository.agency.AgencyRepository; import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.springframework.context.ApplicationContext; @@ -20,6 +22,8 @@ public class AgencyValidator { private final @NonNull ApplicationContext applicationContext; + private final @NonNull AgencyRepository agencyRepository; + /** * Validates an {@link AgencyDTO}. * @@ -53,15 +57,19 @@ private ValidateAgencyDTO fromAgencyDto(AgencyDTO agencyDto) { .postcode(agencyDto.getPostcode()) .consultingType(agencyDto.getConsultingType()) .demographicsDTO(agencyDto.getDemographics()) + .tenantId(agencyDto.getTenantId()) .build(); } private ValidateAgencyDTO fromUpdateAgencyDto(Long agencyId, UpdateAgencyDTO updateAgencyDTO) { + var existingAgency = agencyRepository.findById(agencyId).orElseThrow(() -> new BadRequestException("Agency with id " + agencyId + "not found!")); return ValidateAgencyDTO.builder() .id(agencyId) .postcode(updateAgencyDTO.getPostcode()) .offline(updateAgencyDTO.getOffline()) + .tenantId(existingAgency.getTenantId()) .demographicsDTO(updateAgencyDTO.getDemographics()) + .dataProtectionDTO(updateAgencyDTO.getDataProtection()) .build(); } } diff --git a/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidationService.java b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidationService.java new file mode 100644 index 00000000..5e8bd07c --- /dev/null +++ b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidationService.java @@ -0,0 +1,83 @@ +package de.caritas.cob.agencyservice.api.admin.validation.validators; + +import static de.caritas.cob.agencyservice.api.model.DataProtectionDTO.DataProtectionResponsibleEntityEnum.AGENCY_RESPONSIBLE; +import static de.caritas.cob.agencyservice.api.model.DataProtectionDTO.DataProtectionResponsibleEntityEnum.ALTERNATIVE_REPRESENTATIVE; +import static de.caritas.cob.agencyservice.api.model.DataProtectionDTO.DataProtectionResponsibleEntityEnum.DATA_PROTECTION_OFFICER; +import static org.apache.commons.lang3.StringUtils.isBlank; + +import de.caritas.cob.agencyservice.api.admin.validation.validators.model.ValidateAgencyDTO; +import de.caritas.cob.agencyservice.api.exception.httpresponses.HttpStatusExceptionReason; +import de.caritas.cob.agencyservice.api.exception.httpresponses.InvalidOfflineStatusException; +import de.caritas.cob.agencyservice.api.model.DataProtectionContactDTO; +import de.caritas.cob.agencyservice.api.repository.agency.DataProtectionPlaceHolderType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class AgencyDataProtectionValidationService { + + public void validate(ValidateAgencyDTO validateAgencyDto) { + validateThatDataProtectionDtoExists(validateAgencyDto); + validateIfDataProtectionOfficer(validateAgencyDto); + validateIfAgencyResponsible(validateAgencyDto); + validateIfAlternativeRepresentative(validateAgencyDto); + } + + private void validateThatDataProtectionDtoExists(ValidateAgencyDTO validateAgencyDto) { + if (validateAgencyDto.getDataProtectionDTO() == null) { + log.warn( + "Could not save agency with id {} status. Required fields for data protection officer is empty.", + validateAgencyDto.getId()); + throw new InvalidOfflineStatusException( + HttpStatusExceptionReason.DATA_PROTECTION_DTO_IS_NULL); + } + } + + private void validateIfDataProtectionOfficer(ValidateAgencyDTO validateAgencyDto) { + if (DATA_PROTECTION_OFFICER.equals( + validateAgencyDto.getDataProtectionDTO().getDataProtectionResponsibleEntity()) + && areFieldsEmpty( + validateAgencyDto.getDataProtectionDTO().getDataProtectionOfficerContact())) { + log.warn( + "Could not save agency with id {}. Required fields for data protection officer is empty.", + validateAgencyDto.getId()); + throw new InvalidOfflineStatusException( + HttpStatusExceptionReason.DATA_PROTECTION_OFFICER_IS_EMPTY); + } + } + + private void validateIfAgencyResponsible(ValidateAgencyDTO validateAgencyDto) { + if (AGENCY_RESPONSIBLE.equals( + validateAgencyDto.getDataProtectionDTO().getDataProtectionResponsibleEntity()) + && areFieldsEmpty( + validateAgencyDto.getDataProtectionDTO().getAgencyDataProtectionResponsibleContact())) { + log.warn( + "Could not save agency with id {} status. Required fields for agency responsible is empty.", + validateAgencyDto.getId()); + throw new InvalidOfflineStatusException( + HttpStatusExceptionReason.DATA_PROTECTION_RESPONSIBLE_IS_EMPTY); + } + } + + private void validateIfAlternativeRepresentative(ValidateAgencyDTO validateAgencyDto) { + if (ALTERNATIVE_REPRESENTATIVE.equals( + validateAgencyDto.getDataProtectionDTO().getDataProtectionResponsibleEntity()) + && areFieldsEmpty(validateAgencyDto.getDataProtectionDTO() + .getAlternativeDataProtectionRepresentativeContact())) { + log.warn( + "Could not save agency with id {} status. Required fields for alternative responsible is empty.", + validateAgencyDto.getId()); + throw new InvalidOfflineStatusException( + HttpStatusExceptionReason.DATA_PROTECTION_ALTERNATIVE_RESPONSIBLE_IS_EMPTY); + } + } + + private boolean areFieldsEmpty(DataProtectionContactDTO dataProtectionOfficerContact) { + return dataProtectionOfficerContact == null + || isBlank(dataProtectionOfficerContact.getNameAndLegalForm()) + || isBlank(dataProtectionOfficerContact.getCity()) + || isBlank(dataProtectionOfficerContact.getPostcode()) + || isBlank(dataProtectionOfficerContact.getEmail()); + } +} diff --git a/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidator.java b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidator.java new file mode 100644 index 00000000..634c50d3 --- /dev/null +++ b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidator.java @@ -0,0 +1,48 @@ +package de.caritas.cob.agencyservice.api.admin.validation.validators; + +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.service.ApplicationSettingsService; +import de.caritas.cob.agencyservice.api.service.TenantService; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@UpdateAgencyValidator +@Slf4j +public class AgencyDataProtectionValidator implements ConcreteAgencyValidator { + + private final @NonNull TenantService tenantService; + + private final @NonNull ApplicationSettingsService applicationSettingsService; + + private final @NonNull AgencyDataProtectionValidationService agencyDataProtectionValidationService; + + @Value("${feature.multitenancy.with.single.domain.enabled}") + private boolean multitenancyWithSingleDomain; + + @Override + public void validate(ValidateAgencyDTO validateAgencyDto) { + + var tenant = tenantService.getRestrictedTenantDataByTenantId(validateAgencyDto.getTenantId()); + + if (Boolean.TRUE.equals(tenant.getSettings().getFeatureCentralDataProtectionTemplateEnabled())) { + log.info("Validating agency data protection for agency with id {}.", validateAgencyDto.getId()); + agencyDataProtectionValidationService.validate(validateAgencyDto); + } + + if (multitenancyWithSingleDomain) { + var mainTenantSubdomainForSingleDomainMultitenancy = applicationSettingsService.getApplicationSettings() + .getMainTenantSubdomainForSingleDomainMultitenancy(); + de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO mainTenant = tenantService.getRestrictedTenantDataBySubdomain( + mainTenantSubdomainForSingleDomainMultitenancy.getValue()); + if (Boolean.TRUE.equals(mainTenant.getSettings().getFeatureCentralDataProtectionTemplateEnabled())) { + agencyDataProtectionValidationService.validate(validateAgencyDto); + } + } + } +} diff --git a/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyOfflineStatusValidator.java b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyOfflineStatusValidator.java index 9f044d52..36595aec 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyOfflineStatusValidator.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyOfflineStatusValidator.java @@ -16,6 +16,7 @@ import de.caritas.cob.agencyservice.consultingtypeservice.generated.web.model.ExtendedConsultingTypeResponseDTO; import lombok.NonNull; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /* @@ -24,6 +25,7 @@ @Component @RequiredArgsConstructor @UpdateAgencyValidator +@Slf4j public class AgencyOfflineStatusValidator implements ConcreteAgencyValidator { private final @NonNull AgencyRepository agencyRepository; @@ -48,7 +50,6 @@ public void validate(ValidateAgencyDTO validateAgencyDto) { if (hasNoConsultant(validateAgencyDto)) { throw new InvalidOfflineStatusException(AGENCY_CONTAINS_NO_CONSULTANTS); } - } } diff --git a/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/model/ValidateAgencyDTO.java b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/model/ValidateAgencyDTO.java index 81a66182..af30d670 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/model/ValidateAgencyDTO.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/admin/validation/validators/model/ValidateAgencyDTO.java @@ -1,5 +1,6 @@ package de.caritas.cob.agencyservice.api.admin.validation.validators.model; +import de.caritas.cob.agencyservice.api.model.DataProtectionDTO; import de.caritas.cob.agencyservice.api.model.DemographicsDTO; import lombok.Builder; import lombok.Getter; @@ -18,6 +19,9 @@ public class ValidateAgencyDTO { private String postcode; private Integer consultingType; private Boolean offline; + private Long tenantId; private DemographicsDTO demographicsDTO; + private DataProtectionDTO dataProtectionDTO; + } diff --git a/src/main/java/de/caritas/cob/agencyservice/api/controller/AgencyController.java b/src/main/java/de/caritas/cob/agencyservice/api/controller/AgencyController.java index 41692cb3..bb50d200 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/controller/AgencyController.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/controller/AgencyController.java @@ -8,6 +8,7 @@ import de.caritas.cob.agencyservice.generated.api.controller.AgenciesApi; import io.swagger.annotations.Api; import java.util.List; +import java.util.Optional; import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -38,14 +39,14 @@ public class AgencyController implements AgenciesApi { */ @Override public ResponseEntity> getAgencies( - @RequestParam String postcode, @RequestParam Integer consultingType, + @RequestParam Integer consultingType, @RequestParam(required = false) String postcode, @RequestParam(value = "topicId", required = false) Integer topicId, @RequestParam(value = "age", required = false) Integer age, @RequestParam(value = "gender", required = false) String gender, @RequestParam(value = "counsellingRelation", required = false) String counsellingRelation ) { - var agencies = agencyService.getAgencies(postcode, consultingType, + var agencies = agencyService.getAgencies(Optional.ofNullable(postcode), consultingType, ofNullable(topicId), ofNullable(age), ofNullable(gender), ofNullable(counsellingRelation)); return !CollectionUtils.isEmpty(agencies) diff --git a/src/main/java/de/caritas/cob/agencyservice/api/exception/httpresponses/HttpStatusExceptionReason.java b/src/main/java/de/caritas/cob/agencyservice/api/exception/httpresponses/HttpStatusExceptionReason.java index 5aaa9d77..82479849 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/exception/httpresponses/HttpStatusExceptionReason.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/exception/httpresponses/HttpStatusExceptionReason.java @@ -11,5 +11,12 @@ public enum HttpStatusExceptionReason { AGENCY_CONTAINS_NO_CONSULTANTS, AGENCY_IS_ALREADY_TEAM_AGENCY, AGENCY_IS_ALREADY_DEFAULT_AGENCY, + DATA_PROTECTION_OFFICER_IS_EMPTY, + DATA_PROTECTION_RESPONSIBLE_IS_EMPTY, + + DATA_PROTECTION_ALTERNATIVE_RESPONSIBLE_IS_EMPTY, + + DATA_PROTECTION_DTO_IS_NULL, + AGENCY_ACCESS_DENIED } diff --git a/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/Agency.java b/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/Agency.java index a2723d72..5de6e9e5 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/Agency.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/Agency.java @@ -153,6 +153,9 @@ private Integer getPostCodeInteger() { @Column(name = "counselling_relations") private String counsellingRelations; + @Column(name = "agency_logo") + private String agencyLogo; + @Transient public boolean hasAnyDemographicsAttributes() { return getAgeTo() != null || getAgeFrom() != null || getGenders() != null; diff --git a/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/AgencyRepository.java b/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/AgencyRepository.java index 5bd07630..dce30e15 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/AgencyRepository.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/AgencyRepository.java @@ -4,7 +4,6 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; /** @@ -15,10 +14,10 @@ public interface AgencyRepository extends JpaRepository { String AND_WITH_BRACKET = "AND ("; String SELECT_WITH_TOPICS = "SELECT a.*, :tenantId FROM agency a " - + "INNER JOIN agency_postcode_range r ON a.id = r.agency_id " + + "LEFT JOIN agency_postcode_range r ON a.id = r.agency_id " + "INNER JOIN agency_topic at ON a.id = at.agency_id " - + "WHERE (CAST(:postcode AS INT) BETWEEN CAST(SUBSTR(r.postcode_from, 1, :length) AS int) " - + "AND CAST(SUBSTR(r.postcode_to, 1, :length) AS int)) " + "AND a.is_offline = false " + + "WHERE (:postcode is NULL OR ((CAST(:postcode AS INT) BETWEEN CAST(SUBSTR(r.postcode_from, 1, :length) AS int) " + + "AND CAST(SUBSTR(r.postcode_to, 1, :length) AS int)))) " + "AND a.is_offline = false " + "AND (:type is NULL OR a.consulting_type = :type) " + "AND at.topic_id = :topicId " + AND_WITH_BRACKET @@ -32,10 +31,10 @@ public interface AgencyRepository extends JpaRepository { + "AND a.delete_date IS NULL "; String SELECT_WITHOUT_TOPICS = "SELECT a.*, :tenantId FROM agency a " - + "INNER JOIN agency_postcode_range r ON a.id = r.agency_id " + + "LEFT JOIN agency_postcode_range r ON a.id = r.agency_id " + "WHERE " - + "(CAST(:postcode AS INT) BETWEEN CAST(SUBSTR(r.postcode_from, 1, :length) AS int) " - + "AND CAST(SUBSTR(r.postcode_to, 1, :length) AS int)) " + "AND a.is_offline = false " + + "(:postcode is NULL OR ((CAST(:postcode AS INT) BETWEEN CAST(SUBSTR(r.postcode_from, 1, :length) AS int) " + + "AND CAST(SUBSTR(r.postcode_to, 1, :length) AS int)))) " + "AND a.is_offline = false " + "AND (:type is NULL OR a.consulting_type = :type) " + AND_WITH_BRACKET + " (:age IS NULL) OR (a.age_from <= :age)" diff --git a/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/DataProtectionPlaceHolderType.java b/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/DataProtectionPlaceHolderType.java new file mode 100644 index 00000000..1b313ba7 --- /dev/null +++ b/src/main/java/de/caritas/cob/agencyservice/api/repository/agency/DataProtectionPlaceHolderType.java @@ -0,0 +1,28 @@ +package de.caritas.cob.agencyservice.api.repository.agency; + +import lombok.Getter; + +@Getter +public enum DataProtectionPlaceHolderType { + DATA_PROTECTION_RESPONSIBLE("responsible"), + DATA_PROTECTION_OFFICER("dataProtectionOfficer"); + + private final String placeholderVariable; + + DataProtectionPlaceHolderType(String placeholderVariable) { + this.placeholderVariable = placeholderVariable; + } + + public static boolean anyExistsInText(String privacy) { + return DATA_PROTECTION_RESPONSIBLE.existsInText(privacy) + || DATA_PROTECTION_OFFICER.existsInText(privacy); + } + + public boolean existsInText(String text) { + return text.contains(getPlaceholder()); + } + + public String getPlaceholder() { + return "${" + placeholderVariable + "}"; + } +} diff --git a/src/main/java/de/caritas/cob/agencyservice/api/service/AgencySearch.java b/src/main/java/de/caritas/cob/agencyservice/api/service/AgencySearch.java index 0331c9b6..c2bc11cf 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/service/AgencySearch.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/service/AgencySearch.java @@ -8,7 +8,7 @@ @Data public class AgencySearch { - private String postCode; + private Optional postCode; private Optional consultingTypeId; private Optional topicId; private Optional age; diff --git a/src/main/java/de/caritas/cob/agencyservice/api/service/AgencyService.java b/src/main/java/de/caritas/cob/agencyservice/api/service/AgencyService.java index 49dde67f..1d453a67 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/service/AgencyService.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/service/AgencyService.java @@ -16,6 +16,7 @@ import de.caritas.cob.agencyservice.api.model.FullAgencyResponseDTO; 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.agencytopic.AgencyTopic; import de.caritas.cob.agencyservice.api.tenant.TenantContext; import de.caritas.cob.agencyservice.consultingtypeservice.generated.web.model.ExtendedConsultingTypeResponseDTO; import de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO; @@ -102,7 +103,7 @@ public List getAgencies(int consultingTypeId) { } - public List getAgencies(String postCode, int consultingTypeId, + public List getAgencies(Optional postCode, int consultingTypeId, Optional topicId) { return getAgencies(postCode, consultingTypeId, topicId, Optional.empty(), Optional.empty(), Optional.empty()); } @@ -115,17 +116,19 @@ public List getAgencies(String postCode, int consultingTy * @param consultingTypeId the consulting type used for filtering agencies * @return a list containing regarding agencies */ - public List getAgencies(String postCode, int consultingTypeId, + public List getAgencies(Optional postCode, + Integer consultingTypeId, Optional topicId, Optional age, Optional gender, Optional counsellingRelation) { var consultingTypeSettings = retrieveConsultingTypeSettings( consultingTypeId); - - if (doesPostCodeNotMatchMinSize(postCode, consultingTypeSettings)) { + if (postCode.isPresent() && doesPostCodeNotMatchMinSize(postCode.get(), + consultingTypeSettings)) { return Collections.emptyList(); } + var agencies = findAgencies(postCode, getConsultingTypeIdForSearch(consultingTypeId), topicId, age, gender, counsellingRelation); Collections.shuffle(agencies); @@ -146,7 +149,7 @@ private Optional getConsultingTypeIdForSearch(int consultingTypeId) { return multitenancyWithSingleDomain ? Optional.empty() : Optional.of(consultingTypeId); } - private List findAgencies(String postCode, Optional consultingTypeId, + private List findAgencies(Optional postCode, Optional consultingTypeId, Optional optionalTopicId, Optional age, Optional gender, Optional counsellingRelation) { @@ -174,8 +177,8 @@ private List findAgencies(String postCode, Optional consultingT private List findAgencies(AgencySearch agencySearch) { try { return getAgencyRepositoryForSearch() - .searchWithoutTopic(agencySearch.getPostCode(), - agencySearch.getPostCode().length(), agencySearch.getConsultingTypeId().orElse(null), + .searchWithoutTopic(agencySearch.getPostCode().orElse(null), + agencySearch.getPostCode().orElse("").length(), agencySearch.getConsultingTypeId().orElse(null), agencySearch.getAge().orElse(null), agencySearch.getGender().orElse(null), agencySearch.getCounsellingRelation().orElse(null), @@ -237,7 +240,7 @@ public ExtendedConsultingTypeResponseDTO retrieveConsultingTypeSettings(int cons private List findAgenciesWithTopic(AgencySearch agencySearch) { try { return getAgencyRepositoryForSearch() - .searchWithTopic(agencySearch.getPostCode(), agencySearch.getPostCode().length(), + .searchWithTopic(agencySearch.getPostCode().orElse(null), agencySearch.getPostCode().orElse("").length(), agencySearch.getConsultingTypeId().orElse(null), agencySearch.getTopicId().orElseThrow(), agencySearch.getAge().orElse(null), agencySearch.getGender().orElse(null), @@ -307,7 +310,9 @@ private AgencyResponseDTO convertToAgencyResponseDTO(Agency agency) { .offline(agency.isOffline()) .tenantId(agency.getTenantId()) .consultingType(agency.getConsultingTypeId()) - .agencySpecificPrivacy(renderedAgencySpecificPrivacy); + .agencySpecificPrivacy(renderedAgencySpecificPrivacy) + .topicIds(agency.getAgencyTopics().stream().map(AgencyTopic::getTopicId).toList()) + .agencyLogo(agency.getAgencyLogo()); } protected String getRenderedAgencySpecificPrivacy(Agency agency) { @@ -336,7 +341,10 @@ private FullAgencyResponseDTO convertToFullAgencyResponseDTO(Agency agency) { .url(agency.getUrl()) .external(agency.isExternal()) .demographics(getDemographics(agency)) - .tenantId(agency.getTenantId()); + .tenantId(agency.getTenantId()) + .topicIds(agency.getAgencyTopics().stream().map(AgencyTopic::getTopicId).toList()) + .agencyLogo(agency.getAgencyLogo()); + } private DemographicsDTO getDemographics(Agency agency) { diff --git a/src/main/java/de/caritas/cob/agencyservice/api/service/CentralDataProtectionTemplateService.java b/src/main/java/de/caritas/cob/agencyservice/api/service/CentralDataProtectionTemplateService.java index c688d067..f685b7ee 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/service/CentralDataProtectionTemplateService.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/service/CentralDataProtectionTemplateService.java @@ -15,6 +15,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO; @@ -27,9 +28,23 @@ public class CentralDataProtectionTemplateService { private final @NonNull TemplateRenderer templateRenderer; + private final @NonNull ApplicationSettingsService applicationSettingsService; + + @Value("${feature.multitenancy.with.single.domain.enabled}") + private boolean multitenancyWithSingleDomain; + + private boolean isTenantLevelLegalContentOverrideAllowed() { + de.caritas.cob.agencyservice.applicationsettingsservice.generated.web.model.ApplicationSettingsDTOMultitenancyWithSingleDomainEnabled + legalContentChangesBySingleTenantAdminsAllowed = + applicationSettingsService + .getApplicationSettings() + .getLegalContentChangesBySingleTenantAdminsAllowed(); + return legalContentChangesBySingleTenantAdminsAllowed != null + && Boolean.TRUE.equals(legalContentChangesBySingleTenantAdminsAllowed.getValue()); + } + public String renderPrivacyTemplateWithRenderedPlaceholderValues(Agency agency) { - RestrictedTenantDTO restrictedTenantDataByTenantId = tenantService.getRestrictedTenantDataByTenantId( - agency.getTenantId()); + RestrictedTenantDTO restrictedTenantDataByTenantId = retrieveProperTenant(agency); if (restrictedTenantDataByTenantId != null && restrictedTenantDataByTenantId.getContent() != null) { return renderPrivacyTemplateWithRenderedPlaceholderValues(agency, @@ -42,7 +57,8 @@ public String renderPrivacyTemplateWithRenderedPlaceholderValues(Agency agency) @Nullable private String renderPrivacyTemplateWithRenderedPlaceholderValues(Agency agency, RestrictedTenantDTO restrictedTenantDataByTenantId) { - var renderedPlaceholdersMap = renderDataProtectionPlaceholdersFromTemplates(agency); + var renderedPlaceholdersMap = renderDataProtectionPlaceholdersFromTemplates(agency, + restrictedTenantDataByTenantId); Map dataModel = renderedPlaceholdersMap.entrySet().stream() .collect(Collectors.toMap(entry -> entry.getKey().getPlaceholderVariable(), Entry::getValue)); @@ -56,10 +72,26 @@ private String renderPrivacyTemplateWithRenderedPlaceholderValues(Agency agency, } } - protected Map renderDataProtectionPlaceholdersFromTemplates( + private de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO retrieveProperTenant( + Agency agency) { + if (multitenancyWithSingleDomain) { + return getAgencyTenantOrFallbackToMainTenantIfTenantPrivacyOverrideNotAllowed(agency); + } else { + return tenantService.getRestrictedTenantDataByTenantId(agency.getTenantId()); + } + } + + private de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO getAgencyTenantOrFallbackToMainTenantIfTenantPrivacyOverrideNotAllowed( Agency agency) { - RestrictedTenantDTO restrictedTenantDataByTenantId = tenantService.getRestrictedTenantDataByTenantId( - agency.getTenantId()); + if (isTenantLevelLegalContentOverrideAllowed()) { + return tenantService.getRestrictedTenantDataByTenantId(agency.getTenantId()); + } else { + return tenantService.getMainTenant(); + } + } + + protected Map renderDataProtectionPlaceholdersFromTemplates( + Agency agency, RestrictedTenantDTO restrictedTenantDataByTenantId) { Map result = Maps.newHashMap(); if (restrictedTenantDataByTenantId.getContent() != null @@ -67,15 +99,16 @@ protected Map renderDataProtectionPlaceho var renderedDataProtectionOfficerContact = renderDataProtectionOfficerContactFromTemplate( agency, restrictedTenantDataByTenantId.getContent().getDataProtectionContactTemplate()); - result.put(DataProtectionPlaceHolderType.DATA_PROTECTION_OFFICER, - renderedDataProtectionOfficerContact != null ? renderedDataProtectionOfficerContact : StringUtils.EMPTY); + renderedDataProtectionOfficerContact != null ? renderedDataProtectionOfficerContact + : StringUtils.EMPTY); var renderedDataProtectionResponsible = renderDataProtectionResponsibleFromTemplate( agency, restrictedTenantDataByTenantId.getContent().getDataProtectionContactTemplate()); result.put(DataProtectionPlaceHolderType.DATA_PROTECTION_RESPONSIBLE, - renderedDataProtectionResponsible != null ? renderedDataProtectionResponsible : StringUtils.EMPTY); + renderedDataProtectionResponsible != null ? renderedDataProtectionResponsible + : StringUtils.EMPTY); } return result; diff --git a/src/main/java/de/caritas/cob/agencyservice/api/service/TenantService.java b/src/main/java/de/caritas/cob/agencyservice/api/service/TenantService.java index 0e5f2525..0f3a9b9a 100644 --- a/src/main/java/de/caritas/cob/agencyservice/api/service/TenantService.java +++ b/src/main/java/de/caritas/cob/agencyservice/api/service/TenantService.java @@ -16,9 +16,15 @@ public class TenantService { private final @NonNull TenantServiceApiControllerFactory tenantServiceApiControllerFactory; + private final @NonNull ApplicationSettingsService applicationSettingsService; + @Value("${multitenancy.enabled}") private boolean multitenancy; + + @Value("${feature.multitenancy.with.single.domain.enabled}") + private boolean multitenancyWithSingleDomain; + @Cacheable(cacheNames = CacheManagerConfig.TENANT_CACHE, key = "#subdomain") public RestrictedTenantDTO getRestrictedTenantDataBySubdomain(String subdomain) { TenantControllerApi controllerApi = tenantServiceApiControllerFactory.createControllerApi(); @@ -34,4 +40,17 @@ public RestrictedTenantDTO getRestrictedTenantDataForSingleTenant() { TenantControllerApi controllerApi = tenantServiceApiControllerFactory.createControllerApi(); return controllerApi.getRestrictedSingleTenancyTenantData(); } + + public RestrictedTenantDTO getMainTenant() { + if (multitenancyWithSingleDomain) { + return getRestrictedTenantDataBySubdomain(getMainTenantSubdomain()); + } + throw new IllegalStateException("Main tenant can only be retrieved if multitenancy with single domain is enabled."); + } + + private String getMainTenantSubdomain() { + return applicationSettingsService + .getApplicationSettings() + .getMainTenantSubdomainForSingleDomainMultitenancy().getValue(); + } } diff --git a/src/main/resources/db/changelog/agencyservice-dev-master.xml b/src/main/resources/db/changelog/agencyservice-dev-master.xml index 159bc005..4f973230 100644 --- a/src/main/resources/db/changelog/agencyservice-dev-master.xml +++ b/src/main/resources/db/changelog/agencyservice-dev-master.xml @@ -24,4 +24,5 @@ --> + diff --git a/src/main/resources/db/changelog/agencyservice-local-master.xml b/src/main/resources/db/changelog/agencyservice-local-master.xml index 8e06fc5b..966f960b 100644 --- a/src/main/resources/db/changelog/agencyservice-local-master.xml +++ b/src/main/resources/db/changelog/agencyservice-local-master.xml @@ -23,4 +23,5 @@ --> + diff --git a/src/main/resources/db/changelog/agencyservice-prod-master.xml b/src/main/resources/db/changelog/agencyservice-prod-master.xml index e0758e35..735a1e68 100644 --- a/src/main/resources/db/changelog/agencyservice-prod-master.xml +++ b/src/main/resources/db/changelog/agencyservice-prod-master.xml @@ -20,4 +20,5 @@ --> + diff --git a/src/main/resources/db/changelog/agencyservice-staging-master.xml b/src/main/resources/db/changelog/agencyservice-staging-master.xml index c84782e1..d7245283 100644 --- a/src/main/resources/db/changelog/agencyservice-staging-master.xml +++ b/src/main/resources/db/changelog/agencyservice-staging-master.xml @@ -20,4 +20,5 @@ --> + diff --git a/src/main/resources/db/changelog/changeset/0017_add_agency_logo/0017_changeSet.xml b/src/main/resources/db/changelog/changeset/0017_add_agency_logo/0017_changeSet.xml new file mode 100644 index 00000000..938fd256 --- /dev/null +++ b/src/main/resources/db/changelog/changeset/0017_add_agency_logo/0017_changeSet.xml @@ -0,0 +1,7 @@ + + + + diff --git a/src/main/resources/db/changelog/changeset/0017_add_agency_logo/addAgencyLogo-rollback.sql b/src/main/resources/db/changelog/changeset/0017_add_agency_logo/addAgencyLogo-rollback.sql new file mode 100644 index 00000000..1705c288 --- /dev/null +++ b/src/main/resources/db/changelog/changeset/0017_add_agency_logo/addAgencyLogo-rollback.sql @@ -0,0 +1,2 @@ +ALTER TABLE `agencyservice`.`agency` +DROP COLUMN `agency_logo`; \ No newline at end of file diff --git a/src/main/resources/db/changelog/changeset/0017_add_agency_logo/addAgencyLogo.sql b/src/main/resources/db/changelog/changeset/0017_add_agency_logo/addAgencyLogo.sql new file mode 100644 index 00000000..996fd91e --- /dev/null +++ b/src/main/resources/db/changelog/changeset/0017_add_agency_logo/addAgencyLogo.sql @@ -0,0 +1,2 @@ +ALTER TABLE `agencyservice`.`agency` +ADD COLUMN `agency_logo` longtext NULL; \ No newline at end of file diff --git a/src/test/java/de/caritas/cob/agencyservice/api/admin/service/AgencyAdminServiceTest.java b/src/test/java/de/caritas/cob/agencyservice/api/admin/service/AgencyAdminServiceTest.java index edf30c75..0ef74ef9 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/admin/service/AgencyAdminServiceTest.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/admin/service/AgencyAdminServiceTest.java @@ -26,15 +26,14 @@ import de.caritas.cob.agencyservice.api.model.AgencyAdminResponseDTO; import de.caritas.cob.agencyservice.api.model.AgencyTypeRequestDTO; import de.caritas.cob.agencyservice.api.model.DataProtectionContactDTO; +import de.caritas.cob.agencyservice.api.model.DataProtectionDTO; import de.caritas.cob.agencyservice.api.model.DemographicsDTO; import de.caritas.cob.agencyservice.api.model.UpdateAgencyDTO; import de.caritas.cob.agencyservice.api.model.AgencyDTO; 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.AgencyTenantUnawareRepository; import de.caritas.cob.agencyservice.api.repository.agency.DataProtectionResponsibleEntity; import de.caritas.cob.agencyservice.api.service.AppointmentService; -import de.caritas.cob.agencyservice.api.service.LogService; import de.caritas.cob.agencyservice.api.util.JsonConverter; import java.util.List; import java.util.Optional; @@ -108,6 +107,7 @@ void updateAgency_Should_ThrowNotFoundException_WhenAgencyIsNotFound() { @Test void createAgency_Should_CreateAgencyAndAddDefaultCounsellingRelations() { + // given var agency = this.easyRandom.nextObject(Agency.class); agency.setCounsellingRelations(null); agency.setDataProtectionOfficerContactData(null); @@ -115,11 +115,15 @@ void createAgency_Should_CreateAgencyAndAddDefaultCounsellingRelations() { var agencyDTO = this.easyRandom.nextObject(AgencyDTO.class); agencyDTO.setCounsellingRelations(null); agencyDTO.setConsultingType(1); + agencyDTO.setDataProtection(new DataProtectionDTO()); when(agencyRepository.save(any())).thenReturn(agency); + // when agencyAdminService.createAgency(agencyDTO); + // then verify(agencyRepository).save(agencyArgumentCaptor.capture()); assertThat(agencyArgumentCaptor.getValue().getCounsellingRelations(), is("RELATIVE_COUNSELLING,SELF_COUNSELLING,PARENTAL_COUNSELLING")); + verify(dataProtectionConverter).convertToEntity(Mockito.any(DataProtectionDTO.class), Mockito.any(Agency.AgencyBuilder.class)); } @Test diff --git a/src/test/java/de/caritas/cob/agencyservice/api/admin/service/agency/AgencyAdminFullResponseDTOBuilderTest.java b/src/test/java/de/caritas/cob/agencyservice/api/admin/service/agency/AgencyAdminFullResponseDTOBuilderTest.java index 7780435c..32b9b838 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/admin/service/agency/AgencyAdminFullResponseDTOBuilderTest.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/admin/service/agency/AgencyAdminFullResponseDTOBuilderTest.java @@ -57,6 +57,7 @@ private void assertBaseDTOAttributesAreMapped(AgencyAdminFullResponseDTO result) assertEquals(agency.getUrl(), result.getEmbedded().getUrl()); assertEquals(agency.isExternal(), result.getEmbedded().getExternal()); assertEquals(agency.getConsultingTypeId(), result.getEmbedded().getConsultingType()); + assertEquals(agency.getAgencyLogo(), result.getEmbedded().getAgencyLogo()); assertThat(result.getEmbedded().getCounsellingRelations()).containsOnly(AgencyAdminResponseDTO.CounsellingRelationsEnum.PARENTAL_COUNSELLING, AgencyAdminResponseDTO.CounsellingRelationsEnum.RELATIVE_COUNSELLING); assertEquals(String.valueOf(agency.getCreateDate()), result.getEmbedded().getCreateDate()); assertEquals(String.valueOf(agency.getUpdateDate()), result.getEmbedded().getUpdateDate()); diff --git a/src/test/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidationServiceTest.java b/src/test/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidationServiceTest.java new file mode 100644 index 00000000..48dced04 --- /dev/null +++ b/src/test/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidationServiceTest.java @@ -0,0 +1,133 @@ +package de.caritas.cob.agencyservice.api.admin.validation.validators; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +import de.caritas.cob.agencyservice.api.admin.validation.validators.model.ValidateAgencyDTO; +import de.caritas.cob.agencyservice.api.exception.httpresponses.HttpStatusExceptionReason; +import de.caritas.cob.agencyservice.api.exception.httpresponses.InvalidOfflineStatusException; +import de.caritas.cob.agencyservice.api.model.DataProtectionContactDTO; +import de.caritas.cob.agencyservice.api.model.DataProtectionDTO; +import de.caritas.cob.agencyservice.api.model.DataProtectionDTO.DataProtectionResponsibleEntityEnum; +import de.caritas.cob.agencyservice.tenantservice.generated.web.model.Content; +import de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO; +import org.assertj.core.api.Fail; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class AgencyDataProtectionValidationServiceTest { + + @InjectMocks + AgencyDataProtectionValidationService agencyDataProtectionValidator; + + @Test + void validate_Should_NotValidate_When_DataProtectionOfficerIsNotSet() { + // given + ValidateAgencyDTO agencyToValidate = ValidateAgencyDTO.builder() + .dataProtectionDTO(new DataProtectionDTO().dataProtectionResponsibleEntity( + DataProtectionResponsibleEntityEnum.DATA_PROTECTION_OFFICER)).build(); + + // when + try { + agencyDataProtectionValidator.validate( + agencyToValidate); + } catch (InvalidOfflineStatusException e) { + // then + assertThat(e.getHttpStatusExceptionReason()).isEqualTo(HttpStatusExceptionReason.DATA_PROTECTION_OFFICER_IS_EMPTY); + } + } + + private de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO tenantWithPrivacy( + String privacy) { + return new RestrictedTenantDTO().content(new Content().privacy(privacy)); + } + + @Test + void validate_Should_Validate_When_DataProtectionOfficerIsSet() { + // given + ValidateAgencyDTO agencyToValidate = ValidateAgencyDTO.builder() + .dataProtectionDTO(new DataProtectionDTO().dataProtectionResponsibleEntity(DataProtectionResponsibleEntityEnum.DATA_PROTECTION_OFFICER) + .dataProtectionOfficerContact(new DataProtectionContactDTO().nameAndLegalForm("name").email("email").city("city").postcode("postcode"))).build(); + // when + try { + agencyDataProtectionValidator.validate( + agencyToValidate); + } catch (Exception e) { + // then + Fail.fail("Should not throw exception"); + } + } + + @Test + void validate_Should_Validate_When_DataResponsibleIsSet() { + // given + ValidateAgencyDTO agencyToValidate = ValidateAgencyDTO.builder() + .dataProtectionDTO(new DataProtectionDTO().dataProtectionResponsibleEntity( + DataProtectionResponsibleEntityEnum.AGENCY_RESPONSIBLE).agencyDataProtectionResponsibleContact(new DataProtectionContactDTO().nameAndLegalForm("name").email("email").city("city").postcode("postcode")) + ).build(); + // when + try { + agencyDataProtectionValidator.validate( + agencyToValidate); + } catch (Exception e) { + // then + Fail.fail("Should not throw exception"); + } + } + + + @Test + void validate_Should_NotValidate_When_DataResponsibleIsNotSet() { + // given + ValidateAgencyDTO agencyToValidate = ValidateAgencyDTO.builder() + .dataProtectionDTO(new DataProtectionDTO().dataProtectionResponsibleEntity( + DataProtectionResponsibleEntityEnum.AGENCY_RESPONSIBLE) + ).build(); + // when + try { + agencyDataProtectionValidator.validate( + agencyToValidate); + } catch (InvalidOfflineStatusException e) { + // then + assertThat(e.getHttpStatusExceptionReason()).isEqualTo(HttpStatusExceptionReason.DATA_PROTECTION_RESPONSIBLE_IS_EMPTY); + } + } + + @Test + void validate_Should_NotValidate_When_AlternativeDataResponsibleIsNotSet() { + // given + ValidateAgencyDTO agencyToValidate = ValidateAgencyDTO.builder() + .dataProtectionDTO(new DataProtectionDTO().dataProtectionResponsibleEntity( + DataProtectionResponsibleEntityEnum.ALTERNATIVE_REPRESENTATIVE)).build(); + // when + try { + agencyDataProtectionValidator.validate(agencyToValidate); + } catch (InvalidOfflineStatusException e) { + // then + assertThat(e.getHttpStatusExceptionReason()).isEqualTo(HttpStatusExceptionReason.DATA_PROTECTION_ALTERNATIVE_RESPONSIBLE_IS_EMPTY); + } + } + + + @Test + void validate_Should_Validate_When_AlternativeDataResponsibleIsSet() { + // given + ValidateAgencyDTO agencyToValidate = ValidateAgencyDTO.builder() + .dataProtectionDTO(new DataProtectionDTO().dataProtectionResponsibleEntity( + DataProtectionResponsibleEntityEnum.ALTERNATIVE_REPRESENTATIVE) + .alternativeDataProtectionRepresentativeContact( + new DataProtectionContactDTO().nameAndLegalForm("name").city("city") + .postcode("postcode").email("email"))).build(); + + // when + try { + agencyDataProtectionValidator.validate( + agencyToValidate); + } catch (Exception e) { + // then + Fail.fail("Should not throw exception"); + } + } +} \ No newline at end of file diff --git a/src/test/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidatorTest.java b/src/test/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidatorTest.java new file mode 100644 index 00000000..29ef1967 --- /dev/null +++ b/src/test/java/de/caritas/cob/agencyservice/api/admin/validation/validators/AgencyDataProtectionValidatorTest.java @@ -0,0 +1,109 @@ +package de.caritas.cob.agencyservice.api.admin.validation.validators; + +import de.caritas.cob.agencyservice.api.admin.validation.validators.model.ValidateAgencyDTO; +import de.caritas.cob.agencyservice.api.model.DataProtectionDTO; +import de.caritas.cob.agencyservice.api.model.DataProtectionDTO.DataProtectionResponsibleEntityEnum; +import de.caritas.cob.agencyservice.api.service.ApplicationSettingsService; +import de.caritas.cob.agencyservice.api.service.TenantService; +import de.caritas.cob.agencyservice.applicationsettingsservice.generated.web.model.ApplicationSettingsDTO; +import de.caritas.cob.agencyservice.applicationsettingsservice.generated.web.model.ApplicationSettingsDTOMainTenantSubdomainForSingleDomainMultitenancy; +import de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO; +import de.caritas.cob.agencyservice.tenantservice.generated.web.model.Settings; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; + +@ExtendWith(MockitoExtension.class) +class AgencyDataProtectionValidatorTest { + + @InjectMocks + AgencyDataProtectionValidator agencyDataProtectionValidator; + + private @Mock AgencyDataProtectionValidationService agencyDataProtectionValidationService; + + private @Mock TenantService tenantService; + + private @Mock ApplicationSettingsService applicationSettingsService; + + @Test + void validate_Should_ValidateForAgencyTenant_When_NonSingleDomainMultitenancy_And_CentralDataProtectionFeatureEnabled() { + // given + ValidateAgencyDTO agencyToValidate = ValidateAgencyDTO.builder() + .dataProtectionDTO(new DataProtectionDTO().dataProtectionResponsibleEntity( + DataProtectionResponsibleEntityEnum.DATA_PROTECTION_OFFICER)).build(); + ReflectionTestUtils.setField(agencyDataProtectionValidator, "multitenancyWithSingleDomain", + false); + givenAgencyTenant(agencyToValidate, true); + // when + agencyDataProtectionValidator.validate(agencyToValidate); + // then + Mockito.verify(agencyDataProtectionValidationService, Mockito.times(1)) + .validate(agencyToValidate); + } + + @Test + void validate_Should_NotValidateForAgencyTenant_When_NonSingleDomainMultitenancy_And_CentralDataProtectionFeatureDisabled() { + // given + ValidateAgencyDTO agencyToValidate = ValidateAgencyDTO.builder() + .dataProtectionDTO(new DataProtectionDTO().dataProtectionResponsibleEntity( + DataProtectionResponsibleEntityEnum.DATA_PROTECTION_OFFICER)).build(); + ReflectionTestUtils.setField(agencyDataProtectionValidator, "multitenancyWithSingleDomain", + false); + givenAgencyTenant(agencyToValidate, false); + // when + agencyDataProtectionValidator.validate(agencyToValidate); + // then + Mockito.verify(agencyDataProtectionValidationService, Mockito.never()) + .validate(agencyToValidate); + } + + @ParameterizedTest + @CsvSource({ + "true,true,2", + "true,false,1", + "false,true,1", + "false,false,0", + }) + void validate_Should_ValidateForAgencyTenantAndMainTenant_When_SingleDomainMultitenancy(boolean isAgencyTenantCentralDataProtectionEnabled, boolean isMainTenantCentralDataProtectionEnabled, int expectedValidationCalls) { + // given + ValidateAgencyDTO agencyToValidate = ValidateAgencyDTO.builder() + .dataProtectionDTO(new DataProtectionDTO().dataProtectionResponsibleEntity( + DataProtectionResponsibleEntityEnum.DATA_PROTECTION_OFFICER)).build(); + ReflectionTestUtils.setField(agencyDataProtectionValidator, "multitenancyWithSingleDomain", + true); + givenAgencyTenant(agencyToValidate, isAgencyTenantCentralDataProtectionEnabled); + givenSingleDomainWithValue("app"); + givenMainTenant("app", isMainTenantCentralDataProtectionEnabled); + // when + agencyDataProtectionValidator.validate(agencyToValidate); + // then + + Mockito.verify(agencyDataProtectionValidationService, Mockito.times(expectedValidationCalls)) + .validate(agencyToValidate); + } + + + + private void givenAgencyTenant(ValidateAgencyDTO agency, boolean isCentralDataProtectionEnabled) { + Mockito.when(tenantService.getRestrictedTenantDataByTenantId(agency.getTenantId())) + .thenReturn(new RestrictedTenantDTO().settings(new Settings().featureCentralDataProtectionTemplateEnabled(isCentralDataProtectionEnabled))); + } + + private void givenMainTenant(String domain, boolean isCentralDataProtectionEnabled) { + Mockito.when(tenantService.getRestrictedTenantDataBySubdomain(domain)) + .thenReturn(new RestrictedTenantDTO().settings(new Settings().featureCentralDataProtectionTemplateEnabled(isCentralDataProtectionEnabled))); + } + + private void givenSingleDomainWithValue(String domain) { + Mockito.when(applicationSettingsService.getApplicationSettings()).thenReturn( + new ApplicationSettingsDTO().mainTenantSubdomainForSingleDomainMultitenancy( + new ApplicationSettingsDTOMainTenantSubdomainForSingleDomainMultitenancy().value( + domain))); + } +} \ No newline at end of file diff --git a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerIT.java b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerIT.java index f5005e2b..01397182 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerIT.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerIT.java @@ -3,6 +3,7 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.when; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; @@ -16,6 +17,7 @@ import de.caritas.cob.agencyservice.api.admin.service.UserAdminService; import de.caritas.cob.agencyservice.api.model.DataProtectionContactDTO; import de.caritas.cob.agencyservice.api.model.DataProtectionDTO; +import de.caritas.cob.agencyservice.api.service.TenantService; import de.caritas.cob.agencyservice.api.util.AuthenticatedUser; import de.caritas.cob.agencyservice.api.manager.consultingtype.ConsultingTypeManager; import de.caritas.cob.agencyservice.api.model.AgencyDTO; @@ -24,10 +26,12 @@ import de.caritas.cob.agencyservice.api.tenant.TenantContext; import de.caritas.cob.agencyservice.consultingtypeservice.generated.web.model.ExtendedConsultingTypeResponseDTO; import de.caritas.cob.agencyservice.api.util.JsonConverter; +import de.caritas.cob.agencyservice.tenantservice.generated.web.model.Settings; import de.caritas.cob.agencyservice.testHelper.PathConstants; import org.jeasy.random.EasyRandom; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -68,6 +72,9 @@ class AgencyAdminControllerIT { @Autowired private AgencyRepository agencyRepository; + @MockBean + private TenantService tenantService; + @BeforeEach public void setup() { TenantContext.clear(); @@ -75,6 +82,8 @@ public void setup() { .webAppContextSetup(context) .apply(springSecurity()) .build(); + when(tenantService.getRestrictedTenantDataByTenantId(Mockito.any())) + .thenReturn(new de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO().settings(new Settings().featureCentralDataProtectionTemplateEnabled(false))); } @Test @@ -96,7 +105,8 @@ void getAgencyById_Should_ReturnAgencyData() throws Exception { .andExpect(jsonPath("_embedded.topics").exists()) .andExpect(jsonPath("_embedded.createDate").exists()) .andExpect(jsonPath("_embedded.updateDate").exists()) - .andExpect(jsonPath("_embedded.deleteDate").exists()); + .andExpect(jsonPath("_embedded.deleteDate").exists()) + .andExpect(jsonPath("_embedded.agencyLogo").exists()); } @Test @@ -115,7 +125,8 @@ void createAgency_Should_returnStatusCreated_When_calledWithValidCreateParamsAnd .teamAgency(true) .consultingType(0) .url("https://www.test.de") - .external(true); + .external(true) + .agencyLogo("base64 encoded logo"); String payload = JsonConverter.convertToJson(agencyDTO); // when, then @@ -136,7 +147,8 @@ void createAgency_Should_returnStatusCreated_When_calledWithValidCreateParamsAnd .andExpect(jsonPath("_embedded.topics").exists()) .andExpect(jsonPath("_embedded.createDate").exists()) .andExpect(jsonPath("_embedded.updateDate").exists()) - .andExpect(jsonPath("_embedded.deleteDate").exists()); + .andExpect(jsonPath("_embedded.deleteDate").exists()) + .andExpect(jsonPath("_embedded.agencyLogo").value("base64 encoded logo")); } @Test @@ -245,12 +257,81 @@ void updateAgency_Should_returnStatusOk_When_calledWithEmptyDescription() throws assertNull(savedAgency.getDescription()); } + @Test + @WithMockUser(authorities = "AUTHORIZATION_AGENCY_ADMIN") + void updateAgency_Should_returnStatusOk_When_CentralDataProtectionIsEnabled_And_PayloadContainsValidDataProtectionContent() throws Exception { + var response = new ExtendedConsultingTypeResponseDTO(); + + Long tenantId = agencyRepository.findById(1L).get().getTenantId(); + when(consultingTypeManager.getConsultingTypeSettings(anyInt())).thenReturn(response); + + when(tenantService.getRestrictedTenantDataByTenantId(tenantId)) + .thenReturn(new de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO().settings(new Settings().featureCentralDataProtectionTemplateEnabled(true))); + + var agencyDTO = new UpdateAgencyDTO() + .name("Test update name") + .description(null) + .offline(true) + .agencyLogo("base64 encoded logo") + .external(false) + .dataProtection(new DataProtectionDTO().dataProtectionResponsibleEntity(DataProtectionDTO.DataProtectionResponsibleEntityEnum.DATA_PROTECTION_OFFICER) + .dataProtectionOfficerContact(new DataProtectionContactDTO().nameAndLegalForm("data protection contact").city("Munich") + .postcode("00001").phoneNumber("321-321-321").email("dataprotection@onlineberatung.net"))); + + + mockMvc.perform(put(PathConstants.UPDATE_DELETE_AGENCY_PATH) + .contentType(APPLICATION_JSON) + .content(JsonConverter.convertToJson(agencyDTO))) + .andExpect(status().isOk()) + .andExpect(jsonPath("_embedded.id").value(1)) + .andExpect(jsonPath("_embedded.name").value("Test update name")) + .andExpect(jsonPath("_embedded.description").isEmpty()) + .andExpect(jsonPath("_embedded.teamAgency").value("false")) + .andExpect(jsonPath("_embedded.external").value("false")) + .andExpect(jsonPath("_embedded.offline").exists()) + .andExpect(jsonPath("_embedded.topics").exists()) + .andExpect(jsonPath("_embedded.createDate").exists()) + .andExpect(jsonPath("_embedded.updateDate").exists()) + .andExpect(jsonPath("_embedded.deleteDate").exists()) + .andExpect(jsonPath("_embedded.agencyLogo").value("base64 encoded logo")); + + var savedAgency = agencyRepository.findById(1L).orElseThrow(); + assertNull(savedAgency.getDescription()); + } + + @Test + @WithMockUser(authorities = "AUTHORIZATION_AGENCY_ADMIN") + void updateAgency_Should_returnStatusBadRequest_When_CentralDataProtectionIsEnabled_And_PayloadContainsInvalidDataProtectionContent() throws Exception { + var response = new ExtendedConsultingTypeResponseDTO(); + + Long tenantId = agencyRepository.findById(1L).get().getTenantId(); + when(consultingTypeManager.getConsultingTypeSettings(anyInt())).thenReturn(response); + + when(tenantService.getRestrictedTenantDataByTenantId(tenantId)) + .thenReturn(new de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO().settings(new Settings().featureCentralDataProtectionTemplateEnabled(true))); + + var agencyDTO = new UpdateAgencyDTO() + .name("Test update name") + .description(null) + .offline(true) + .external(false) + .dataProtection(new DataProtectionDTO().dataProtectionResponsibleEntity(DataProtectionDTO.DataProtectionResponsibleEntityEnum.DATA_PROTECTION_OFFICER) + .dataProtectionOfficerContact(new DataProtectionContactDTO())); + + + mockMvc.perform(put(PathConstants.UPDATE_DELETE_AGENCY_PATH) + .contentType(APPLICATION_JSON) + .content(JsonConverter.convertToJson(agencyDTO))) + .andExpect(status().isBadRequest()); + } + @Test @WithMockUser(authorities = "AUTHORIZATION_AGENCY_ADMIN") void updateAgency_Should_persistDataProtectionAttributes_When_payloadContainsDataProtection() throws Exception { var response = new ExtendedConsultingTypeResponseDTO(); when(consultingTypeManager.getConsultingTypeSettings(anyInt())).thenReturn(response); + var agencyDTO = new UpdateAgencyDTO() .name("Test update name") .description(null) diff --git a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerWithDemographicsIT.java b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerWithDemographicsIT.java index 85ca391e..489b4f90 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerWithDemographicsIT.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerWithDemographicsIT.java @@ -12,6 +12,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import de.caritas.cob.agencyservice.api.service.TenantService; import de.caritas.cob.agencyservice.api.util.AuthenticatedUser; import de.caritas.cob.agencyservice.api.manager.consultingtype.ConsultingTypeManager; import de.caritas.cob.agencyservice.api.model.AgencyDTO; @@ -25,6 +26,7 @@ import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -58,6 +60,9 @@ class AgencyAdminControllerWithDemographicsIT { @MockBean AuthenticatedUser authenticatedUser; + @MockBean + TenantService tenantService; + @BeforeEach public void setup() { TenantContext.clear(); @@ -65,6 +70,9 @@ public void setup() { .webAppContextSetup(context) .apply(springSecurity()) .build(); + when(tenantService.getRestrictedTenantDataByTenantId(Mockito.any())) + .thenReturn(new de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO().settings(new de.caritas.cob.agencyservice.tenantservice.generated.web.model.Settings().featureCentralDataProtectionTemplateEnabled(false))); + } @Test diff --git a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerWithTopicsIT.java b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerWithTopicsIT.java index e7daf7b7..6d47367b 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerWithTopicsIT.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyAdminControllerWithTopicsIT.java @@ -11,6 +11,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import de.caritas.cob.agencyservice.api.service.TenantService; import de.caritas.cob.agencyservice.api.util.AuthenticatedUser; import de.caritas.cob.agencyservice.api.manager.consultingtype.ConsultingTypeManager; import de.caritas.cob.agencyservice.api.model.AgencyDTO; @@ -23,6 +24,7 @@ import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -59,6 +61,9 @@ class AgencyAdminControllerWithTopicsIT { @MockBean private AuthenticatedUser authenticatedUser; + @MockBean + private TenantService tenantService; + @BeforeEach public void setup() { TenantContext.clear(); @@ -66,6 +71,8 @@ public void setup() { .webAppContextSetup(context) .apply(springSecurity()) .build(); + when(tenantService.getRestrictedTenantDataByTenantId(Mockito.any())) + .thenReturn(new de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO().settings(new de.caritas.cob.agencyservice.tenantservice.generated.web.model.Settings().featureCentralDataProtectionTemplateEnabled(false))); } @Test diff --git a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyControllerIT.java b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyControllerIT.java index 34c2d59f..f6ae2b9d 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyControllerIT.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyControllerIT.java @@ -80,7 +80,7 @@ class AgencyControllerIT { @Test void getAgencies_Should_ReturnNoContent_When_ServiceReturnsEmptyList() throws Exception { - when(agencyService.getAgencies(Mockito.anyString(), Mockito.anyInt(), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class))) + when(agencyService.getAgencies(Mockito.any(Optional.class), Mockito.anyInt(), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class))) .thenReturn(null); mvc.perform( @@ -112,11 +112,11 @@ void getAgencies_Should_ReturnBadRequest_When_ConsultingTypeParamIsInvalid() } @Test - void getAgencies_Should_ReturnBadRequest_When_PostcodeParamIsNotProvided() + void getAgencies_Should_ReturnRespondWith2XXResponseCode_When_PostcodeParamIsNotProvided() throws Exception { mvc.perform(get(PATH_GET_LIST_OF_AGENCIES + "?" + VALID_CONSULTING_TYPE_QUERY) - .accept(MediaType.APPLICATION_JSON)).andExpect(status().isBadRequest()); + .accept(MediaType.APPLICATION_JSON)).andExpect(status().isNoContent()); } @Test @@ -133,7 +133,7 @@ void getAgencies_Should_ReturnListAndOk_When_ServiceReturnsList() throws Excepti List agencies = new ArrayList<>(); agencies.add(FULL_AGENCY_RESPONSE_DTO); - when(agencyService.getAgencies(Mockito.anyString(), Mockito.anyInt(), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class))) + when(agencyService.getAgencies(Mockito.any(Optional.class), Mockito.anyInt(), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class))) .thenReturn(agencies); mvc.perform( @@ -143,7 +143,7 @@ void getAgencies_Should_ReturnListAndOk_When_ServiceReturnsList() throws Excepti .andExpect(status().isOk()) .andExpect(jsonPath("[0].name").value(AGENCY_RESPONSE_DTO.getName())); - verify(agencyService, atLeastOnce()).getAgencies(Mockito.anyString(), + verify(agencyService, atLeastOnce()).getAgencies(Mockito.any(Optional.class), Mockito.anyInt(), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class), Mockito.any(Optional.class)); } diff --git a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyControllerWithDemographicsIT.java b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyControllerWithDemographicsIT.java index ab6150b7..5d09e747 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyControllerWithDemographicsIT.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/controller/AgencyControllerWithDemographicsIT.java @@ -16,6 +16,8 @@ import de.caritas.cob.agencyservice.api.manager.consultingtype.ConsultingTypeManager; import de.caritas.cob.agencyservice.api.tenant.TenantContext; + +import jakarta.transaction.Transactional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -26,6 +28,8 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; @@ -33,6 +37,7 @@ @TestPropertySource(properties = "feature.demographics.enabled=true") @AutoConfigureMockMvc(addFilters = false) @ActiveProfiles("testing") +@Transactional class AgencyControllerWithDemographicsIT { private MockMvc mvc; @@ -87,17 +92,21 @@ void getAgencies_Should_ReturnNoContent_When_GenderParamsIsProvidedButNotMatchin @Test void getAgencies_Should_ReturnOk_When_MatchingSearchParametersAreProvided() throws Exception { - mvc.perform( - get(PATH_GET_LIST_OF_AGENCIES + "?" + "postcode=99999" + "&" - + "consultingType=19" + "&" + VALID_AGE_QUERY + "&" + VALID_GENDER_QUERY) - .accept(MediaType.APPLICATION_JSON)) + ResultActions perform = mvc.perform( + get(PATH_GET_LIST_OF_AGENCIES + "?" + "postcode=99999" + "&" + + "consultingType=19" + "&" + VALID_AGE_QUERY + "&" + VALID_GENDER_QUERY) + .accept(MediaType.APPLICATION_JSON)); + perform .andExpect(status().isOk()) .andExpect(jsonPath("$", hasSize(1))) .andExpect(jsonPath("$[0].id").value(1737)) + .andExpect(jsonPath("$[0].topicIds").isArray()) .andExpect(jsonPath("$[0].demographics.ageFrom").value(30)) .andExpect(jsonPath("$[0].demographics.ageTo").value(60)) .andExpect(jsonPath("$[0].demographics.genders[0]").value("FEMALE")) .andExpect(jsonPath("$[0].demographics.genders[1]").value("DIVERS")); + } + } diff --git a/src/test/java/de/caritas/cob/agencyservice/api/repository/agency/AgencyRepositoryIT.java b/src/test/java/de/caritas/cob/agencyservice/api/repository/agency/AgencyRepositoryIT.java index 2685e6bd..f0db961d 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/repository/agency/AgencyRepositoryIT.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/repository/agency/AgencyRepositoryIT.java @@ -55,6 +55,14 @@ void searchWithoutTopic_Should_findAgencyByPostcodeAndConsultingType() { assertThat(agencyList).hasSize(2); } + @Test + void searchWithoutTopic_Should_findAgencyByOnlyConsultingTypeSkippingPostCodeFiltering() { + // given, when + var agencyList = agencyRepository.searchWithoutTopic(null, 5, 0, null, null, null, 1L); + // then + assertThat(agencyList).hasSize(104); + } + @Test void searchWithTopic_Should_findAgencyByPostcodeAndConsultingTypeAndTopicId() { @@ -66,6 +74,14 @@ void searchWithTopic_Should_findAgencyByPostcodeAndConsultingTypeAndTopicId() { assertThat(agencyList.get(0).getAgencyTopics()).extracting("topicId").containsExactly(0L, 1L); } + @Test + void searchWithTopic_Should_findAgencyConsultingTypeAndTopicIdSkippingPostCode() { + // given, when + var agencyList = agencyRepository.searchWithTopic(null, 5, 0, 1, null, null, null, 1L); + // then + assertThat(agencyList).hasSize(2); + } + @Test void searchWithTopic_Should_findAgencyByPostcodeAndConsultingTypeAndTopicId_When_ConsultingTypeIsNotProvided() { // given, when diff --git a/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceITBase.java b/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceITBase.java index ac337d1d..f51fdb95 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceITBase.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceITBase.java @@ -40,7 +40,7 @@ public void getAgencies_Should_returnMatchingAgencies_When_postcodeAndConsulting String postCode = "88662"; List resultAgencies = agencyService - .getAgencies(postCode, CONSULTING_TYPE_PREGNANCY, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()); + .getAgencies(Optional.of(postCode), CONSULTING_TYPE_PREGNANCY, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()); assertThat(resultAgencies, hasSize(1)); FullAgencyResponseDTO resultAgency = resultAgencies.get(0); diff --git a/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceTenantAwareTest.java b/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceTenantAwareTest.java index ada39cc0..cfcfa262 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceTenantAwareTest.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceTenantAwareTest.java @@ -77,7 +77,7 @@ public void getAgencies_Should_throwBadRequestException_When_topicIdNotProvidedA restrictedTenantDTO); // when - this.agencyService.getAgencies("12123", 1, Optional.empty()); + this.agencyService.getAgencies(Optional.of("12123"), 1, Optional.empty()); // then verify(agencyRepository).searchWithTopic("12123", 5, 1, 2, null, @@ -99,7 +99,7 @@ public void getAgencies_Should_searchByTopicId_When_topicIdProvidedAndFeatureEna restrictedTenantDTO); // when - this.agencyService.getAgencies("12123", 1, Optional.of(2), Optional.empty(), Optional.empty(), Optional.empty()); + this.agencyService.getAgencies(Optional.of("12123"), 1, Optional.of(2), Optional.empty(), Optional.empty(), Optional.empty()); // then verify(agencyRepository).searchWithTopic("12123", 5, 1, 2, null, diff --git a/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceTest.java b/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceTest.java index 51d77be9..e4aa639b 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceTest.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/service/AgencyServiceTest.java @@ -49,6 +49,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Optional; +import javax.swing.text.html.Option; import org.hamcrest.collection.IsEmptyCollection; import org.jeasy.random.EasyRandom; import org.junit.After; @@ -117,7 +118,7 @@ public void getListOfAgencies_Should_ReturnServiceExceptionAndLogDatabaseError_O private void callGetAgencies() { Optional emptyTopicIds = Optional.empty(); try { - agencyService.getAgencies(VALID_POSTCODE, CONSULTING_TYPE_SUCHT, emptyTopicIds); + agencyService.getAgencies(Optional.of(VALID_POSTCODE), CONSULTING_TYPE_SUCHT, emptyTopicIds); fail("Expected exception: ServiceException"); } catch (InternalServerErrorException internalServerErrorException) { assertTrue("Excepted ServiceException thrown", true); @@ -163,9 +164,9 @@ public void getListOfAgencies_Should_ReturnListOfFullAgencyResponseDTO_WhenDBSel when(consultingTypeManager.getConsultingTypeSettings(Mockito.anyInt())) .thenReturn(CONSULTING_TYPE_SETTINGS_WITH_WHITESPOT_AGENCY); - assertThat(agencyService.getAgencies(VALID_POSTCODE, CONSULTING_TYPE_SUCHT, Optional.empty()), + assertThat(agencyService.getAgencies(Optional.of(VALID_POSTCODE), CONSULTING_TYPE_SUCHT, Optional.empty()), everyItem(instanceOf(FullAgencyResponseDTO.class))); - assertThat(agencyService.getAgencies(VALID_POSTCODE, CONSULTING_TYPE_SUCHT, Optional.empty())) + assertThat(agencyService.getAgencies(Optional.of(VALID_POSTCODE), CONSULTING_TYPE_SUCHT, Optional.empty())) .extracting(POSTCODE).contains(POSTCODE); } @@ -181,7 +182,7 @@ public void getListOfAgencies_Should_ReturnWhiteSpotAgency_WhenNoAgencyFoundForG when(consultingTypeManager.getConsultingTypeSettings(Mockito.anyInt())) .thenReturn(CONSULTING_TYPE_SETTINGS_WITH_WHITESPOT_AGENCY); - assertThat(agencyService.getAgencies(VALID_POSTCODE, CONSULTING_TYPE_SUCHT, Optional.empty())) + assertThat(agencyService.getAgencies(Optional.of(VALID_POSTCODE), CONSULTING_TYPE_SUCHT, Optional.empty())) .extracting(FIELD_AGENCY_ID).contains(AGENCY_ID); } @@ -194,7 +195,7 @@ public void getListOfAgencies_Should_ReturnEmptyList_WhenNoAgencyFoundForGivenPo when(consultingTypeManager.getConsultingTypeSettings(Mockito.anyInt())) .thenReturn(CONSULTING_TYPE_SETTINGS_WITHOUT_WHITESPOT_AGENCY); - assertThat(agencyService.getAgencies(VALID_POSTCODE, CONSULTING_TYPE_SUCHT, Optional.empty()), + assertThat(agencyService.getAgencies(Optional.of(VALID_POSTCODE), CONSULTING_TYPE_SUCHT, Optional.empty()), IsEmptyCollection.empty()); } @@ -205,7 +206,7 @@ public void getListOfAgencies_Should_ReturnEmptyList_When_PostcodeSizeIsSmallerT when(consultingTypeManager.getConsultingTypeSettings(Mockito.anyInt())) .thenReturn(CONSULTING_TYPE_SETTINGS_EMIGRATION); - assertThat(agencyService.getAgencies(VALID_POSTCODE, CONSULTING_TYPE_EMIGRATION, Optional.empty()), + assertThat(agencyService.getAgencies(Optional.of(VALID_POSTCODE), CONSULTING_TYPE_EMIGRATION, Optional.empty()), IsEmptyCollection.empty()); } @@ -268,7 +269,7 @@ public void getAgencies_Should_ThrowInternalServerError_When_MissingConsultingTy when(consultingTypeManager.getConsultingTypeSettings(anyInt())) .thenThrow(new MissingConsultingTypeException("")); - agencyService.getAgencies("", 0, Optional.empty()); + agencyService.getAgencies(Optional.of(""), 0, Optional.empty()); } @Test @@ -310,7 +311,7 @@ public void getAgencies_Should_throwBadRequestException_When_TopicIdNotProvidedA when(tenantService.getRestrictedTenantDataForSingleTenant()).thenReturn(restrictedTenantDTO); // when - this.agencyService.getAgencies("12123", 1, Optional.empty()); + this.agencyService.getAgencies(Optional.of("12123"), 1, Optional.empty()); } @Test @@ -326,7 +327,7 @@ public void getAgencies_Should_searchByTopicId_When_TopicIdProvidedAndFeatureEna when(tenantService.getRestrictedTenantDataForSingleTenant()).thenReturn(restrictedTenantDTO); // when - this.agencyService.getAgencies("12123", 1, Optional.of(2)); + this.agencyService.getAgencies(Optional.of("12123"), 1, Optional.of(2)); // then verify(agencyRepository).searchWithTopic("12123", 5, 1, 2, AGE, GENDER, COUNSELLING_RELATION, diff --git a/src/test/java/de/caritas/cob/agencyservice/api/service/CentralDataProtectionTemplateServiceTest.java b/src/test/java/de/caritas/cob/agencyservice/api/service/CentralDataProtectionTemplateServiceTest.java index fc4c5511..b1ce330c 100644 --- a/src/test/java/de/caritas/cob/agencyservice/api/service/CentralDataProtectionTemplateServiceTest.java +++ b/src/test/java/de/caritas/cob/agencyservice/api/service/CentralDataProtectionTemplateServiceTest.java @@ -8,11 +8,14 @@ import de.caritas.cob.agencyservice.api.repository.agency.Agency; import de.caritas.cob.agencyservice.api.repository.agency.DataProtectionResponsibleEntity; import de.caritas.cob.agencyservice.api.util.JsonConverter; +import de.caritas.cob.agencyservice.applicationsettingsservice.generated.web.model.ApplicationSettingsDTO; +import de.caritas.cob.agencyservice.applicationsettingsservice.generated.web.model.ApplicationSettingsDTOMultitenancyWithSingleDomainEnabled; import de.caritas.cob.agencyservice.tenantservice.generated.web.model.AgencyContextDTO; import de.caritas.cob.agencyservice.tenantservice.generated.web.model.Content; import de.caritas.cob.agencyservice.tenantservice.generated.web.model.DataProtectionContactTemplateDTO; import de.caritas.cob.agencyservice.tenantservice.generated.web.model.DataProtectionOfficerDTO; import de.caritas.cob.agencyservice.tenantservice.generated.web.model.RestrictedTenantDTO; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +25,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; @RunWith(SpringRunner.class) @SpringBootTest @@ -37,6 +41,18 @@ class CentralDataProtectionTemplateServiceTest { @MockBean TenantService tenantService; + @MockBean + ApplicationSettingsService applicationSettingsService; + + @BeforeEach + void setup() { + ReflectionTestUtils.setField(centralDataProtectionTemplateService, + "multitenancyWithSingleDomain", false); + when(applicationSettingsService.getApplicationSettings()).thenReturn( + new ApplicationSettingsDTO().legalContentChangesBySingleTenantAdminsAllowed( + new ApplicationSettingsDTOMultitenancyWithSingleDomainEnabled().value(true))); + } + @Test void renderDataProtectionPrivacy_shouldProperlyRenderPrivacy_When_PlaceholdersAreRendered() { @@ -57,7 +73,8 @@ void renderDataProtectionPrivacy_shouldProperlyRenderPrivacy_When_PlaceholdersAr .name("agencyName") .dataProtectionResponsibleEntity(DataProtectionResponsibleEntity.DATA_PROTECTION_OFFICER) .dataProtectionOfficerContactData(JsonConverter.convertToJson(dataProtectionContactDTO)) - .dataProtectionAgencyResponsibleContactData(JsonConverter.convertToJson(dataProtectionContactDTO)) + .dataProtectionAgencyResponsibleContactData( + JsonConverter.convertToJson(dataProtectionContactDTO)) .build(); // when @@ -70,6 +87,47 @@ void renderDataProtectionPrivacy_shouldProperlyRenderPrivacy_When_PlaceholdersAr "Privacy template with placeholders: Data protection officer contact name: Max Mustermann, Data protection responsible contact name: Max Mustermann,"); } + @Test + void renderDataProtectionPrivacy_shouldProperlyRenderPrivacyTakingTemplateFromMainTenant_When_MultitenancySingleDomainAndTenantLevelPrivacyOverrideNotAllowed() { + // given + ReflectionTestUtils.setField(centralDataProtectionTemplateService, + "multitenancyWithSingleDomain", true); + when(applicationSettingsService.getApplicationSettings()).thenReturn( + new ApplicationSettingsDTO().legalContentChangesBySingleTenantAdminsAllowed( + new ApplicationSettingsDTOMultitenancyWithSingleDomainEnabled().value(false))); + + when(tenantService.getMainTenant()).thenReturn( + new RestrictedTenantDTO() + .content( + new Content().dataProtectionContactTemplate(getDataProtectionContactTemplate()) + .privacy( + "Privacy template with placeholders from main tenant: ${dataProtectionOfficer} ${responsible}"))); + DataProtectionContactDTO dataProtectionContactDTO = new DataProtectionContactDTO() + .nameAndLegalForm("Max Mustermann"); + + Agency agency = Agency.builder() + .id(1000L) + .tenantId(1L) + .consultingTypeId(1) + .name("agencyName") + .dataProtectionResponsibleEntity(DataProtectionResponsibleEntity.DATA_PROTECTION_OFFICER) + .dataProtectionOfficerContactData(JsonConverter.convertToJson(dataProtectionContactDTO)) + .dataProtectionAgencyResponsibleContactData( + JsonConverter.convertToJson(dataProtectionContactDTO)) + .build(); + + // when + var renderedPrivacy = centralDataProtectionTemplateService.renderPrivacyTemplateWithRenderedPlaceholderValues( + agency); + + // then + assertThat( + renderedPrivacy).isEqualTo( + "Privacy template with placeholders from main tenant: Data protection officer contact name: Max Mustermann, Data protection responsible contact name: Max Mustermann,"); + + } + + @Test void renderDataProtectionPrivacy_shouldReturnPrivacyAsItIs_When_PlaceholdersAreNotIncludedInPrivacy() { @@ -90,7 +148,8 @@ void renderDataProtectionPrivacy_shouldReturnPrivacyAsItIs_When_PlaceholdersAreN .name("agencyName") .dataProtectionResponsibleEntity(DataProtectionResponsibleEntity.DATA_PROTECTION_OFFICER) .dataProtectionOfficerContactData(JsonConverter.convertToJson(dataProtectionContactDTO)) - .dataProtectionAgencyResponsibleContactData(JsonConverter.convertToJson(dataProtectionContactDTO)) + .dataProtectionAgencyResponsibleContactData( + JsonConverter.convertToJson(dataProtectionContactDTO)) .build(); // when @@ -107,10 +166,11 @@ void renderDataProtectionPrivacy_shouldReturnPrivacyAsItIs_When_PlaceholdersAreN void renderDataProtectionTemplatePlaceholders_shouldProperlyRenderPlaceholders_If_SomeVariableDataIsMissing() { // given + RestrictedTenantDTO tenantDTO = new RestrictedTenantDTO() + .content( + new Content().dataProtectionContactTemplate(getDataProtectionContactTemplate())); when(tenantService.getRestrictedTenantDataByTenantId(anyLong())).thenReturn( - new RestrictedTenantDTO() - .content( - new Content().dataProtectionContactTemplate(getDataProtectionContactTemplate()))); + tenantDTO); DataProtectionContactDTO dataProtectionContactDTO = new DataProtectionContactDTO() .nameAndLegalForm("Max Mustermann"); @@ -121,12 +181,13 @@ void renderDataProtectionTemplatePlaceholders_shouldProperlyRenderPlaceholders_I .name("agencyName") .dataProtectionResponsibleEntity(DataProtectionResponsibleEntity.DATA_PROTECTION_OFFICER) .dataProtectionOfficerContactData(JsonConverter.convertToJson(dataProtectionContactDTO)) - .dataProtectionAgencyResponsibleContactData(JsonConverter.convertToJson(dataProtectionContactDTO)) + .dataProtectionAgencyResponsibleContactData( + JsonConverter.convertToJson(dataProtectionContactDTO)) .build(); // when var renderedPlaceholders = centralDataProtectionTemplateService.renderDataProtectionPlaceholdersFromTemplates( - agency); + agency, tenantDTO); // then assertThat( @@ -140,10 +201,11 @@ void renderDataProtectionTemplatePlaceholders_shouldProperlyRenderPlaceholders_I void renderDataProtectionTemplatePlaceholders_shouldProperlyRenderPlaceholders() { // given + RestrictedTenantDTO tenantDTO = new RestrictedTenantDTO() + .content( + new Content().dataProtectionContactTemplate(getDataProtectionContactTemplate())); when(tenantService.getRestrictedTenantDataByTenantId(anyLong())).thenReturn( - new RestrictedTenantDTO() - .content( - new Content().dataProtectionContactTemplate(getDataProtectionContactTemplate()))); + tenantDTO); DataProtectionContactDTO dataProtectionContactDTO = new DataProtectionContactDTO() .nameAndLegalForm("Max Mustermann") .street("Musterstraße 1") @@ -158,12 +220,13 @@ void renderDataProtectionTemplatePlaceholders_shouldProperlyRenderPlaceholders() .name("agencyName") .dataProtectionResponsibleEntity(DataProtectionResponsibleEntity.DATA_PROTECTION_OFFICER) .dataProtectionOfficerContactData(JsonConverter.convertToJson(dataProtectionContactDTO)) - .dataProtectionAgencyResponsibleContactData(JsonConverter.convertToJson(dataProtectionContactDTO)) + .dataProtectionAgencyResponsibleContactData( + JsonConverter.convertToJson(dataProtectionContactDTO)) .build(); // when var renderedPlaceholders = centralDataProtectionTemplateService.renderDataProtectionPlaceholdersFromTemplates( - agency); + agency, tenantDTO); // then assertThat( @@ -178,10 +241,11 @@ void renderDataProtectionTemplatePlaceholders_shouldProperlyRenderPlaceholders() void renderDataProtectionTemplatePlaceholders_shouldReturnPlaceholderTemplate_IfDataProtectionAgencyContactDataIsNotSet() { // given + RestrictedTenantDTO tenantDTO = new RestrictedTenantDTO() + .content( + new Content().dataProtectionContactTemplate(getDataProtectionContactTemplate())); when(tenantService.getRestrictedTenantDataByTenantId(anyLong())).thenReturn( - new RestrictedTenantDTO() - .content( - new Content().dataProtectionContactTemplate(getDataProtectionContactTemplate()))); + tenantDTO); Agency agency = Agency.builder() .id(1000L) @@ -193,7 +257,7 @@ void renderDataProtectionTemplatePlaceholders_shouldReturnPlaceholderTemplate_If // when var renderedPlaceholders = centralDataProtectionTemplateService.renderDataProtectionPlaceholdersFromTemplates( - agency); + agency, tenantDTO); // then assertThat( @@ -208,10 +272,11 @@ void renderDataProtectionTemplatePlaceholders_shouldReturnPlaceholderTemplate_If void renderDataProtectionTemplatePlaceholders_shouldReturnPlaceholderTemplate_IfNoDataOnAgency() { // given + RestrictedTenantDTO tenantDTO = new RestrictedTenantDTO() + .content( + new Content().dataProtectionContactTemplate(getDataProtectionContactTemplate())); when(tenantService.getRestrictedTenantDataByTenantId(anyLong())).thenReturn( - new RestrictedTenantDTO() - .content( - new Content().dataProtectionContactTemplate(getDataProtectionContactTemplate()))); + tenantDTO); Agency agency = Agency.builder() .id(1000L) @@ -223,7 +288,7 @@ void renderDataProtectionTemplatePlaceholders_shouldReturnPlaceholderTemplate_If // when var renderedPlaceholders = centralDataProtectionTemplateService.renderDataProtectionPlaceholdersFromTemplates( - agency); + agency, tenantDTO); // then assertThat( diff --git a/src/test/java/de/caritas/cob/agencyservice/testHelper/TestConstants.java b/src/test/java/de/caritas/cob/agencyservice/testHelper/TestConstants.java index 74daa903..6854ceca 100644 --- a/src/test/java/de/caritas/cob/agencyservice/testHelper/TestConstants.java +++ b/src/test/java/de/caritas/cob/agencyservice/testHelper/TestConstants.java @@ -11,6 +11,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.assertj.core.util.Lists; public class TestConstants { @@ -166,17 +167,18 @@ public class TestConstants { public static final Agency AGENCY_KREUZBUND = new Agency(AGENCY_ID, AGENCY_NAME, AGENCY_DESCRIPTION, POSTCODE, "Test city", false, CONSULTING_TYPE_KREUZBUND, false, null, false, null, null, null, - null, null, null, null, null, null, null, null, null, null, null); + null, null, null, null, null, null, null, null, null, null, null, null); public static final Agency AGENCY_ONLINE_U25 = new Agency(AGENCY_ID, AGENCY_NAME, AGENCY_DESCRIPTION, POSTCODE, "Test city", - false, CONSULTING_TYPE_U25, false, null, false, null, null, null, null, null, null, null, null, null, null, null, null, null, null); + false, CONSULTING_TYPE_U25, false, null, false, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); public static final Agency AGENCY_OFFLINE = new Agency(AGENCY_ID, AGENCY_NAME, AGENCY_DESCRIPTION, - POSTCODE, "Test city", false, CONSULTING_TYPE_SUCHT, true, null, false, null, null, null, null, null, null, null, null, null, null, null, null, null, null); + POSTCODE, "Test city", false, CONSULTING_TYPE_SUCHT, true, null, false, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); public static final AgencyResponseDTO AGENCY_RESPONSE_DTO = new AgencyResponseDTO().id(AGENCY_ID).name(AGENCY_NAME).postcode(POSTCODE) .city(AGENCY_CITY).description(AGENCY_DESCRIPTION).teamAgency(false).offline(false) - .consultingType(CONSULTING_TYPE_SUCHT); + .consultingType(CONSULTING_TYPE_SUCHT) + .topicIds(Lists.newArrayList(1L, 2L)); public static final List AGENCY_RESPONSE_DTO_LIST = Collections.singletonList( AGENCY_RESPONSE_DTO); public static final FullAgencyResponseDTO FULL_AGENCY_RESPONSE_DTO = diff --git a/src/test/resources/database/AgencyDatabase.sql b/src/test/resources/database/AgencyDatabase.sql index 8f228608..a4a870ce 100644 --- a/src/test/resources/database/AgencyDatabase.sql +++ b/src/test/resources/database/AgencyDatabase.sql @@ -32,6 +32,7 @@ create table AGENCY DATA_PROTECTION_AGENCY_CONTACT longtext null default null, DATA_PROTECTION_OFFICER_CONTACT longtext null default null, DATA_PROTECTION_ALTERNATIVE_CONTACT longtext null default null, + AGENCY_LOGO longtext null default null, primary key (ID) ); CREATE SEQUENCE SEQUENCE_AGENCY @@ -70,7 +71,7 @@ CREATE SEQUENCE SEQUENCE_AGENCY_TOPIC INSERT INTO AGENCY (ID, TENANT_ID, NAME, DESCRIPTION, POSTCODE, CITY, IS_TEAM_AGENCY, CONSULTING_TYPE, IS_OFFLINE, URL, IS_EXTERNAL, ID_OLD, CREATE_DATE, UPDATE_DATE, DELETE_DATE, COUNSELLING_RELATIONS) VALUES (0, null, 'Fachambulanz Sucht Caritas/Diakonie Bonn', 'Beratung , Behandlung und Betreuung von Alkohol-, Drogen- und Medikamentenabhängige , Spielsüchtige und Angehörige.', '53113', 'Bonn', 1, 0, 0, null, 0, 9, '2018-12-11 10:19:13', '2019-06-24 12:53:58', null, 'PARENTAL_COUNSELLING,SELF_COUNSELLING'); -INSERT INTO AGENCY (ID, TENANT_ID, NAME, DESCRIPTION, POSTCODE, CITY, IS_TEAM_AGENCY, CONSULTING_TYPE, IS_OFFLINE, URL, IS_EXTERNAL, ID_OLD, CREATE_DATE, UPDATE_DATE, DELETE_DATE, COUNSELLING_RELATIONS) VALUES (1, null, 'JUGEND SUCHT BERATUNG Köln, SKM e.V. Köln', 'Offene Sprechstunden für Jugendliche und junge Erwachsene: Dienstag 16.00-18.00 Uhr Mittwoch 16.00-17.00 Uhr Freitag 13.00-14.00 Uhr', '50672', 'Köln', 0, 0, 0, null, 0, 10, '2018-12-11 10:19:13', '2019-06-24 12:53:58', null, 'RELATIVE_COUNSELLING,SELF_COUNSELLING'); +INSERT INTO AGENCY (ID, TENANT_ID, NAME, DESCRIPTION, POSTCODE, CITY, IS_TEAM_AGENCY, CONSULTING_TYPE, IS_OFFLINE, URL, IS_EXTERNAL, ID_OLD, CREATE_DATE, UPDATE_DATE, DELETE_DATE, COUNSELLING_RELATIONS, AGENCY_LOGO) VALUES (1, null, 'JUGEND SUCHT BERATUNG Köln, SKM e.V. Köln', 'Offene Sprechstunden für Jugendliche und junge Erwachsene: Dienstag 16.00-18.00 Uhr Mittwoch 16.00-17.00 Uhr Freitag 13.00-14.00 Uhr', '50672', 'Köln', 0, 0, 0, null, 0, 10, '2018-12-11 10:19:13', '2019-06-24 12:53:58', null, 'RELATIVE_COUNSELLING,SELF_COUNSELLING', 'base64 encoded logo'); INSERT INTO AGENCY (ID, TENANT_ID, NAME, DESCRIPTION, POSTCODE, CITY, IS_TEAM_AGENCY, CONSULTING_TYPE, IS_OFFLINE, URL, IS_EXTERNAL, ID_OLD, CREATE_DATE, UPDATE_DATE, DELETE_DATE, COUNSELLING_RELATIONS) VALUES (2, null, 'Caritas Suchthilfe des Rheinisch-Bergischer Kreises', null, '51465', 'Bergisch Gladbach', 0, 0, 0, null, 0, 11, '2018-12-11 10:19:13', '2019-06-24 12:53:58', null, 'RELATIVE_COUNSELLING');