Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【删除回收】目录删除 #901

Closed
Canway-shiisa opened this issue Feb 3, 2023 · 19 comments
Closed

【删除回收】目录删除 #901

Canway-shiisa opened this issue Feb 3, 2023 · 19 comments
Assignees
Labels
doing 已经接受处理,正在开发实施 Layer: api Api module related Priority: High
Milestone

Comments

@Canway-shiisa
Copy link
Contributor

Canway-shiisa commented Feb 3, 2023

目录删除

  • 展示列表
    • 存量已删除的目录怎么出现在列表中?
  • 永久删除
    • 生命周期: normal -> inactive -> deleted -> 物理删除
    • 删除需要清理所有关联数据: 所有category_id为外键的数据
    • 需要考虑事务, 以及目录下十万级部门及用户删除的场景
  • 因为category在所有地方都会先校验, 所以理论上删除只需要改category本身的状态就行, 不需要联动操作改部门/用户的状态
  • 还原
    • 判断有没有冲突即可, 没有冲突直接状态操作改回去(检测冲突)
    • 新建目录的时候也会检测冲突, 冲突提示跟哪个冲突, 用户可以到回收站物理删除=》产品确认:用户正常新建的目录,和回收站内的软删除目录不应该产生同名冲突(部门用户也同理)。

相关原型

  • 目录删除
    目录删除
  • 停用目录
    目录_停用目录
  • 目录配置未完成
    目录_未完成
  • 目录还原
    回收箱_目录还原预览
  • 目录永久删除
    回收箱_最近删除目录
@neronkl
Copy link
Contributor

neronkl commented Feb 6, 2023

当前目录删除的时,会对其下的人员(enable=0,status=delete)以及部门(enable=False), 定时任务删除。还原时候后,需将人员或者部门进行同步还原?定时同步任务呢?只是单单将目录给还原?@wklken

@wklken
Copy link
Collaborator

wklken commented Feb 6, 2023

当前目录删除是软删除, 只动了目录的状态, 不会动人员和部门

  • 软删除 -> 硬删除, 删目录的所有数据, 人员+部门, 只要目录下都删, 不考虑状态
  • 软删除 -> 还原, 目录状态恢复回去就行

@wklken
Copy link
Collaborator

wklken commented Feb 6, 2023

还原需要注意冲突检测


issue 描述写得比较全, 多仔细读几遍

@wklken wklken added this to the Y2023M06 milestone Feb 7, 2023
@wklken wklken added Layer: api Api module related Priority: High todo 进入开发排期的状态,纳入了最近的迭代 labels Feb 7, 2023
@wklken
Copy link
Collaborator

wklken commented Feb 7, 2023

方案设计, 需要画状态流转图, 一个目录的生命周期, 状态怎么流转的, 以及每个状态对应 model 中的属性值是什么

@neronkl
Copy link
Contributor

neronkl commented Feb 7, 2023

当前目录删除是软删除, 只动了目录的状态, 不会动人员和部门

  • 软删除 -> 硬删除, 删目录的所有数据, 人员+部门, 只要目录下都删, 不考虑状态
  • 软删除 -> 还原, 目录状态恢复回去就行


def delete(self, using=None, keep_parents=False):

# 手动禁用相关资源,同时保留关联关系

这两源码指向,表示目录软删除,会对相应资源做操作。
后续方案通过,进行开发的时,进行注释?
@wklken

@wklken
Copy link
Collaborator

wklken commented Feb 7, 2023

注释掉 category.delete()整个方法, 需要重新实现相关的逻辑(需要参考注释掉代码内的逻辑)

  1. 保护默认用户目录不被删除
  2. Profile/Department/Settings 不动
    • 需要确认此时登录用户登录时有没有先检查 category状态(软删除目录下的用户不能登录)
  3. 定时任务能否临时停掉 -> 硬删除才删除, 还原的话启用
  4. category 本身的属性 enabled / status / update_time 需更新
    • 需要确认category等生命周期流转, status是否加 DELETED 状态等

然后, 还原函数的逻辑是 冲突检测逻辑 + 上面 2/3/4 相反的逻辑

@Shutulee Shutulee modified the milestones: Y2023M06, Y2023M07 Feb 13, 2023
@wklken wklken removed this from the Y2023M07 milestone Feb 20, 2023
@neronkl
Copy link
Contributor

neronkl commented Feb 28, 2023

image

1. 新增目录状态Delete异常状态目录下的用户限制登录    
class CategoryStatus(AutoLowerEnum):
	....
    DELETE = auto()
    ....

2. 数据迁移:新增迁移文件存量已删除目录(status=INACTIVE and enable=False) 的数据记录 在回收站新增相应的映射记录同时status=INACTIVE, enable=False => status=DELETE, enable=False3. 重写ProfileCategory.delete方法
def delete(self):
    1.保护默认用户目录不被删除
    2.删除周期任务PeriodTask=>enabled=False
    3. 不动profiledepartmentsettings
    3.变更目录状态enabled=0status=deleteupdate_time
    
