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:
1 parent
a043f7f41a
commit
094df63a7f
51 files changed
+4822
-115
No files matched your search
@@ -100,3 +100,21 @@ const InvalidFieldErrorMessage = "invalid_field"
|
||||
const SchemaIncompatibleErrorMessage = "schema_incompatible"
|
||||
const EntryNotFoundErrorMessage = "entry_not_found"
|
||||
const InvalidEntryErrorMessage = "invalid_entry"
|
||||
|
||||
const RoleNotFoundErrorMessage = "role_not_found"
|
||||
const RoleLockedErrorMessage = "role_locked"
|
||||
const RoleBuiltInErrorMessage = "role_built_in"
|
||||
const BuiltInNameErrorMessage = "built_in_name"
|
||||
const NotBuiltInErrorMessage = "not_built_in"
|
||||
const OwnRoleErrorMessage = "own_role"
|
||||
const EscalationErrorMessage = "escalation"
|
||||
const EscalationHeader = "X-Escalation-Key"
|
||||
const RoleNameTakenErrorMessage = "role_name_taken"
|
||||
const RoleConflictErrorMessage = "role_conflict"
|
||||
const RoleHasMembersErrorMessage = "role_has_members"
|
||||
const InvalidRoleNameErrorMessage = "invalid_role_name"
|
||||
const UnknownPermissionErrorMessage = "unknown_permission"
|
||||
const InvalidScopeErrorMessage = "invalid_scope"
|
||||
const OwnerOnlyPermissionErrorMessage = "owner_only_permission"
|
||||
const DuplicatePermissionErrorMessage = "duplicate_permission"
|
||||
const UnknownContentTypeErrorMessage = "unknown_content_type"
|
||||
Reference in new issue
Block a user