refac: DELETE /v1/user/{id}?expected_role_id=N, user.remove audit event, 409 target_role_not_found, GetAll returns its error, Own-scope visibility filter moved into repos, JSON tags removed from use-case types
This commit is contained in:
1 parent
5d6f378fce
commit
b39a41be88
124 files changed
+8816
-523
No files matched your search
@@ -0,0 +1,118 @@
|
||||
# Change log: roles sync (pass 6)
|
||||
|
||||
Diff this against the code. "Old" is the previous design copy, "New" is the copy now in the design. EN is the design language; FR is in the board table "Final copy: toasts and errors, EN and FR" (screens/roles.md, same title). Every state is drawn light and dark, 1440×900 and 390×844, on `RenewCMS Screens Roles.dc.html` (data `roles-spec.js`, frame `RolesFrame.dc.html`) unless stated. Roles board: 61 → 90 states, 11 → 15 groups.
|
||||
|
||||
## 3. Differences adopted
|
||||
|
||||
### 3.1 Neutral wording ("they")
|
||||
| File · state | Old | New |
|
||||
|---|---|---|
|
||||
| roles-spec.js, screens/roles.md, RolesFrame · Users: Change role dialog and Change role: options blocked | Her API keys follow the new role. | Their API keys follow the new role. |
|
||||
| same · Users: Transfer ownership: confirm | You become an Admin. You can't take ownership back unless he transfers it. | You become an Admin. You can't take ownership back unless they transfer it. |
|
||||
Searched all .md, .js, .dc.html and email files for he, she, his, her, him, hers. No other occurrence.
|
||||
|
||||
### 3.2 Event names
|
||||
| File | Old | New |
|
||||
|---|---|---|
|
||||
| routes.md, screens/roles.md (Needs backend), roles-spec.js | role.created, role.updated, role.deleted, user.role_changed, site.ownership_transferred | role.create, role.update, role.delete, role.reassign (new), user.role_change, site.ownership_transfer |
|
||||
| states.md (new section "Roles sync"), screens/activity.md (new section) | event names and sentences were not written down | table of name, sentence, failed sentence |
|
||||
Sentences themselves are unchanged ("Role Contributor created", and so on).
|
||||
|
||||
### 3.3 Invite endpoint
|
||||
| File | Old | New |
|
||||
|---|---|---|
|
||||
| screens/roles.md group 5, roles-spec.js group 5 | POST /v1/invite | POST /v1/user/invite |
|
||||
routes.md, components.md and the other screen files never cited `/v1/invite`. IntegrationPage already said `/v1/user/invite`.
|
||||
|
||||
## 1. Copy
|
||||
All EN and FR strings: roles board, table "Final copy: toasts and errors, EN and FR", and group 12 (toasts) and 13 (inline errors).
|
||||
| State | EN |
|
||||
|---|---|
|
||||
| Toast: role changed (group 12) | Role changed · Ines Duarte is now Content lead, and their API keys follow the new role. |
|
||||
| Toast: role edited elsewhere, 409 | Role changed elsewhere · Jonas Weber edited Contributor, so nothing was saved. Reload and try again. · Reload |
|
||||
| Toast: role deleted elsewhere | That role no longer exists · It was deleted somewhere else, so we removed it from the list. |
|
||||
| Toast: member's role changed before a change | Role not changed · Ines Duarte's role changed in the meantime, so nothing was saved. Reload and try again. · Reload |
|
||||
| Toast: target's role changed before a transfer | Ownership not transferred · Jonas Weber's role changed in the meantime, so nothing was transferred. Check it and try again. · Reload |
|
||||
| Toast: member's role changed before a removal | User not removed · Ines Duarte's role changed in the meantime, so nothing was removed. Check it and try again. · Reload |
|
||||
| Role editor: save failed (new) | Couldn't save the role · Your changes are still here. Try again in a moment. · Try again |
|
||||
| Change role: failed (new) | Couldn't change the role · Nothing was changed. Try again in a moment. |
|
||||
| Delete role: target deleted (new) | Writer no longer exists · It was deleted somewhere else. Choose another role to move the members to. |
|
||||
| Delete role: role gained members (new) | Role still has members · Intern now has 1 member. Move them to another role first. |
|
||||
| Delete role: move failed (new) | Couldn't move the members · Nothing was changed. Try again in a moment. |
|
||||
| Invite: invalid email (new) | Enter a valid email address. |
|
||||
| Invite: account exists, 409 (new) | This address already has an account. |
|
||||
| Invite: role above yours (new) | Your role can't assign a role with more power than yours. |
|
||||
| Invite: send failed (new) | Couldn't send the invite · Try again in a moment. |
|
||||
| Activity, role.reassign | Moved 3 members from Intern to Writer |
|
||||
| Activity, failed sentences | Failed to {verb} {object}; one per event in the table "Activity events: failed sentences, EN and FR" |
|
||||
| Activity filter, category names | Articles · Media · Users and invites (old: Users & invites) · Roles (new) · API keys · Authentication · System |
|
||||
Unchanged and still correct: Name required, Name already taken, Escalation blocked, Conflict banner, Permission lowered.
|
||||
|
||||
## 2. Profile role card (group 9)
|
||||
Decision: the summary line is removed. "Assigned by Marta Alves" is removed with it, because `access.role` has no such field either. "See what I can do" stays; its summary is computed from the permission list in GET /v1/me.
|
||||
| State | Old | New |
|
||||
|---|---|---|
|
||||
| Role card: custom role | Your role · Contributor · Assigned by Marta Alves · Creates content and edits only their own. · See what I can do · Your API keys follow this role… | Your role · [Contributor badge] [Custom tag] · See what I can do · Your API keys follow this role. If your role changes, they change too. |
|
||||
| Role card: Owner (new) | none | Your role · [Owner badge] [Locked] [Built-in] · See what I can do · same key line |
|
||||
Layout, top to bottom, inside the existing card: title; one row of badges (role badge with icon, then Locked if `locked`, then Built-in or Custom from `built_in`); link row with the list-checks icon; muted key line. Gap 12, as every card.
|
||||
|
||||
## 4. Behaviour
|
||||
### Read = Own (group 14, new, 5 states; also group 2 Role editor and group 3 preview via the same editor)
|
||||
| State | Content |
|
||||
|---|---|
|
||||
| Role editor: Read set to Own | New info alert under the grid: Read: Own · Articles show online articles plus the person's own drafts. Custom content types show only entries the person created. Status counts follow the same rule. The preview sentence for Read = Own is now type-specific: "Can read online articles and their own drafts" (Articles) and "Can read only entries they created" (custom types). Old preview text was "read only their own". |
|
||||
| Articles list: Read = Own | Junior writer: 3 online articles by others and 2 own drafts. Tabs All 5, Online 3, Draft 2. Banner: Drafts by others are hidden. |
|
||||
| Articles list: no drafts of their own | Draft tab, counts All 3, Online 3, Draft 0. You have no drafts · Drafts you create appear here. Your role can't see drafts by other people. |
|
||||
| Entry list: Read = Own | Only own entries, "3 entries", banner Entries by others aren't shown. |
|
||||
| Entry list: no entries of their own | You haven't created an event yet · Your role shows only entries you created, so other people's events aren't listed here. Use New entry to add one. |
|
||||
Decisions table row 4 now says Update and Delete set to Own keep the View only rows, Read set to Own hides them.
|
||||
|
||||
### 409 conflicts (group 15, new, 5 states)
|
||||
| State | Where | Edits kept | Recovery |
|
||||
|---|---|---|---|
|
||||
| Stale save: banner (existing Conflict state, copy unchanged) | Banner above the form | Yes, Save off | Reload role, or Review differences |
|
||||
| Stale save: review differences (new) | Dialog over the editor | Yes | Keep my edits (reload and re-apply edits on top, Save on) or Use the saved role (drop edits) |
|
||||
| Stale save: edits kept after reload (new) | Info toast, form shows saved role plus edits | Yes | Review, then Save |
|
||||
| Change role: member's role changed (new) | Alert inside the dialog; toast if closed | Selection kept; Current mark moves | Change role again |
|
||||
| Transfer ownership: target's role changed (new) | Alert inside the dialog; toast if closed | Typed email kept; primary off | Reload member, then Transfer ownership |
|
||||
|
||||
### Integration page (IntegrationPage.dc.html, Back-office board group Integration)
|
||||
| Item | Old | New |
|
||||
|---|---|---|
|
||||
| Authentication, API key card | …with that user's role (owner or admin). A key never has more rights than its creator. | …with that user's role as it is now. A key never has more rights than its creator. A route that needs a permission answers 403 "missing_permission" to a key whose creator's role lacks it. |
|
||||
| Errors table, 403 | "This action needs a real session.", "Only the owner can do this.", "Only owners and admins can do this." or "You must verify your account to access this resource." | "This action needs a real session.", `missing_permission` (code style, literal body), or "You must verify your account to access this resource." Note: `missing_permission` is the literal body, not a sentence. Site SEO defaults need the permission to manage sites. Article SEO fields need only the right to edit the article. |
|
||||
| Access chip on 9 routes (content types create, update, delete; built-in types list, get; media purge settings get, patch, preview, purge) | Owner or admin | Needs permission. The route description ends with Needs the permission "…". Proposed permissions: Create and edit content types; Delete content types; View content types; Delete files (purge routes). |
|
||||
| Per-route 403 line on those routes | Only owners and admins can do this. | missing_permission (code style) |
|
||||
| Content types section intro | An owner or admin creates a type… | A user whose role can create and edit content types defines a type… |
|
||||
"Owner only" chips are kept for the owner-only routes.
|
||||
|
||||
### Relation picker (SchemaFrame, Schema board group 7, Later)
|
||||
Sample data: 25 venues per page (the design had 3 sample results, never 10), footer "Showing 25 of 62" with Load more. New state "Relation picker: loading more": skeleton rows, Loading… on a disabled button. Group 7: 3 → 4 states.
|
||||
|
||||
## Files touched
|
||||
roles-spec.js, RolesFrame.dc.html, screens/roles.md (regenerated from the spec), routes.md, states.md, screens/activity.md, screens/integration.md, screens/schema-later.md, schema-spec.js, SchemaFrame.dc.html, IntegrationPage.dc.html, README.md.
|
||||
|
||||
## Open items for you
|
||||
See the end of this file's companion list in the chat reply; repeated here.
|
||||
1. Relation picker: the design never had a "Load more" frame or a 10-result sample. Both were added, not updated.
|
||||
2. Activity event names: states.md and screens/activity.md did not contain event names; they only existed in roles.md, roles-spec.js and routes.md. I added the table to the first two.
|
||||
3. `user.role_changed` and `site.ownership_transferred` became `user.role_change` and `site.ownership_transfer`. Your brief said "the same present-tense pattern for the other role events". Confirm those two are included.
|
||||
4. `/v1/invite` appeared only in screens/roles.md and roles-spec.js. routes.md, components.md and the other screens already had `/v1/user/invite` or no citation.
|
||||
5. The 403 row in the design did not list "missing_permission". It listed "Only the owner can do this." and "Only owners and admins can do this.", which I removed. Check that owner-only routes now also answer `missing_permission`.
|
||||
6. Status naming: you say All / Online / Draft; the design already used Online and Draft, so no change.
|
||||
7. "Role deleted by someone else (409)": a deleted role normally answers 404. I drew 404 for the roles list and an inline 409 only where the deleted role was a reassign target. Confirm the codes.
|
||||
8. "Changing a role that changed meanwhile": I read it as the member's role having changed, not the role definition. Confirm.
|
||||
9. Profile: `access.role` has no assigned_by, so "Assigned by" was removed along with the summary. Confirm that the permission summary can be built from /v1/me.
|
||||
10. Activity categories: the filter had six categories. I added Roles and renamed "Users & invites" to "Users and invites" to match the permission group. Authors, Sites and Content types have activity in the product but no category in the filter; I did not add them.
|
||||
11. Purge routes: the catalogue has no permission for media purge. I used Delete files. Pick the real one.
|
||||
12. Not changed, but now out of date: IntegrationPage Entries intro still says "Any verified user can write entries"; screens/schema.md and the Schema frames say "Owner or admin" for Schema; states.md "Sites and authors: roles" and the 403 owner_only rows still describe fixed roles; screens/profile.md Display name copy. Say if you want these aligned.
|
||||
13. Decision 4 in "Decisions to confirm" was narrowed (Read = Own hides rows). Direct link to a hidden item answers the existing 404 page; this is proposed.
|
||||
14. French role names: built-in names (Owner, Admin, Writer) stay English in FR copy until you decide.
|
||||
15. Toast bodies use two short sentences in places; the glossary says one. Kept for clarity.
|
||||
|
||||
## Corrections made while importing into the repo
|
||||
These were checked against the backend and applied to the repo copy of the design (the Claude Design copy still has the old values).
|
||||
1. Event names: the backend emits `role.edit` (not `role.update`), `user.change_role` (not `user.role_change`) and `user.transfer_ownership` (not `site.ownership_transfer`). The other three, `role.create`, `role.delete` and `role.reassign`, match.
|
||||
2. Media purge permissions: `GET /v1/media/purge-settings` needs "View settings", `PATCH /v1/media/purge-settings` needs "Edit general settings", and `GET /v1/media/purge-preview` and `POST /v1/media/purge` need "Delete files".
|
||||
3. Open item 7 (deleted role): the backend answers 404 for a deleted role and 409 for a stale role save, as drawn.
|
||||
4. Open item 8: "changing a role that changed meanwhile" means the member's role, as read.
|
||||
Reference in new issue
Block a user