4. 目录删除接口增加校验停用后才可进行删除
def delete(self, request, *args, **kwargs):
        """删除用户目录"""
        ....
		
        # 增加目录状态校验:停用后,才可删除
        
        # 依赖 model 的 delete 方法, 执行软删除
        instance.soft_delete()
        ....
        # 审计日志接入
        # 回收站数据新增
        recycle_map_generate(....)
        return Response(status=status.HTTP_200_OK)

2.接口设计

2.1 功能说明:目录还原预先检查

URL: "api/v1/web/recycle_bin/categories/check/"

Method: POST

body

字段 数据 释义
category_ids list 目录id列表

response

字段 数据 释义
category_id int 目录id
category_display_name char 目录名称
check_status bool 检测结果
error_message char 检测信息
# 目录还原预先检查
urlpath("recycle_bin/categories/check")
class CategoryBatchRevertInputSLZ():
    category_ids = serializers.ListFeild()
    
class CategoryBatchRevertCheckOutputSLZ():
    category_id = IntegerField()
    category_display_name   = CharField
    check_status = BoolField
    error_message = CharField
    
class RecycleBinBatchCategoryRevertCheckApi()
    def post():
        # request.data slz校验 CategoryBatchRevertInputSLZs
        # object_list 下的目录进行冲突校验
        	# 重名冲突
            # 域名重复冲突
        # 返回冲突校验结果
        return CategoryBatchRevertCheckOutputSLZ.data

2.2 功能说明:目录还原

URL: "api/v1/web/recycle_bin/categories/revert/"

Method: POST

body

字段 数据 释义
object_ids list 目录映射关系id列表

response

None

# 检查通过的目录才可调用
urlpath("recycle_bin/categories/revert/")

class RecycleBinBatchCategoryRevertApi()
    def post():
        # request.data slz校验 CategoryBatchRevertInputSLZ
        object_type_instance = RecycleBin.object.filter(...).value_list(....)
        # 变更状态
        return Response

2.3 功能说明:目录对象硬删除

URL: "api/v1/web/recycle_bin/categories/<int:id >/"

Method: Delete

url_params

字段 数据 释义
id int 目录映射关系id

response:

None

    
# 对象硬删除
url: path("recycle_bin/categories/<int:id >")
class RecycleBinCategoryHardDelete()
	
    def delete():
        # 获取对应数据的模型对象
        instance = self.get_object()
        # 数据关联资源删除
        # 进行硬删除,添加审计日志
        return Response
   

@neronkl
Copy link
Contributor

neronkl commented Feb 28, 2023

@Canway-shiisa

@Canway-shiisa
Copy link
Contributor Author

  1. 这里的额外信息放同步目录周期任务的数据?这个应该不需要
  2. 目录删除
    • instance.delete() 维持原有方法名不变就可以?就不需要将对应调用侧都进行修改;
    • 周期任务直接删除,还原的时候重新生成就可以,make_periodic_sync_task的方法看看是否可以复用
  3. 这里即使需要抽象也应该抽象一个校验目录状态的方法,抽一个软删除soft_delete方法感觉没太大必要?直接重构CategoryUpdateDeleteApi().delete()方法进行实现就可以了?

接口设计部分:
2.1 目录预还原检查接口(命名建议)
- URL:api/v1/web/recycle_bin/category/check
- object_ids_list -> category_ids
- category -> category_name
- check_result -> check_status
- message -> error_msg
2.2 目录还原接口
- URL :api/v1/web/recycle_bin/category/
- - method:POST
- object_ids_list -> category_ids
- 这里的返回只设计一个count么?是否可以考虑返回对应目录,及对应还原状态,成功个数由前端判断后展示
注:这里需要确认批量还原是否允许部分成功,失败怎么处理,怎么展示
2.3 永久删除目录 接口
- URL:api/v1/web/recycling_bin/category
- method:DELETE
- object_ids_list -> category_ids

@neronkl
Copy link
Contributor

neronkl commented Mar 16, 2023

4. 新增字段extra_info:保存对象的额外信息

关于周期任务PeriodicTask模型有enable字段,enable=0使周期任务无效化,无需进行额外存储
目录删除接口=>目录删除

def delete(self, request, *args, **kwargs):

  1. 确保目录已经停用,
  2. 增加回收站映射记录

instance.soft_delete => instance.delete

接口设计:
object_ids_list => object_ids
在回收站模块上,本质上是操作数据对象,但是以间接形式。所以明面上通过映射关系的(不是通过目录的id)。

