feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
{"code_snippets":[{"id":"9c3911a56d8521ef26f3e3ec2accd8a5","path":"crm-auth/src/main/java/com/crm/auth/controller/AuthController.java","line_range":"30-34","gmt_create":"2026-08-03T19:26:09.3538194+08:00","gmt_modified":"2026-08-03T19:26:09.3538194+08:00"},{"id":"7b901ed8b88126265d0f6a5b26105fac","path":"crm-auth/src/main/java/com/crm/auth/service/IAuthService.java","line_range":"14-15","gmt_create":"2026-08-03T19:26:09.3538194+08:00","gmt_modified":"2026-08-03T19:26:09.3538194+08:00"},{"id":"daaa931a3614c39bba377186b1f5be5f","path":"crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java","line_range":"64-93","gmt_create":"2026-08-03T19:26:09.3538194+08:00","gmt_modified":"2026-08-03T19:26:09.3538194+08:00"},{"id":"c440d4eea295917cf8174d31ba36318a","path":"crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java","line_range":"13-23","gmt_create":"2026-08-03T19:26:09.3548166+08:00","gmt_modified":"2026-08-03T19:26:09.3548166+08:00"},{"id":"bb69d53898126328709f0ffa74b84a21","path":"crm-auth/src/main/java/com/crm/auth/controller/AuthController.java","line_range":"36-41","gmt_create":"2026-08-03T19:26:09.3548166+08:00","gmt_modified":"2026-08-03T19:26:09.3548166+08:00"},{"id":"08f1e1f256663048fa344ad9d0b2ec50","path":"crm-auth/src/main/java/com/crm/auth/controller/AuthController.java","line_range":"43-47","gmt_create":"2026-08-03T19:26:09.3548166+08:00","gmt_modified":"2026-08-03T19:26:09.3548166+08:00"},{"id":"bf93fb5169672f79ac4fd9358def044a","path":"crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java","line_range":"12-41","gmt_create":"2026-08-03T19:26:09.355814+08:00","gmt_modified":"2026-08-03T19:26:09.355814+08:00"},{"id":"e2830d81d6e28aed10dccc2713cc2d1b","path":"crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java","line_range":"1-48","gmt_create":"2026-08-04T09:56:41.6441443+08:00","gmt_modified":"2026-08-04T09:56:41.6441443+08:00"},{"id":"45bf77ddaa679acca8c5535083b5945c","path":"crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java","line_range":"1-262","gmt_create":"2026-08-04T09:56:41.6441443+08:00","gmt_modified":"2026-08-04T09:56:41.6441443+08:00"},{"id":"8db96ae3b010284910f8431c1c2367f0","path":"crm-auth/src/main/java/com/crm/auth/service/IResourceService.java","line_range":"1-26","gmt_create":"2026-08-04T09:56:41.6446554+08:00","gmt_modified":"2026-08-04T09:56:41.6446554+08:00"},{"id":"9488e996384d45f67488bdccc4e0f0b6","path":"crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java","line_range":"1-80","gmt_create":"2026-08-04T09:57:47.7435815+08:00","gmt_modified":"2026-08-04T09:57:47.7435815+08:00"},{"id":"57d5a8ab851652a3705c29fe5c19864f","path":"crm-file/src/main/java/com/crm/file/api/FileApi.java","line_range":"1-106","gmt_create":"2026-08-04T09:57:47.7440898+08:00","gmt_modified":"2026-08-04T09:57:47.7440898+08:00"},{"id":"0415a1cb895b4930fc134a552eb7fcd9","path":"crm-auth/src/main/java/com/crm/auth/security/PermissionResolver.java","line_range":"16-35","gmt_create":"2026-08-04T17:27:53.0830064+08:00","gmt_modified":"2026-08-04T17:27:53.0830064+08:00"},{"id":"de8131647b7f08746c909c1fdda7ae19","path":"crm-auth/src/main/java/com/crm/auth/security/PermissionGrant.java","line_range":"23-67","gmt_create":"2026-08-04T17:27:53.0830064+08:00","gmt_modified":"2026-08-04T17:27:53.0830064+08:00"},{"id":"a5d94bb70272c22b15814a900046743e","path":"crm-auth/src/main/java/com/crm/auth/security/PermissionResolverImpl.java","line_range":"39-139","gmt_create":"2026-08-04T17:29:09.6036544+08:00","gmt_modified":"2026-08-04T17:29:09.6036544+08:00"},{"id":"fe2b7c626178194ac3902aff308e602c","path":"crm-auth/src/main/java/com/crm/auth/controller/RoleController.java","line_range":"1-98","gmt_create":"2026-08-05T12:33:48.8062431+08:00","gmt_modified":"2026-08-05T12:33:48.8062431+08:00"},{"id":"cec4b333c23562375f8ba726ff8e33d4","path":"crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java","line_range":"1-43","gmt_create":"2026-08-05T12:33:48.8067546+08:00","gmt_modified":"2026-08-05T12:33:48.8067546+08:00"},{"id":"0258e4223cc6ad38e68
|