From f998dd28d3c202960882c22d786043c2ddd2af6c Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Fri, 11 Mar 2022 11:26:28 +0200 Subject: [PATCH] dossier status count --- .../dossiertemplate/dossier/Dossier.java | 1 + .../dossier/DossierVisibility.java | 6 ++ .../api/resources/DossierStatusResource.java | 8 +- .../entity/dossier/DossierEntity.java | 5 ++ .../DossierStatusPersistenceService.java | 7 +- .../repository/DossierStatusRepository.java | 4 +- .../acl/AclMethodSecurityConfiguration.java | 80 +++++++++++++++++++ .../controller/DossierStatusController.java | 7 +- .../12-dossier-visibility.changelog.yaml | 12 +++ 9 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierVisibility.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/acl/AclMethodSecurityConfiguration.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/12-dossier-visibility.changelog.yaml diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/Dossier.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/Dossier.java index f0524deaf..6e784c930 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/Dossier.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/Dossier.java @@ -37,5 +37,6 @@ public class Dossier { private OffsetDateTime archivedTime; private String dossierTemplateId; private String dossierStatusId; + private DossierVisibility visibility; } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierVisibility.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierVisibility.java new file mode 100644 index 000000000..cbe81b2a3 --- /dev/null +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierVisibility.java @@ -0,0 +1,6 @@ +package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier; + +public enum DossierVisibility { + + PRIVATE, PUBLIC; +} diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatusResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatusResource.java index b47ecb119..249e48e2d 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatusResource.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/DossierStatusResource.java @@ -11,7 +11,6 @@ import java.util.List; public interface DossierStatusResource { String DOSSIER_STATUS_PATH = "/dossier-status"; - String DOSSIER_TEMPLATE_PATH = "/dossier-template"; String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; @@ -22,6 +21,7 @@ public interface DossierStatusResource { String DOSSIER_STATUS_REPLACE_ID = "replaceDossierStatusId"; + @ResponseBody @ResponseStatus(HttpStatus.ACCEPTED) @PostMapping(value = DOSSIER_STATUS_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) @@ -32,6 +32,12 @@ public interface DossierStatusResource { @GetMapping(value = DOSSIER_STATUS_PATH + DOSSIER_TEMPLATE_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) List getAllDossierStatusForTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId); + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @PostMapping(value = DOSSIER_STATUS_PATH + DOSSIER_TEMPLATE_PATH, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + List getAllDossierStatuses(@RequestBody List dossierTemplateId); + @ResponseBody @ResponseStatus(value = HttpStatus.OK) @GetMapping(value = DOSSIER_STATUS_PATH + DOSSIER_STATUS_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java index d688d10a1..97b5a9d67 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java @@ -6,6 +6,7 @@ import com.iqser.red.service.persistence.management.v1.processor.utils.JSONDownl import com.iqser.red.service.persistence.management.v1.processor.utils.JSONStringSetConverter; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus; +import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierVisibility; import lombok.*; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; @@ -84,6 +85,10 @@ public class DossierEntity { @Column private OffsetDateTime dueDate; + @Column + @Enumerated(EnumType.STRING) + private DossierVisibility visibility; + @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) private DossierTemplateEntity dossierTemplate; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java index 3a20e42ec..d96aaf9a6 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java @@ -13,6 +13,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.transaction.Transactional; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -56,7 +57,11 @@ public class DossierStatusPersistenceService { } public List getAllDossierStatusForTemplate(String dossierTemplateId) { - return dossierStatusRepository.getAllDossierStatusForDossierTemplate(dossierTemplateId); + return dossierStatusRepository.getAllDossierStatusForDossierTemplate(Collections.singletonList(dossierTemplateId)); + } + + public List getAllDossierStatuses(List dossierTemplateIds) { + return dossierStatusRepository.getAllDossierStatusForDossierTemplate(dossierTemplateIds); } public DossierStatusInfo getDossierStatusInfo(String dossierStatusId) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java index dbccc2489..3f6dbb2e9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java @@ -11,8 +11,8 @@ import java.util.Optional; public interface DossierStatusRepository extends JpaRepository { @Query("select new com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + - "s.description, s.color, s.dossierTemplateId, count(d)) from DossierStatusEntity s left outer join s.dossiers d where s.dossierTemplateId = :dossierTemplateId group by s") - List getAllDossierStatusForDossierTemplate(String dossierTemplateId); + "s.description, s.color, s.dossierTemplateId, count(d)) from DossierStatusEntity s left outer join s.dossiers d where s.dossierTemplateId in ( :dossierTemplateIds ) group by s") + List getAllDossierStatusForDossierTemplate(List dossierTemplateId); @Query("select new com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + "s.description, s.color, s.dossierTemplateId, count(d)) from DossierStatusEntity s left outer join s.dossiers d where s.id = :dossierStatusId group by s") diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/acl/AclMethodSecurityConfiguration.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/acl/AclMethodSecurityConfiguration.java new file mode 100644 index 000000000..74507f930 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/acl/AclMethodSecurityConfiguration.java @@ -0,0 +1,80 @@ +package com.iqser.red.service.peristence.v1.server.acl; + +import lombok.RequiredArgsConstructor; +import org.springframework.cache.concurrent.ConcurrentMapCache; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.acls.AclPermissionEvaluator; +import org.springframework.security.acls.domain.AclAuthorizationStrategy; +import org.springframework.security.acls.domain.ConsoleAuditLogger; +import org.springframework.security.acls.domain.DefaultPermissionGrantingStrategy; +import org.springframework.security.acls.domain.SpringCacheBasedAclCache; +import org.springframework.security.acls.jdbc.BasicLookupStrategy; +import org.springframework.security.acls.jdbc.JdbcMutableAclService; +import org.springframework.security.acls.jdbc.LookupStrategy; +import org.springframework.security.acls.model.PermissionGrantingStrategy; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +import javax.sql.DataSource; + +@Configuration +@RequiredArgsConstructor +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration { + + private final MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler; + + private final DataSource dataSource; + + @Bean + public AclAuthorizationStrategy aclAuthorizationStrategy() { + return (acl, changeType) -> { + // no-op + }; + } + + @Bean + public PermissionGrantingStrategy permissionGrantingStrategy() { + return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger()); + } + + @Bean + public SpringCacheBasedAclCache aclCache() { + return new SpringCacheBasedAclCache(new ConcurrentMapCache("acl"), + permissionGrantingStrategy(), + aclAuthorizationStrategy() + ); + } + + @Bean + public LookupStrategy lookupStrategy() { + return new BasicLookupStrategy( + dataSource, + aclCache(), + aclAuthorizationStrategy(), + new ConsoleAuditLogger() + ); + } + + @Override + protected MethodSecurityExpressionHandler createExpressionHandler() { + return defaultMethodSecurityExpressionHandler; + } + + @Bean + public MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() { + DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); + AclPermissionEvaluator permissionEvaluator = new AclPermissionEvaluator(aclService()); + expressionHandler.setPermissionEvaluator(permissionEvaluator); + return expressionHandler; + } + + @Bean + public JdbcMutableAclService aclService() { + return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache()); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatusController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatusController.java index db5c48d43..98718202f 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatusController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/DossierStatusController.java @@ -7,6 +7,7 @@ import com.iqser.red.service.persistence.service.v1.api.resources.DossierStatusR import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -34,8 +35,12 @@ public class DossierStatusController implements DossierStatusResource { } @Override - public DossierStatusInfo getDossierStatus(@PathVariable(DOSSIER_STATUS_ID) String dossierStatusId) { + public List getAllDossierStatuses(@RequestBody List dossierTemplateIds) { + return convert(dossierStatusPersistenceService.getAllDossierStatuses(dossierTemplateIds), DossierStatusInfo.class); + } + @Override + public DossierStatusInfo getDossierStatus(@PathVariable(DOSSIER_STATUS_ID) String dossierStatusId) { return dossierStatusPersistenceService.getDossierStatusInfo(dossierStatusId); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/12-dossier-visibility.changelog.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/12-dossier-visibility.changelog.yaml new file mode 100644 index 000000000..d1b257dab --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/12-dossier-visibility.changelog.yaml @@ -0,0 +1,12 @@ +databaseChangeLog: + - changeSet: + id: add-dossier-visibility-column + author: timo + changes: + - addColumn: + columns: + - column: + name: visbility + type: VARCHAR(40) + defaultValue: PUBLIC + tableName: dossier