From 37267b4c7c620b7d08b6708516642823cf9c0b32 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Sun, 1 Dec 2024 15:20:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E5=AE=9E=E4=BD=93=E8=BD=AF?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/inspectionProfiles/Project_Default.xml | 5 ++ .../domain/base/entity/LogicDeleteEntity.java | 27 ++++++++++ .../base/entity/LogicDeleteIdOnlyEntity.java | 27 ++++++++++ .../base/service/LogicDeleteService.java | 50 +++++++++++++++++++ .../base/service/SimpleServiceSupport.java | 18 ++++++- .../confirmation/entity/Confirmation.java | 10 +++- .../domain/resource/entity/DataResource.java | 8 ++- .../resource/entity/type/ResourceType.java | 4 +- 8 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteEntity.java create mode 100644 gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteIdOnlyEntity.java create mode 100644 gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/LogicDeleteService.java diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 7c04147..319b75d 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,6 +1,11 @@ \ No newline at end of file diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteEntity.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteEntity.java new file mode 100644 index 0000000..2292100 --- /dev/null +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteEntity.java @@ -0,0 +1,27 @@ +package com.eshore.gringotts.web.domain.base.entity; + +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +/** + * 实体类公共字段 + * + * @author lanyuanxiaoyao + * @date 2024-11-20 + */ +@Getter +@Setter +@ToString(callSuper = true) +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public class LogicDeleteEntity extends SimpleEntity { + public static final String LOGIC_DELETE_CLAUSE = "deleted = false"; + + @Column(nullable = false) + private Boolean deleted = false; +} diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteIdOnlyEntity.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteIdOnlyEntity.java new file mode 100644 index 0000000..0f43598 --- /dev/null +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/entity/LogicDeleteIdOnlyEntity.java @@ -0,0 +1,27 @@ +package com.eshore.gringotts.web.domain.base.entity; + +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +/** + * 实体类公共字段 + * + * @author lanyuanxiaoyao + * @date 2024-11-20 + */ +@Getter +@Setter +@ToString(callSuper = true) +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public class LogicDeleteIdOnlyEntity extends IdOnlyEntity { + public static final String LOGIC_DELETE_CLAUSE = "deleted = false"; + + @Column(nullable = false) + private Boolean deleted = false; +} 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 new file mode 100644 index 0000000..d862d5e --- /dev/null +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/base/service/LogicDeleteService.java @@ -0,0 +1,50 @@ +package com.eshore.gringotts.web.domain.base.service; + +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.StrUtil; +import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity; +import com.eshore.gringotts.web.domain.base.repository.SimpleRepository; +import com.eshore.gringotts.web.domain.user.service.UserService; +import javax.persistence.EntityManager; +import javax.persistence.Query; +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.Lists; +import org.eclipse.collections.api.list.ImmutableList; + +/** + * @author lanyuanxiaoyao + * @date 2024-11-21 + */ +@Slf4j +public abstract class LogicDeleteService extends SimpleServiceSupport { + private final EntityManager manager; + + public LogicDeleteService(SimpleRepository repository, UserService userService, EntityManager manager) { + super(repository, userService); + this.manager = manager; + } + + @Override + protected ImmutableList extraListPredicates(Root root, CriteriaQuery query, CriteriaBuilder builder) { + return Lists.immutable.of(builder.equal(root.get("deleted"), false)); + } + + @Override + protected ImmutableList extraDetailPredicates(Root root, CriteriaQuery query, CriteriaBuilder builder) { + return Lists.immutable.of(builder.equal(root.get("deleted"), false)); + } + + @Transactional(rollbackOn = Throwable.class) + @Override + public void remove(Long id) { + String entityName = ClassUtil.getTypeArgument(this.getClass()).getSimpleName(); + Query query = manager.createQuery(StrUtil.format("update {} entity set deleted=true where id=?1", entityName)); + query.setParameter(1, id); + query.executeUpdate(); + } +} 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 d21076e..8900c3a 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 @@ -9,7 +9,10 @@ import com.eshore.gringotts.web.domain.base.repository.SimpleRepository; import com.eshore.gringotts.web.domain.user.entity.User; import com.eshore.gringotts.web.domain.user.service.UserService; import java.util.Optional; +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.Lists; @@ -24,8 +27,8 @@ import org.springframework.data.domain.Sort; */ @Slf4j public abstract class SimpleServiceSupport implements SimpleService { - private final SimpleRepository repository; - private final UserService userService; + protected final SimpleRepository repository; + protected final UserService userService; public SimpleServiceSupport(SimpleRepository repository, UserService userService) { this.repository = repository; @@ -64,6 +67,7 @@ public abstract class SimpleServiceSupport implemen if (User.isNotAdministrator(user)) { predicates.add(builder.equal(root.get("createdUser"), user)); } + predicates.addAllIterable(extraListPredicates(root, query, builder)); return builder.and(predicates.toArray(new Predicate[predicates.size()])); }, Sort.by("createdTime").descending() @@ -81,12 +85,17 @@ public abstract class SimpleServiceSupport implemen if (User.isNotAdministrator(user)) { predicates.add(builder.equal(root.get("createdUser"), user)); } + predicates.addAllIterable(extraListPredicates(root, query, builder)); return builder.and(predicates.toArray(new Predicate[predicates.size()])); }, Sort.by("createdTime").descending() )); } + protected ImmutableList extraListPredicates(Root root, CriteriaQuery query, CriteriaBuilder builder) { + return Lists.immutable.empty(); + } + @Override public Optional detailOptional(Long id) { if (ObjectUtil.isNull(id)) { @@ -101,11 +110,16 @@ public abstract class SimpleServiceSupport implemen if (User.isNotAdministrator(user)) { predicates.add(builder.equal(root.get("createdUser"), user)); } + predicates.addAllIterable(extraDetailPredicates(root, query, builder)); return builder.and(predicates.toArray(new Predicate[predicates.size()])); } ); } + protected ImmutableList extraDetailPredicates(Root root, CriteriaQuery query, CriteriaBuilder builder) { + return Lists.immutable.empty(); + } + @Override public ENTITY detail(Long id) { return detailOrNull(id); diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/entity/Confirmation.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/entity/Confirmation.java index 70b6094..81e7632 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/entity/Confirmation.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/confirmation/entity/Confirmation.java @@ -1,7 +1,7 @@ package com.eshore.gringotts.web.domain.confirmation.entity; import com.eshore.gringotts.core.Constants; -import com.eshore.gringotts.web.domain.base.entity.SimpleEntity; +import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity; import com.eshore.gringotts.web.domain.resource.entity.DataResource; import com.eshore.gringotts.web.domain.upload.entity.DataFile; import java.util.Set; @@ -25,6 +25,9 @@ import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; +import org.hibernate.annotations.WhereJoinTable; import org.springframework.data.jpa.domain.support.AuditingEntityListener; /** @@ -50,9 +53,12 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; @NamedAttributeNode(value = "createdUser"), @NamedAttributeNode(value = "modifiedUser"), }) -public class Confirmation extends SimpleEntity { +@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "confirmation" + " set deleted = true where id = ?") +@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE) +public class Confirmation extends LogicDeleteEntity { @OneToOne(fetch = FetchType.EAGER) @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @WhereJoinTable(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE) private DataResource target; private String description; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/DataResource.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/DataResource.java index edd3e2a..8575f97 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/DataResource.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/DataResource.java @@ -2,7 +2,7 @@ package com.eshore.gringotts.web.domain.resource.entity; import com.eshore.gringotts.core.Constants; import com.eshore.gringotts.web.domain.authentication.entity.Authentication; -import com.eshore.gringotts.web.domain.base.entity.SimpleEntity; +import com.eshore.gringotts.web.domain.base.entity.LogicDeleteEntity; import com.eshore.gringotts.web.domain.confirmation.entity.Confirmation; import com.eshore.gringotts.web.domain.resource.entity.format.ResourceFormat; import com.eshore.gringotts.web.domain.resource.entity.type.ResourceType; @@ -25,6 +25,8 @@ import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @Getter @@ -48,7 +50,9 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener; @NamedAttributeNode(value = "createdUser"), @NamedAttributeNode(value = "modifiedUser"), }) -public class DataResource extends SimpleEntity { +@SQLDelete(sql = "update " + Constants.TABLE_PREFIX + "data_resource" + " set deleted = true where id = ?") +@Where(clause = LogicDeleteEntity.LOGIC_DELETE_CLAUSE) +public class DataResource extends LogicDeleteEntity { @Column(nullable = false) private String name; private String description; diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/type/ResourceType.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/type/ResourceType.java index 51bb4e9..4651e5f 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/type/ResourceType.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/resource/entity/type/ResourceType.java @@ -1,7 +1,7 @@ package com.eshore.gringotts.web.domain.resource.entity.type; import com.eshore.gringotts.core.Constants; -import com.eshore.gringotts.web.domain.base.entity.IdOnlyEntity; +import com.eshore.gringotts.web.domain.base.entity.LogicDeleteIdOnlyEntity; import javax.persistence.Entity; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; @@ -22,7 +22,7 @@ import lombok.ToString; @Entity @Table(name = Constants.TABLE_PREFIX + "resource_type") @Inheritance(strategy = InheritanceType.JOINED) -public abstract class ResourceType extends IdOnlyEntity { +public abstract class ResourceType extends LogicDeleteIdOnlyEntity { public abstract Type getResourceType(); public enum Type {