From 3821c8b8c7560071590b46c28ba7f7160f76d5b7 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Tue, 3 Jun 2025 15:14:05 +0800 Subject: [PATCH] feat(spec): Add solid soft delete function - Add softDelete method to the CrudServiceSpec interface to soft delete entities - Implement softDelete method in the CrudServiceImplSpec class, including finding entities, marking delete status, and updating entities - Added setDeleted abstract method, and implements specific tag deletion logic from subclasses - Add log records, output error message when the corresponding entity cannot be found - Introduce log extension functions and Core. EXTENSION module --- forgeboot-webmvc/spec/build.gradle.kts | 1 + .../webmvc/spec/service/CrudServiceSpec.kt | 10 +++++++ .../spec/service/impl/CrudServiceImplSpec.kt | 28 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/forgeboot-webmvc/spec/build.gradle.kts b/forgeboot-webmvc/spec/build.gradle.kts index e917840..61e6456 100644 --- a/forgeboot-webmvc/spec/build.gradle.kts +++ b/forgeboot-webmvc/spec/build.gradle.kts @@ -2,4 +2,5 @@ dependencies { compileOnly(libs.springBootStarter.jpa) implementation(project(Modules.Webmvc.DTO)) + implementation(project(Modules.Core.EXTENSION)) } diff --git a/forgeboot-webmvc/spec/src/main/kotlin/com/gewuyou/forgeboot/webmvc/spec/service/CrudServiceSpec.kt b/forgeboot-webmvc/spec/src/main/kotlin/com/gewuyou/forgeboot/webmvc/spec/service/CrudServiceSpec.kt index d2e5656..f4bf125 100644 --- a/forgeboot-webmvc/spec/src/main/kotlin/com/gewuyou/forgeboot/webmvc/spec/service/CrudServiceSpec.kt +++ b/forgeboot-webmvc/spec/src/main/kotlin/com/gewuyou/forgeboot/webmvc/spec/service/CrudServiceSpec.kt @@ -74,6 +74,16 @@ interface CrudServiceSpec { */ fun deleteByAll(entities: List) + /** + * 软删除 + * + * 本函数用于标记实体为删除状态,而不是真正从数据库中移除 + * 这种方法可以保留历史数据,同时避免数据泄露 + * + * @param id 实体的唯一标识符 + */ + fun softDelete(id: Id) + /** * 根据ID检查实体是否存在 * diff --git a/forgeboot-webmvc/spec/src/main/kotlin/com/gewuyou/forgeboot/webmvc/spec/service/impl/CrudServiceImplSpec.kt b/forgeboot-webmvc/spec/src/main/kotlin/com/gewuyou/forgeboot/webmvc/spec/service/impl/CrudServiceImplSpec.kt index 350315b..2d49a3c 100644 --- a/forgeboot-webmvc/spec/src/main/kotlin/com/gewuyou/forgeboot/webmvc/spec/service/impl/CrudServiceImplSpec.kt +++ b/forgeboot-webmvc/spec/src/main/kotlin/com/gewuyou/forgeboot/webmvc/spec/service/impl/CrudServiceImplSpec.kt @@ -1,5 +1,6 @@ package com.gewuyou.forgeboot.webmvc.spec.service.impl +import com.gewuyou.forgeboot.core.extension.log import com.gewuyou.forgeboot.webmvc.dto.PageResult import com.gewuyou.forgeboot.webmvc.dto.extension.map import com.gewuyou.forgeboot.webmvc.dto.extension.toPageResult @@ -201,4 +202,31 @@ abstract class CrudServiceImplSpec( override fun saveAll(entities: List): List { return repository.saveAll(entities) } + + /** + * 标记实体为软删除状态。 + * + * 此方法应在子类中实现,用于定义如何将实体标记为已删除(例如设置一个 deleted 字段)。 + * 软删除不会从数据库中物理移除记录,而是将其标记为已删除状态,以便保留历史数据。 + * + * @param entity 实体对象,表示要标记为删除状态的对象 + */ + protected abstract fun setDeleted(entity: Entity) + /** + * 执行软删除操作。 + * + * 该方法会根据提供的 ID 查找实体。如果找到该实体,则调用 [setDeleted] 方法将其标记为删除状态, + * 然后通过 [update] 方法保存更改;如果没有找到实体,则记录一条错误日志。 + * + * 软删除机制可以保留历史数据,同时避免敏感信息的直接删除,确保数据可追溯且安全。 + * + * @param id 实体的唯一标识符,用于查找需要删除的实体 + */ + override fun softDelete(id: Id) { + val exist: Entity? = findById(id) + exist?.let { + setDeleted(it) + update(it) + } ?: log.error("删除失败,找不到该租户") + } } \ No newline at end of file