CloudRoleManager — API Sequence Diagrams


1. Registration

sequenceDiagram actor User participant App as Tenant App participant CRM as CloudRoleManager User->>App: Fill registration form\n(org name, email, password) App->>CRM: POST /api/v1/auth/register alt Success CRM-->>App: 201 {org_id, user_id, message} App-->>User: "Registration successful — please log in" else Org name or email already taken CRM-->>App: 409 {error: "Organisation name or email already exists"} App-->>User: Show error message else Missing / invalid fields CRM-->>App: 400 {error: "..."} App-->>User: Show validation error end

2. Login & Token Lifecycle

sequenceDiagram actor User participant App as Tenant App participant CRM as CloudRoleManager User->>App: Enter username + password App->>CRM: POST /api/v1/auth/login alt Valid credentials CRM-->>App: 200 {access_token (15 min), refresh_token (30 days), user} App->>App: Store tokens App-->>User: Redirect to dashboard else Wrong credentials or inactive account CRM-->>App: 401 {error: "Invalid credentials"} App-->>User: Show error end Note over App,CRM: For project apps (machine-to-machine), use the project login endpoint App->>CRM: POST /api/v1/auth/project/login\n{username, password, jwt_seed, tenant_id} Note over App,CRM: jwt_seed + tenant_id identify the application\nand its JWT signing secret alt Valid credentials and valid application credentials CRM-->>App: 200 {access_token, refresh_token, user} App->>App: Store tokens else Invalid jwt_seed / tenant_id CRM-->>App: 401 {error: "Invalid application credentials"} end Note over App,CRM: Access token expires after 15 minutes App->>CRM: POST /api/v1/auth/refresh\n{refresh_token} alt Refresh token valid CRM-->>App: 200 {access_token} App->>App: Replace stored access token else Refresh token expired or revoked CRM-->>App: 401 App-->>User: Redirect to login end User->>App: Click Logout App->>CRM: POST /api/v1/auth/logout\n{refresh_token} CRM-->>App: 200 {ok: true} App->>App: Clear stored tokens App-->>User: Redirect to login

3. Authenticated API Request

sequenceDiagram actor User participant App as Tenant App participant CRM as CloudRoleManager User->>App: Navigate to a protected section App->>CRM: GET /api/v1/admin/... (Authorization: Bearer token) alt Token valid CRM-->>App: 200 data App-->>User: Render content else Token expired CRM-->>App: 401 Unauthorized App->>CRM: POST /api/v1/auth/refresh CRM-->>App: 200 new access_token App->>CRM: Retry original request CRM-->>App: 200 data App-->>User: Render content else Refresh token also expired CRM-->>App: 401 Unauthorized App-->>User: Redirect to login end

4. Consumer App — Verifying a User's Permissions

sequenceDiagram actor User participant App as Tenant App participant CRM as CloudRoleManager User->>App: Request a resource requiring "content:read" alt Option A — Shared JWT secret (no network call) App->>App: Decode token locally\nCheck projects[pid].permissions includes "content:read" alt Has permission App-->>User: 200 Resource else Missing permission App-->>User: 403 Forbidden end else Option B — Introspect endpoint App->>CRM: POST /api/v1/auth/introspect\n{token} alt Token active CRM-->>App: 200 {active: true, projects, permissions, ...} App->>App: Check permissions in response App-->>User: 200 Resource else Token invalid or expired CRM-->>App: 401 {active: false} App-->>User: 401 Unauthorized end end

5. Role & Permission Setup (Admin)

sequenceDiagram actor Admin participant App as Tenant App participant CRM as CloudRoleManager Admin->>App: Create role "moderator" (level 25) under "editor" App->>CRM: POST /api/v1/admin/projects/:pid/roles\n{name, level, parent_role_id} alt Parent level constraint violated CRM-->>App: 400 {error: "Parent level must be strictly less than child level"} App-->>Admin: Show error else Cycle in hierarchy detected CRM-->>App: 400 {error: "Cycle detected..."} App-->>Admin: Show error else Success CRM-->>App: 201 {id, name, level} App-->>Admin: Role created end Admin->>App: Assign permission "content:edit" to "moderator" App->>CRM: POST /api/v1/admin/projects/:pid/roles/:id/permissions/:perm_id CRM-->>App: 200 {ok: true} App-->>Admin: Permission assigned Note over Admin,CRM: Next login for any user with "moderator" role\nwill include "content:edit" + all inherited permissions in their JWT

6. User Management (Admin)

sequenceDiagram actor Admin participant App as Tenant App participant CRM as CloudRoleManager Admin->>App: Invite new user (email, password, role) App->>CRM: POST /api/v1/admin/users\n{email, username, password, role_ids} alt Email or username already exists CRM-->>App: 409 {error: "Email or username already exists"} App-->>Admin: Show error else Success CRM-->>App: 201 {id, email, username} App-->>Admin: User created end Admin->>App: Assign additional role to user App->>CRM: POST /api/v1/admin/users/:id/roles/:role_id CRM-->>App: 200 {ok: true} Admin->>App: Deactivate user App->>CRM: DELETE /api/v1/admin/users/:id CRM-->>App: 200 {ok: true} App-->>Admin: User deactivated\n(existing tokens expire naturally after 15 min)

7. Audit Log

sequenceDiagram actor Admin participant App as Tenant App participant CRM as CloudRoleManager Admin->>App: Open audit log (page 1) App->>CRM: GET /api/v1/admin/audit?page=1&per_page=50 CRM-->>App: 200 {data: [...events], total, page, per_page} App-->>Admin: Show paginated event table Admin->>App: Go to next page App->>CRM: GET /api/v1/admin/audit?page=2&per_page=50 CRM-->>App: 200 {data: [...events], total, page, per_page} App-->>Admin: Show next page Note over CRM: Audit log is immutable —\nno update or delete is possible

8. Application Registration & Seed Management

sequenceDiagram actor Admin participant UI as CRM UI participant CRM as CloudRoleManager participant ConsumerApp as Consumer App Admin->>UI: Create application UI->>CRM: POST /api/v1/admin/applications CRM-->>UI: 201 {id, name, ...} Admin->>UI: Link project to application UI->>CRM: POST /api/v1/admin/applications/:id/project\n{project_id} CRM-->>UI: 201 {jwt_seed, tenant_id, jwt_secret, ...} Note over UI,Admin: jwt_seed is shown ONCE here — copy it now\njwt_secret can be viewed again at any time Admin->>ConsumerApp: Configure app with jwt_seed + tenant_id + jwt_secret ConsumerApp->>CRM: POST /api/v1/auth/project/login\n{username, password, jwt_seed, tenant_id} CRM-->>ConsumerApp: 200 {access_token, refresh_token, user} Note over Admin,CRM: On data breach — rotate the jwt_secret Admin->>UI: Rotate secret UI->>CRM: POST /api/v1/admin/applications/:id/project/rotate-secret CRM-->>UI: 200 {jwt_secret: ""} Note over CRM,ConsumerApp: All existing tokens immediately invalid\nUsers must re-login Note over Admin,CRM: On config compromise — rotate the jwt_seed Admin->>UI: Rotate seed UI->>CRM: POST /api/v1/admin/applications/:id/project/rotate-seed CRM-->>UI: 200 {jwt_seed: ""} Note over CRM: Logs seed_rotated to audit changelog Note over UI,ConsumerApp: Consumer app config must be updated\nwith new jwt_seed before project logins work again