博客开发日志 - day13
今天完善了RBAC权限清理脏数据的逻辑
今天把用户、角色禁用这块的逻辑完善了,老实说,工作量比我想的大多了,因为还要完善之前RBAC的逻辑,因为没有使用外键和级联删除,所以在删除角色、菜单、api时,得一步步清理很多表,这块逻辑相当烧脑,弄了一整个下午,勉强算是弄完了,其实就是一步步来,在这之间出了个bug,因为之前偷懒,直接写了一个sql是根据api_id清理permission表,导致我如果没有严格按照顺序清理,先将api_permission这张表清理的话,这个sql会因为没有关联的数据而无法清理脏数据,后面还是改成了先查,这样顺不顺序的就无所谓了。
go
复制代码
s.store.WithTx(ctx, func(q *sqlc.Queries) error {
// 1. 找出权限id
permissionID, err := q.GetSysPermissionIDBySysApiID(ctx, id)
if err != nil {
return dberr.MapNoRows(err, errs.ErrSysApiNotFound)
}
// 2. 根据权限id,删除角色权限关联数据
if err = q.DeleteSysRolePermissionByPermissionID(ctx, permissionID); err != nil {
return err
}
// 3. 根据api id 删除sys_api_permission关联表数据
if err = q.DeleteSysApiPermission(ctx, id); err != nil {
return err
}
// 4. 根据权限id,删除权限表权限数据
if err = q.DeleteSysPermission(ctx, permissionID); err != nil {
return err
}
// 5. 删除api
rows, err := q.DeleteSysApi(ctx, id)
if err = dberr.MapRowsAffected(rows, err, errs.ErrSysApiNotFound); err != nil {
return err
}
return nil
})