From 3d1970ec0982055b86d7c41064f2a582fe424d23 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Mon, 9 Dec 2024 18:37:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E4=BC=98=E5=8C=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=B5=84=E6=BA=90=E5=92=8C=E6=95=B0=E6=8D=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 listPredicate 方法统一处理查询逻辑- 优化了 DataResourceService 和 DataFileService 的查询性能 - 重构了 EntityHelper 类,增加了 checkNeededEntityPrediction 方法 - 调整了 AuthenticationService、CheckOrderService 和 ConfirmationService 的查询逻辑 - 更新了前端 dialog-permission.js 组件 --- .idea/compiler.xml | 4 +- .../permission/dialog-permission.js | 57 ++++++++++--------- gringotts-web/pom.xml | 18 ++++++ .../service/AuthenticationService.java | 25 ++++++++ .../base/repository/SimpleRepository.java | 3 +- .../base/service/LogicDeleteService.java | 6 +- .../base/service/SimpleServiceSupport.java | 33 +++++------ .../check/service/CheckOrderService.java | 27 +++++---- .../service/ConfirmationService.java | 27 ++++++++- .../resource/service/DataResourceService.java | 38 +++++++++++++ .../upload/service/DataFileService.java | 40 ++++++++++++- .../gringotts/web/helper/EntityHelper.java | 21 +++++++ pom.xml | 27 ++++++++- 13 files changed, 256 insertions(+), 70 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 5c1711d..021f830 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -7,8 +7,8 @@ - + @@ -24,7 +24,7 @@ - + \ No newline at end of file diff --git a/gringotts-frontend/components/permission/dialog-permission.js b/gringotts-frontend/components/permission/dialog-permission.js index 5a2b29c..7d845ce 100644 --- a/gringotts-frontend/components/permission/dialog-permission.js +++ b/gringotts-frontend/components/permission/dialog-permission.js @@ -16,6 +16,16 @@ import {resourceDetailDialog} from "../resource/dialog-resource.js"; const CONFIRMATION_TYPE = 'confirmation' const AUTHENTICATION_TYPE = 'authentication' +const CONFIRMATION = { + type: 'confirmation', + pickerApi: apiGet('${base}/data_resource/list_no_confirmation') +} + +const AUTHENTICATION = { + type: 'authentication', + pickerApi: apiGet('${base}/data_resource/list_no_authentication') +} + function detailForm(pickerApi = apiGet('${base}/data_resource/list'), showCreatedUserAndModifiedUser = false) { return { debug: information.debug, @@ -98,16 +108,16 @@ function detailForm(pickerApi = apiGet('${base}/data_resource/list'), showCreate } export function confirmationAddDialog() { - return permissionAddDialog(CONFIRMATION_TYPE) + return permissionAddDialog(CONFIRMATION) } export function authenticationAddDialog() { - return permissionAddDialog(AUTHENTICATION_TYPE) + return permissionAddDialog(AUTHENTICATION) } -function permissionAddDialog(type) { +function permissionAddDialog(config) { let data = {add: true} - data[type] = true + data[config.type] = true return { actionType: 'dialog', dialog: { @@ -125,8 +135,8 @@ function permissionAddDialog(type) { } ], body: { - ...detailForm(generateApi(type)), - api: apiPost(`\${base}/${type}/save`), + ...detailForm(config.pickerApi), + api: apiPost(`\${base}/${config.type}/save`), data: data, } } @@ -134,16 +144,16 @@ function permissionAddDialog(type) { } export function confirmationDetailDialog(field = 'id', actions = []) { - return permissionDetailDialog(CONFIRMATION_TYPE, field, actions) + return permissionDetailDialog(CONFIRMATION, field, actions) } export function authenticationDetailDialog(field = 'id', actions = []) { - return permissionDetailDialog(AUTHENTICATION_TYPE, field, actions) + return permissionDetailDialog(AUTHENTICATION, field, actions) } -function permissionDetailDialog(type, field = 'id', actions = []) { +function permissionDetailDialog(config, field = 'id', actions = []) { let data = {detail: true} - data[type] = true + data[config.type] = true return { actionType: 'dialog', dialog: { @@ -151,8 +161,8 @@ function permissionDetailDialog(type, field = 'id', actions = []) { size: 'md', actions: actions, body: { - ...detailForm(generateApi(type), true), - initApi: apiGet(`\${base}/${type}/detail/\${${field}}`), + ...detailForm(config.pickerApi, true), + initApi: apiGet(`\${base}/${config.type}/detail/\${${field}}`), static: true, data: data, } @@ -161,16 +171,16 @@ function permissionDetailDialog(type, field = 'id', actions = []) { } export function confirmationEditeDialog(field = 'id') { - return permissionEditeDialog(CONFIRMATION_TYPE, field) + return permissionEditeDialog(CONFIRMATION, field) } export function authenticationEditeDialog(field = 'id') { - return permissionEditeDialog(AUTHENTICATION_TYPE, field) + return permissionEditeDialog(AUTHENTICATION, field) } -function permissionEditeDialog(type, field = 'id') { +function permissionEditeDialog(config, field = 'id') { let data = {edit: true} - data[type] = true + data[config.type] = true return { actionType: 'dialog', dialog: { @@ -188,20 +198,11 @@ function permissionEditeDialog(type, field = 'id') { } ], body: { - ...detailForm(generateApi(type)), - api: apiPost(`\${base}/${type}/save`), - initApi: apiGet(`\${base}/${type}/detail/\${${field}}`), + ...detailForm(config.pickerApi), + api: apiPost(`\${base}/${config.type}/save`), + initApi: apiGet(`\${base}/${config.type}/detail/\${${field}}`), data: data, }, } } } - -function generateApi(type) { - switch (type) { - case AUTHENTICATION_TYPE: - return apiGet('${base}/data_resource/list_no_authentication') - case CONFIRMATION_TYPE: - return apiGet('${base}/data_resource/list_no_confirmation') - } -} diff --git a/gringotts-web/pom.xml b/gringotts-web/pom.xml index 89b6b78..e2b341b 100644 --- a/gringotts-web/pom.xml +++ b/gringotts-web/pom.xml @@ -28,6 +28,12 @@ com.blinkfox fenix-spring-boot-starter + + org.hibernate + hibernate-jpamodelgen + ${hibernate.version} + provided + com.h2database h2 @@ -37,6 +43,18 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + true + + + lombok.launch.AnnotationProcessorHider$AnnotationProcessor,org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + + + + org.springframework.boot spring-boot-maven-plugin diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/authentication/service/AuthenticationService.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/authentication/service/AuthenticationService.java index 462fc40..e287e65 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/authentication/service/AuthenticationService.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/authentication/service/AuthenticationService.java @@ -3,17 +3,23 @@ package com.eshore.gringotts.web.domain.authentication.service; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.eshore.gringotts.web.domain.authentication.entity.Authentication; +import com.eshore.gringotts.web.domain.authentication.entity.Authentication_; import com.eshore.gringotts.web.domain.authentication.repository.AuthenticationRepository; import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity; import com.eshore.gringotts.web.domain.base.service.CheckingService; import com.eshore.gringotts.web.domain.base.service.LogicDeleteService; import com.eshore.gringotts.web.domain.check.entity.CheckOrder; +import com.eshore.gringotts.web.domain.check.entity.CheckOrder_; import com.eshore.gringotts.web.domain.check.service.CheckOrderService; import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.service.UserService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import javax.transaction.Transactional; import lombok.extern.slf4j.Slf4j; import org.eclipse.collections.api.factory.Maps; @@ -41,6 +47,25 @@ public class AuthenticationService extends LogicDeleteService im this.mapper = builder.build(); } + @Override + protected Predicate listPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { + if (ignoreWhenAdministrator()) { + return null; + } + User loginUser = userService.currentLoginUser(); + return builder.or( + builder.equal(root.get(Authentication_.createdUser), loginUser), + builder.and( + builder.equal(root.get(Authentication_.order).get(CheckOrder_.target), CheckOrder.Target.ROLE), + builder.equal(root.get(Authentication_.order).get(CheckOrder_.targetRole), loginUser.getRole()) + ), + builder.and( + builder.equal(root.get(Authentication_.order).get(CheckOrder_.target), CheckOrder.Target.USER), + builder.equal(root.get(Authentication_.order).get(CheckOrder_.targetUser), loginUser) + ) + ); + } + @Override public Long save(Authentication entity) { if (ObjectUtil.isNull(entity.getId()) && authenticationRepository.findOne( diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/repository/SimpleRepository.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/repository/SimpleRepository.java index 555d355..6e4ca11 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/repository/SimpleRepository.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/repository/SimpleRepository.java @@ -3,6 +3,7 @@ package com.eshore.gringotts.web.domain.base.repository; import com.blinkfox.fenix.jpa.FenixJpaRepository; import com.blinkfox.fenix.specification.FenixJpaSpecificationExecutor; import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.data.repository.query.QueryByExampleExecutor; /** * 整合一下 @@ -11,5 +12,5 @@ import org.springframework.data.repository.NoRepositoryBean; * @date 2024-11-21 */ @NoRepositoryBean -public interface SimpleRepository extends FenixJpaRepository, FenixJpaSpecificationExecutor { +public interface SimpleRepository extends FenixJpaRepository, FenixJpaSpecificationExecutor, QueryByExampleExecutor { } diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/LogicDeleteService.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/LogicDeleteService.java index 0c635a0..e32be2b 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/LogicDeleteService.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/LogicDeleteService.java @@ -13,8 +13,6 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.transaction.Transactional; import lombok.extern.slf4j.Slf4j; -import org.eclipse.collections.api.factory.Lists; -import org.eclipse.collections.api.list.ImmutableList; /** * @author lanyuanxiaoyao @@ -30,8 +28,8 @@ public abstract class LogicDeleteService exten } @Override - protected ImmutableList listPredicates(Root root, CriteriaQuery query, CriteriaBuilder builder) { - return Lists.immutable.of(builder.equal(root.get("deleted"), false)); + protected Predicate listPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { + return builder.equal(root.get("deleted"), false); } @Transactional(rollbackOn = Throwable.class) diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/SimpleServiceSupport.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/SimpleServiceSupport.java index 6482da4..97ffa0d 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/SimpleServiceSupport.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/SimpleServiceSupport.java @@ -58,17 +58,16 @@ public abstract class SimpleServiceSupport implemen @Override public ImmutableList list() throws Exception { - return Lists.immutable.ofAll(repository.findAll((root, query, builder) -> builder.and(listPredicates(root, query, builder).toArray(new Predicate[]{})))); + return Lists.immutable.ofAll(repository.findAll(this::listPredicate)); } @Override public ImmutableList list(ImmutableSet ids) throws Exception { return Lists.immutable.ofAll(repository.findAll( - (root, query, builder) -> { - MutableList predicates = Lists.mutable.ofAll(listPredicates(root, query, builder)); - predicates.add(builder.in(root.get("id")).value(ids)); - return builder.and(predicates.toArray(new Predicate[predicates.size()])); - } + (root, query, builder) -> builder.and( + listPredicate(root, query, builder), + builder.in(root.get("id")).value(ids) + ) )); } @@ -153,20 +152,23 @@ public abstract class SimpleServiceSupport implemen return predicates.toImmutable(); } - protected ImmutableList listPredicates(Root root, CriteriaQuery query, CriteriaBuilder builder) { - MutableList predicates = Lists.mutable.empty(); + protected Boolean ignoreWhenAdministrator() { + return User.isAdministrator(userService.currentLoginUser()); + } + + protected Predicate listPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { User user = userService.currentLoginUser(); if (User.isNotAdministrator(user)) { - predicates.add(builder.equal(root.get("createdUser"), user)); + return builder.equal(root.get("createdUser"), user); } - return predicates.toImmutable(); + return null; } @Override public ImmutableList list(Query listQuery) throws Exception { return Lists.immutable.ofAll(repository.findAll( (root, query, builder) -> { - MutableList predicates = Lists.mutable.ofAll(listPredicates(root, query, builder)); + MutableList predicates = Lists.mutable.of(listPredicate(root, query, builder)); predicates.addAllIterable(queryPredicates(listQuery.getQuery(), root, query, builder)); return builder.and(predicates.toArray(new Predicate[predicates.size()])); }, @@ -180,11 +182,10 @@ public abstract class SimpleServiceSupport implemen return Optional.empty(); } return repository.findOne( - (root, query, builder) -> { - MutableList predicates = Lists.mutable.ofAll(listPredicates(root, query, builder)); - predicates.add(builder.equal(root.get("id"), id)); - return builder.and(predicates.toArray(new Predicate[predicates.size()])); - } + (root, query, builder) -> builder.and( + listPredicate(root, query, builder), + builder.equal(root.get("id"), id) + ) ); } diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/check/service/CheckOrderService.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/check/service/CheckOrderService.java index e7e4001..caef231 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/check/service/CheckOrderService.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/check/service/CheckOrderService.java @@ -16,8 +16,6 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import lombok.extern.slf4j.Slf4j; -import org.eclipse.collections.api.factory.Lists; -import org.eclipse.collections.api.list.ImmutableList; import org.eclipse.collections.api.map.ImmutableMap; import org.springframework.context.ApplicationContext; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; @@ -44,19 +42,20 @@ public class CheckOrderService extends SimpleServiceSupport { } @Override - protected ImmutableList listPredicates(Root root, CriteriaQuery query, CriteriaBuilder builder) { + protected Predicate listPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { User user = userService.currentLoginUser(); - return Lists.immutable.of( - builder.or( - builder.equal(root.get("createdUser"), user), - builder.and( - builder.equal(root.get("target"), CheckOrder.Target.USER), - builder.equal(root.get("targetUser"), user) - ), - builder.and( - builder.equal(root.get("target"), CheckOrder.Target.ROLE), - builder.equal(root.get("targetRole"), user.getRole()) - ) + if (ObjectUtil.equals(user.getRole(), User.Role.ADMINISTRATOR)) { + return null; + } + return builder.or( + builder.equal(root.get("createdUser"), user), + builder.and( + builder.equal(root.get("target"), CheckOrder.Target.USER), + builder.equal(root.get("targetUser"), user) + ), + builder.and( + builder.equal(root.get("target"), CheckOrder.Target.ROLE), + builder.equal(root.get("targetRole"), user.getRole()) ) ); } diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/service/ConfirmationService.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/service/ConfirmationService.java index b6aefef..bbced20 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/service/ConfirmationService.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/service/ConfirmationService.java @@ -6,13 +6,19 @@ import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity; import com.eshore.gringotts.web.domain.base.service.CheckingService; import com.eshore.gringotts.web.domain.base.service.SimpleServiceSupport; import com.eshore.gringotts.web.domain.check.entity.CheckOrder; +import com.eshore.gringotts.web.domain.check.entity.CheckOrder_; import com.eshore.gringotts.web.domain.check.service.CheckOrderService; import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation; +import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation_; import com.eshore.gringotts.web.domain.confirmation.repository.ConfirmationRepository; import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.service.UserService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import javax.transaction.Transactional; import lombok.extern.slf4j.Slf4j; import org.eclipse.collections.api.factory.Maps; @@ -38,6 +44,25 @@ public class ConfirmationService extends SimpleServiceSupport impl this.mapper = builder.build(); } + @Override + protected Predicate listPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { + if (ignoreWhenAdministrator()) { + return null; + } + User loginUser = userService.currentLoginUser(); + return builder.or( + builder.equal(root.get(Confirmation_.createdUser), loginUser), + builder.and( + builder.equal(root.get(Confirmation_.order).get(CheckOrder_.target), CheckOrder.Target.ROLE), + builder.equal(root.get(Confirmation_.order).get(CheckOrder_.targetRole), loginUser.getRole()) + ), + builder.and( + builder.equal(root.get(Confirmation_.order).get(CheckOrder_.target), CheckOrder.Target.USER), + builder.equal(root.get(Confirmation_.order).get(CheckOrder_.targetUser), loginUser) + ) + ); + } + @Override public Long save(Confirmation entity) { if (ObjectUtil.isNull(entity.getId()) && confirmationRepository.existsByTarget_Id(entity.getTarget().getId())) { @@ -56,7 +81,7 @@ public class ConfirmationService extends SimpleServiceSupport impl CheckOrder.Type.CONFIRMATION, mapper.writeValueAsString(Maps.immutable.of("confirmationId", confirmation.getId())), "com.eshore.gringotts.web.domain.confirmation.service.ConfirmationService", - User.Role.ADMINISTRATOR + User.Role.CHECKER )); CheckOrder order = checkOrderService.detailOrThrow(orderId); confirmation.setOrder(order); diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/service/DataResourceService.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/service/DataResourceService.java index 98d341f..de34abd 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/service/DataResourceService.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/service/DataResourceService.java @@ -1,17 +1,25 @@ package com.eshore.gringotts.web.domain.resource.service; import com.eshore.gringotts.web.domain.authentication.entity.Authentication; +import com.eshore.gringotts.web.domain.authentication.entity.Authentication_; import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity; import com.eshore.gringotts.web.domain.base.service.SimpleServiceSupport; import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation; +import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation_; import com.eshore.gringotts.web.domain.resource.entity.DataResource; +import com.eshore.gringotts.web.domain.resource.entity.DataResource_; import com.eshore.gringotts.web.domain.resource.entity.format.ResourceFormat; import com.eshore.gringotts.web.domain.resource.entity.type.ResourceType; import com.eshore.gringotts.web.domain.resource.repository.DataResourceRepository; import com.eshore.gringotts.web.domain.resource.repository.ResourceFormatRepository; import com.eshore.gringotts.web.domain.resource.repository.ResourceTypeRepository; +import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.service.UserService; +import com.eshore.gringotts.web.helper.EntityHelper; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; +import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.criteria.Subquery; import lombok.extern.slf4j.Slf4j; @@ -40,6 +48,36 @@ public class DataResourceService extends SimpleServiceSupport { this.userService = userService; } + @Override + protected Predicate listPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { + if (ignoreWhenAdministrator()) { + return null; + } + User loginUser = userService.currentLoginUser(); + + Subquery confirmationSubquery = query.subquery(Confirmation.class); + Root confirmationRoot = confirmationSubquery.from(Confirmation.class); + confirmationSubquery.select(confirmationRoot) + .where( + builder.equal(confirmationRoot.get(Confirmation_.target), root), + EntityHelper.checkNeededEntityPrediction(confirmationRoot, builder, loginUser) + ); + + Subquery authenticationSubquery = query.subquery(Authentication.class); + Root authenticationRoot = authenticationSubquery.from(Authentication.class); + authenticationSubquery.select(authenticationRoot) + .where( + builder.equal(authenticationRoot.get(Authentication_.target), root), + EntityHelper.checkNeededEntityPrediction(authenticationRoot, builder, loginUser) + ); + + return builder.or( + builder.equal(root.get(DataResource_.createdUser), loginUser), + builder.exists(confirmationSubquery), + builder.exists(authenticationSubquery) + ); + } + public ImmutableList listNoConfirmation() { return Lists.immutable.ofAll(dataResourceRepository.findAllByConfirmationIsNull()); } diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/upload/service/DataFileService.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/upload/service/DataFileService.java index ddba322..874df31 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/upload/service/DataFileService.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/upload/service/DataFileService.java @@ -1,10 +1,21 @@ package com.eshore.gringotts.web.domain.upload.service; +import com.eshore.gringotts.web.domain.authentication.entity.Authentication; +import com.eshore.gringotts.web.domain.authentication.entity.Authentication_; import com.eshore.gringotts.web.domain.base.service.SimpleServiceSupport; +import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation; +import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation_; import com.eshore.gringotts.web.domain.upload.entity.DataFile; +import com.eshore.gringotts.web.domain.upload.entity.DataFile_; import com.eshore.gringotts.web.domain.upload.repository.DataFileRepository; import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.service.UserService; +import com.eshore.gringotts.web.helper.EntityHelper; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import javax.persistence.criteria.Subquery; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -26,11 +37,34 @@ public class DataFileService extends SimpleServiceSupport { this.userService = userService; } - public DataFile detail(String id) { - if (id == null) { + @Override + protected Predicate listPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { + if (ignoreWhenAdministrator()) { return null; } - return detail(Long.valueOf(id)); + User loginUser = userService.currentLoginUser(); + + Subquery confirmationSubquery = query.subquery(Confirmation.class); + Root confirmationRoot = confirmationSubquery.from(Confirmation.class); + confirmationSubquery.select(confirmationRoot) + .where( + builder.isMember(root, confirmationRoot.get(Confirmation_.evidences)), + EntityHelper.checkNeededEntityPrediction(confirmationRoot, builder, loginUser) + ); + + Subquery authenticationSubquery = query.subquery(Authentication.class); + Root authenticationRoot = authenticationSubquery.from(Authentication.class); + authenticationSubquery.select(authenticationRoot) + .where( + builder.isMember(root, authenticationRoot.get(Authentication_.evidences)), + EntityHelper.checkNeededEntityPrediction(authenticationRoot, builder, loginUser) + ); + + return builder.or( + builder.equal(root.get(DataFile_.createdUser), loginUser), + builder.exists(confirmationSubquery), + builder.exists(authenticationSubquery) + ); } public Long initialDataFile(String filename) { diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/helper/EntityHelper.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/helper/EntityHelper.java index 912ab70..d88af5a 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/helper/EntityHelper.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/helper/EntityHelper.java @@ -1,7 +1,15 @@ package com.eshore.gringotts.web.helper; import cn.hutool.core.util.ObjectUtil; +import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity; +import com.eshore.gringotts.web.domain.base.entity.CheckingNeededEntity_; +import com.eshore.gringotts.web.domain.check.entity.CheckOrder; +import com.eshore.gringotts.web.domain.check.entity.CheckOrder_; +import com.eshore.gringotts.web.domain.user.entity.User; import java.util.function.Supplier; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import org.springframework.data.jpa.repository.JpaRepository; /** @@ -17,4 +25,17 @@ public class EntityHelper { repository.delete(old); } } + + public static Predicate checkNeededEntityPrediction(Root root, CriteriaBuilder builder, User loginUser) { + return builder.or( + builder.and( + builder.equal(root.get(CheckingNeededEntity_.order).get(CheckOrder_.target), CheckOrder.Target.ROLE), + builder.equal(root.get(CheckingNeededEntity_.order).get(CheckOrder_.targetRole), loginUser.getRole()) + ), + builder.and( + builder.equal(root.get(CheckingNeededEntity_.order).get(CheckOrder_.target), CheckOrder.Target.USER), + builder.equal(root.get(CheckingNeededEntity_.order).get(CheckOrder_.targetUser), loginUser) + ) + ); + } } diff --git a/pom.xml b/pom.xml index b682128..f2b21fb 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,8 @@ 5.8.32 2.10.0 11.1.0 + 5.1.0 + 5.6.15.Final @@ -103,6 +105,17 @@ fenix-spring-boot-starter 2.7.0 + + com.querydsl + querydsl-jpa + ${querydsl.version} + + + com.querydsl + querydsl-apt + ${querydsl.version} + provided + @@ -144,7 +157,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.13.0 true @@ -152,11 +164,24 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + true + + org.springframework.boot spring-boot-maven-plugin ${spring-boot.version} + + com.mysema.maven + apt-maven-plugin + 1.1.3 +