feat: /v1/role list, get, create, update and delete. Reassign members on delete. Write-time validation (ValidateGrants, duplicates, typed keys against real content types). Name uniqueness (role_name_taken), role_locked, role_has_members, role_conflict on version mismatch. No-escalation: nobody grants a permission they don't hold, and roles.edit_owner_only guards the Owner role. Activity events for role changes. Typed-key exposure in /auth/me. Cleanup of typed rows when a content type is deleted. | Backend only. Will carry the deferred ListGrants decision.

This commit is contained in:
Florian Sylvain committed 2026-10-27 00:45:24 +01:00
1 parent a043f7f41a
commit 094df63a7f
51 files changed
+4822 -115

No files matched your search

+3 -3
View File
@@ -42,10 +42,10 @@ func TestRoleRepositoryFailures(t *testing.T) {
}
})
t.Run("ListGrants and role loading fail when grants cannot be read", func(t *testing.T) {
t.Run("List and role loading fail when grants cannot be read", func(t *testing.T) {
repo := broken(t, "role_permissions")
if _, err := repo.ListGrants(1); err == nil {
t.Error("ListGrants: expected error")
if _, err := repo.List(); err == nil {
t.Error("List: expected error")
}
if _, err := repo.Get(1); err == nil {
t.Error("Get: expected error")