Pārlūkot izejas kodu

✨ feat(shared-crud): implement delete operation permission validation

- add userId parameter to delete method for permission check
- implement permission validation logic in delete method
- throw error when user has no permission to delete resource
- update story documentation to mark delete permission tasks as completed
yourname 1 mēnesi atpakaļ
vecāks
revīzija
4d065ce30f

+ 8 - 4
docs/stories/006.001.shared-crud-data-permission.story.md

@@ -35,10 +35,10 @@ Draft
   - [x] 在 `update` 方法中添加权限验证
   - [x] 验证用户是否有权更新目标实体
   - [x] 确保权限验证与现有更新逻辑集成
-- [ ] 实现删除操作的权限验证 (AC: 5)
-  - [ ] 在 `delete` 方法中添加权限验证
-  - [ ] 验证用户是否有权删除目标实体
-  - [ ] 确保权限验证与现有删除逻辑集成
+- [x] 实现删除操作的权限验证 (AC: 5)
+  - [x] 在 `delete` 方法中添加权限验证
+  - [x] 验证用户是否有权删除目标实体
+  - [x] 确保权限验证与现有删除逻辑集成
 - [ ] 实现权限控制中间件 (AC: 6)
   - [ ] 创建 `dataPermissionMiddleware` 中间件
   - [ ] 从认证上下文中提取用户ID
@@ -151,6 +151,10 @@ Draft
 - 已为 update 方法添加权限验证
 - 已验证用户是否有权更新目标实体
 - 已确保权限验证与现有更新逻辑集成
+- 已实现删除操作的权限验证
+- 已为 delete 方法添加权限验证
+- 已验证用户是否有权删除目标实体
+- 已确保权限验证与现有删除逻辑集成
 - 构建验证通过,无类型错误
 
 ### File List

+ 13 - 1
packages/shared-crud/src/services/generic-crud.service.ts

@@ -363,7 +363,19 @@ export abstract class GenericCrudService<T extends ObjectLiteral> {
   /**
    * 删除实体
    */
-  async delete(id: number): Promise<boolean> {
+  async delete(id: number, userId?: string | number): Promise<boolean> {
+    // 权限验证
+    if (this.dataPermissionOptions?.enabled && userId) {
+      const entity = await this.getById(id);
+      if (!entity) return false;
+
+      const hasPermission = await this.checkPermission(entity, userId);
+      if (!hasPermission) {
+        throw new Error('无权删除该资源');
+      }
+    }
+
+    // 执行删除
     const result = await this.repository.delete(id);
     return result.affected === 1;
   }