@Canway-shiisa Canway-shiisa added this to the Y2023M11 milestone Mar 16, 2023
@Canway-shiisa
Copy link
Contributor Author

  1. 新增字段extra_info:保存对象的额外信息

关于周期任务PeriodicTask模型有enable字段,enable=0使周期任务无效化,无需进行额外存储 目录删除接口=>目录删除

def delete(self, request, *args, **kwargs):

  1. 确保目录已经停用,
  2. 增加回收站映射记录

instance.soft_delete => instance.delete

直接在原始方案上调整一下哩,方案呈现最终修改的结果就可以

@Canway-shiisa Canway-shiisa modified the milestones: Y2023M11, Y2023M12, Y2023M13 Mar 27, 2023
@Canway-shiisa Canway-shiisa added doing 已经接受处理,正在开发实施 and removed todo 进入开发排期的状态,纳入了最近的迭代 labels Mar 28, 2023
neronkl added a commit to neronkl/bk-user that referenced this issue Apr 14, 2023
…,还原功能

回收站内删除等同对象硬删除(相关资源一并删除),还原为对象恢复正常状态,操作计入审计日志;阻止异常状态目录用户登录;

BREAKING CHANGE: 原category.delete()将对应的资源disable且删除定时任务。新delete不会操作其资源,定期任务disable无效化,进行硬删除才将定时任务删除

feat TencentBlueKing#901
neronkl added a commit to neronkl/bk-user that referenced this issue Apr 14, 2023
…,还原功能

回收站内删除等同对象硬删除(相关资源一并删除),还原为对象恢复正常状态,操作计入审计日志;阻止异常状态目录用户登录;

BREAKING CHANGE: 原category.delete()将对应的资源disable且删除定时任务。新delete不会操作其资源,定期任务disable无效化,进行硬删除才将定时任务删除

feat TencentBlueKing#901
@nannan00 nannan00 modified the milestones: Y2023M15, Y2023M16 Apr 18, 2023
@Canway-shiisa
Copy link
Contributor Author

产品确认细节:

  1. 目录还原校验的是登陆域,非AD连接域
  2. 目录永久删除是异步处理,这块的删除详情产品侧会出一个新页面统一展示删除和还原的结果

@neronkl
Copy link
Contributor

neronkl commented Apr 21, 2023

当前目录的domain字段数据库层面上是唯一的,逻辑层面也做了校验,已经是无法创建相同登录域的目录。
@nannan00

@nannan00 nannan00 modified the milestones: Y2023M16, Y2023M17 Apr 24, 2023
@neronkl
Copy link
Contributor

neronkl commented Apr 25, 2023

mad/ldap类型目录进行停用目录操作,其定时同步任务仍在执行
#960

@Xmandon Xmandon modified the milestones: Y2023M17, Y2023M19 May 8, 2023
@Canway-shiisa Canway-shiisa modified the milestones: Y2023M19, Y2023M20 May 15, 2023
@nannan00 nannan00 modified the milestones: Y2023M20, Y2023M21 May 22, 2023
@nannan00 nannan00 modified the milestones: Y2023M21, Y2023M22, Y2023M23 May 29, 2023
@nannan00 nannan00 modified the milestones: Y2023M23, Y2023M24, Y2023M25 Jun 12, 2023
@nannan00 nannan00 modified the milestones: Y2023M25, Y2023M26 Jun 26, 2023
nannan00 pushed a commit that referenced this issue Jun 27, 2023
#962)

* feat(recycle_bin, categories, audit, period_task, login): 回收站目录项:新增删除,还原功能

回收站内删除等同对象硬删除(相关资源一并删除),还原为对象恢复正常状态,操作计入审计日志;阻止异常状态目录用户登录;

feat #901 #960
yuri0528 pushed a commit to yuri0528/bk-user that referenced this issue Jun 27, 2023
TencentBlueKing#962)

* feat(recycle_bin, categories, audit, period_task, login): 回收站目录项:新增删除,还原功能

回收站内删除等同对象硬删除(相关资源一并删除),还原为对象恢复正常状态,操作计入审计日志;阻止异常状态目录用户登录;

feat TencentBlueKing#901 TencentBlueKing#960
yuri0528 pushed a commit to yuri0528/bk-user that referenced this issue Jun 27, 2023
TencentBlueKing#962)

* feat(recycle_bin, categories, audit, period_task, login): 回收站目录项:新增删除,还原功能

回收站内删除等同对象硬删除(相关资源一并删除),还原为对象恢复正常状态,操作计入审计日志;阻止异常状态目录用户登录;

feat TencentBlueKing#901 TencentBlueKing#960
@nannan00 nannan00 closed this as completed Jul 3, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
doing 已经接受处理,正在开发实施 Layer: api Api module related Priority: High
Projects
None yet
Development

No branches or pull requests

6 participants