20 KiB
User Routes Frontend Documentation
This document describes customer journeys for managing users through the frontend, focusing on how administrators interact with user management and how the backend routes support these experiences. All UI components are dynamically generated from backend metadata—no hardcoding required.
IMPORTANT: All user management pages are admin-only. Non-admin users should not see navigation links or be able to access these pages. The frontend must check user privileges before rendering user management UI.
Table of Contents
- Overview
- Customer Journey 1: Discovering and Browsing Users
- Customer Journey 2: Viewing User Details
- Customer Journey 3: Creating New Users
- Customer Journey 4: Editing User Properties
- Customer Journey 5: Enabling and Disabling Users
- Customer Journey 6: Resetting User Passwords
- Customer Journey 7: Revoking User Sessions
- Customer Journey 8: Deleting Users
- Backend Metadata System
- Implementation Patterns
Overview
The user routes (/api/users) enable administrators to manage users within their mandate. These routes focus on user administration including creation, editing, password management, and deletion.
Key Principles:
- Admin-Only: All user management functionality is restricted to administrators
- User-Centric: Documentation organized around what administrators want to accomplish
- Backend-Driven: All forms, tables, and UI components generated from backend metadata
- No Hardcoding: Field definitions, labels, validation rules, and options come from the backend
- Permission-Aware: Backend enforces permissions; frontend handles gracefully
- Mandate-Scoped: Users are managed within the context of mandates
Customer Journey 1: Discovering and Browsing Users
User Goal
"As an administrator, I want to see all users in my mandate and find the one I'm looking for."
User Story
As an administrator, I want to browse users, search for specific users, filter by any field, sort them by different criteria, and quickly identify which users are enabled, their privilege levels, and their authentication methods.
User Story Flow
sequenceDiagram
participant Admin
participant Frontend
participant Backend
Admin->>Frontend: Navigate to /users (admin only)
Frontend->>Frontend: Check if user is admin
alt User is not admin
Frontend-->>Admin: Redirect to unauthorized page or hide navigation
else User is admin
Frontend->>Backend: GET /api/attributes/User
Backend-->>Frontend: Attribute definitions (fields, labels, types)
Frontend->>Backend: GET /api/users/?pagination=...
Backend-->>Frontend: Paginated users list
Frontend->>Frontend: Generate table columns from attributes
Frontend->>Frontend: Generate filter controls from attributes
Frontend->>Frontend: Render users table + search + filters
Frontend-->>Admin: Display user list with search/filter UI
end
alt Admin performs general search
Admin->>Frontend: Type in search box (e.g., "john")
Frontend->>Frontend: Update search query
Frontend->>Backend: GET /api/users/?pagination=...filters:{"search":"john"}
Backend-->>Frontend: Filtered users list
Frontend-->>Admin: Display matching users
end
alt Admin applies field filter
Admin->>Frontend: Select filter field (e.g., "Privilege")
Frontend->>Frontend: Show filter options from attribute metadata
Admin->>Frontend: Select filter value (e.g., "admin")
Frontend->>Frontend: Update filter parameters
Frontend->>Backend: GET /api/users/?pagination=...filters:{"privilege":"admin"}
Backend-->>Frontend: Filtered users list
Frontend-->>Admin: Display filtered users
end
alt Admin combines search + filter + sort
Admin->>Frontend: Apply search + filter + sort
Frontend->>Frontend: Combine all parameters
Frontend->>Backend: GET /api/users/?pagination=...filters:{"search":"john","privilege":"admin"}...sort:desc
Backend-->>Frontend: Filtered, sorted users list
Frontend-->>Admin: Display results
end
Admin->>Frontend: Click column header (e.g., "Email")
Frontend->>Frontend: Update sort parameters
Frontend->>Backend: GET /api/users/?pagination=...sort:desc
Backend-->>Frontend: Sorted users list
Frontend-->>Admin: Display sorted users
Admin->>Frontend: Click user row
Frontend->>Frontend: Navigate to /users/userId
Frontend-->>Admin: Show user detail page
Customer Journey 2: Viewing User Details
User Goal
"As an administrator, I want to see everything about a specific user—their account information, privilege level, and status."
User Story
As an administrator, I want to open a user and see their complete information, including username, email, full name, language preference, enabled status, privilege level, authentication authority, and mandate association.
User Story Flow
sequenceDiagram
participant Admin
participant Frontend
participant Backend
Admin->>Frontend: Click user from list
Frontend->>Backend: GET /api/users/userId
Backend-->>Frontend: User object
Frontend->>Backend: GET /api/attributes/User
Backend-->>Frontend: Field definitions
Frontend->>Frontend: Generate UI from metadata
Frontend->>Frontend: Render user info section
Frontend->>Frontend: Separate editable vs read-only fields
Frontend-->>Admin: Display complete user view
alt User has editable fields and admin has permission
Frontend->>Frontend: Show "Edit User" button
end
alt Admin has permission
Frontend->>Frontend: Show "Reset Password" button
Frontend->>Frontend: Show "Revoke Sessions" button
Frontend->>Frontend: Show "Delete User" button
end
alt Admin clicks "Revoke Sessions"
Admin->>Frontend: Click "Revoke Sessions" button
Frontend->>Frontend: Show revocation dialog
Admin->>Frontend: Select authority filter (optional)
Admin->>Frontend: Enter reason (optional)
Admin->>Frontend: Click "Revoke"
Frontend->>Frontend: Optimistic update: Show loading state
Frontend->>Backend: POST /api/admin/tokens/revoke/user
alt Success
Backend-->>Frontend: {"revoked": count}
Frontend->>Frontend: Keep optimistic update
Frontend->>Backend: GET /api/users/userId (refetch)
Backend-->>Frontend: Updated user object
Frontend->>Frontend: Update UI with fresh data
Frontend-->>Admin: Show success message
else Error (403/400/500)
Backend-->>Frontend: Error response
Frontend->>Frontend: Revert optimistic update
Frontend-->>Admin: Show error message
end
end
alt Admin clicks "Reset Password"
Admin->>Frontend: Click "Reset Password" button
Frontend->>Frontend: Show password reset dialog
Admin->>Frontend: Enter new password
Admin->>Frontend: Confirm password
Admin->>Frontend: Click "Reset"
Frontend->>Frontend: Optimistic update: Show loading state
Frontend->>Backend: POST /api/users/userId/reset-password
alt Success
Backend-->>Frontend: Success response
Frontend->>Frontend: Keep optimistic update
Frontend->>Backend: GET /api/users/userId (refetch)
Backend-->>Frontend: Updated user object
Frontend->>Frontend: Update UI with fresh data
Frontend-->>Admin: Show success message
else Error (403/400/500)
Backend-->>Frontend: Error response
Frontend->>Frontend: Revert optimistic update
Frontend-->>Admin: Show error message
end
end
alt Admin clicks "Delete User"
Admin->>Frontend: Click "Delete User" button
Frontend->>Backend: GET /api/users/userId
Backend-->>Frontend: User data (for name)
Frontend->>Frontend: Show confirmation dialog
Admin->>Frontend: Confirm deletion
Frontend->>Frontend: Optimistic update: Remove user from UI
Frontend->>Backend: DELETE /api/users/userId
alt Success
Backend-->>Frontend: Success response
Frontend->>Frontend: Keep optimistic update
Frontend->>Frontend: Navigate to /users
Frontend-->>Admin: Show success message
else Error (403/404/500)
Backend-->>Frontend: Error response
Frontend->>Frontend: Revert optimistic update
Frontend-->>Admin: Show error message
end
end
Customer Journey 3: Creating New Users
User Goal
"As an administrator, I want to create new users for my mandate."
User Story
As an administrator, I want to create a new user by filling out a form with their username, email, full name, language preference, privilege level, and initial password. The form should validate all required fields and show clear error messages.
User Story Flow
sequenceDiagram
participant Admin
participant Frontend
participant Backend
Admin->>Frontend: Click "Create User" button
Frontend->>Frontend: Navigate to /users/create
Frontend->>Backend: GET /api/attributes/User
Backend-->>Frontend: Field definitions (editable fields)
Frontend->>Frontend: Filter editable fields
Frontend->>Frontend: Generate form from attributes
Frontend->>Frontend: Add password field (special case)
Frontend-->>Admin: Display create user form
Admin->>Frontend: Fill in form fields
Admin->>Frontend: Enter password
Admin->>Frontend: Click "Create"
Frontend->>Frontend: Validate form (required fields, types, email format)
alt Validation fails
Frontend-->>Admin: Show validation errors
else Validation passes
Frontend->>Backend: POST /api/users + form data + password
alt Permission denied (403)
Backend-->>Frontend: 403 Forbidden
Frontend-->>Admin: Show permission error
else Validation error (400)
Backend-->>Frontend: 400 Bad Request + error details
Frontend-->>Admin: Show backend validation errors
else Success (200)
Backend-->>Frontend: Created user object
Frontend->>Frontend: Navigate to user detail page
Frontend-->>Admin: Show created user
end
end
Customer Journey 4: Editing User Properties
User Goal
"As an administrator, I want to change user settings like their name, email, privilege level, or enabled status."
User Story
As an administrator, I want to edit a user's properties through a form that only shows fields I'm allowed to edit, with validation and clear error messages.
User Story Flow
sequenceDiagram
participant Admin
participant Frontend
participant Backend
Admin->>Frontend: Click "Edit" button
Frontend->>Frontend: Navigate to /users/id/edit
Frontend->>Backend: GET /api/users/userId
Backend-->>Frontend: Current user data
Frontend->>Backend: GET /api/attributes/User
Backend-->>Frontend: Field definitions (editable fields)
Frontend->>Frontend: Filter editable fields
Frontend->>Frontend: Generate form from attributes
Frontend->>Frontend: Pre-populate form with user data
Frontend-->>Admin: Display edit form
Admin->>Frontend: Modify form fields
Admin->>Frontend: Click "Save"
Frontend->>Frontend: Validate form (required fields, types)
alt Validation fails
Frontend-->>Admin: Show validation errors
else Validation passes
Frontend->>Frontend: Optimistic update: Apply changes to UI immediately
Frontend->>Backend: PUT /api/users/userId + form data
alt Permission denied (403)
Backend-->>Frontend: 403 Forbidden
Frontend->>Frontend: Revert optimistic update
Frontend-->>Admin: Show permission error
else Validation error (400)
Backend-->>Frontend: 400 Bad Request + error details
Frontend->>Frontend: Revert optimistic update
Frontend-->>Admin: Show backend validation errors
else Success (200)
Backend-->>Frontend: Updated user
Frontend->>Frontend: Keep optimistic update (or refresh from response)
Frontend->>Frontend: Navigate to detail page
Frontend-->>Admin: Show updated user
end
end
Customer Journey 5: Enabling and Disabling Users
User Goal
"As an administrator, I want to quickly enable or disable users directly from the user list without navigating to their detail page."
User Story
As an administrator, I want to toggle a user's enabled status directly in the user list table. When I click the toggle, it should immediately update the user's status in the backend with an optimistic update, so the UI feels responsive and confident.
User Story Flow
sequenceDiagram
participant Admin
participant Frontend
participant Backend
Admin->>Frontend: View user list table
Frontend->>Backend: GET /api/users/?pagination=...
Backend-->>Frontend: Paginated users list
Frontend->>Frontend: Render table with enabled toggle column
Frontend-->>Admin: Display user list with enabled toggles
Admin->>Frontend: Click enabled toggle for user
Frontend->>Frontend: Optimistic update: Toggle switch immediately<br/>(enabled: true → false or false → true)
Frontend->>Backend: PUT /api/users/userId + {enabled: newValue}
alt Success (200)
Backend->>Backend: Update user enabled status
Backend-->>Frontend: Updated user object
Frontend->>Frontend: Keep optimistic update (toggle already changed)
Frontend->>Backend: GET /api/users/?pagination=... (refetch list)
Backend-->>Frontend: Updated users list
Frontend->>Frontend: Update table with fresh data
Frontend-->>Admin: Show subtle success indicator (optional)
else Error (403/400/404/500)
Backend-->>Frontend: Error response
Frontend->>Frontend: Revert optimistic update: Toggle back to original state
Frontend-->>Admin: Show error message
end
Customer Journey 6: Resetting User Passwords
User Goal
"As an administrator, I want to reset a user's password when they forget it or need a new one."
User Story
As an administrator, I want to reset a user's password by entering a new password. The system should validate password strength and automatically revoke all existing tokens for security.
User Story Flow
sequenceDiagram
participant Admin
participant Frontend
participant Backend
Admin->>Frontend: Click "Reset Password" button
Frontend->>Frontend: Show password reset dialog
Admin->>Frontend: Enter new password
Admin->>Frontend: Confirm new password
Admin->>Frontend: Click "Reset"
Frontend->>Frontend: Validate password (min 8 characters)
Frontend->>Frontend: Validate passwords match
alt Validation fails
Frontend-->>Admin: Show validation errors
else Validation passes
Frontend->>Backend: POST /api/users/userId/reset-password + newPassword
alt Permission denied (403)
Backend-->>Frontend: 403 Forbidden
Frontend-->>Admin: Show permission error
else Validation error (400)
Backend-->>Frontend: 400 Bad Request (password too short)
Frontend-->>Admin: Show validation error
else Success (200)
Backend->>Backend: Reset password
Backend->>Backend: Revoke all user tokens
Backend-->>Frontend: Success response
Frontend-->>Admin: Show success message
end
end
Frontend Requirements
📋 Complete frontend requirements for this journey are documented in User Page Requirements
The frontend must implement a password reset dialog with password strength validation. This is an admin-only action.
const handleResetPassword = async (userId: string, newPassword: string) => {
// Validate password strength
if (newPassword.length < 8) {
showError('Password must be at least 8 characters long');
return;
}
const response = await fetch(`/api/users/${userId}/reset-password`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ newPassword })
});
if (response.ok) {
showSuccess('Password reset successfully. All user sessions have been revoked.');
} else {
const error = await response.json();
showError(error.detail || 'Failed to reset password');
}
};
Customer Journey 7: Revoking User Sessions
User Goal
"As an administrator, I want to revoke all active sessions for a user to force them to log in again."
User Story
As an administrator, I want to revoke all active tokens/sessions for a user, optionally filtered by authentication authority (local, Google, Microsoft). This is useful for security purposes, such as when a user's account may have been compromised or when they need to be logged out of all devices.
User Story Flow
sequenceDiagram
participant Admin
participant Frontend
participant Backend
Admin->>Frontend: Click "Revoke Sessions" button
Frontend->>Frontend: Show session revocation dialog
Admin->>Frontend: Optionally select authority filter (local/Google/Microsoft)
Admin->>Frontend: Optionally enter reason
Admin->>Frontend: Click "Revoke Sessions"
Frontend->>Backend: POST /api/admin/tokens/revoke/user + {userId, authority?, reason?}
alt Permission denied (403)
Backend-->>Frontend: 403 Forbidden
Frontend-->>Admin: Show permission error
else Success (200)
Backend->>Backend: Revoke all active tokens for user
Backend-->>Frontend: {"revoked": count}
Frontend-->>Admin: Show success message with count
end
Customer Journey 8: Deleting Users
User Goal
"As an administrator, I want to delete users that are no longer needed."
User Story
As an administrator, I want to delete users with a clear confirmation to prevent accidental deletion.
User Story Flow
sequenceDiagram
participant Admin
participant Frontend
participant Backend
Admin->>Frontend: Click "Delete" button
Frontend->>Backend: GET /api/users/userId
Backend-->>Frontend: User data (for name)
Frontend->>Frontend: Show confirmation dialog<br/>"Delete 'User Name'?"
Admin->>Frontend: Cancel deletion
Frontend-->>Admin: Dialog closed, no action
Admin->>Frontend: Click "Delete" button again
Frontend->>Backend: GET /api/users/userId
Backend-->>Frontend: User data
Frontend->>Frontend: Show confirmation dialog
Admin->>Frontend: Confirm deletion
Frontend->>Frontend: Optimistic update: Remove user from UI immediately
Frontend->>Backend: DELETE /api/users/userId
alt Permission denied (403)
Backend-->>Frontend: 403 Forbidden
Frontend->>Frontend: Revert optimistic update: Restore user in UI
Frontend-->>Admin: Show permission error
else Not found (404)
Backend-->>Frontend: 404 Not Found
Frontend->>Frontend: Revert optimistic update: Restore user in UI
Frontend-->>Admin: Show not found error
else Success (200)
Backend-->>Frontend: Success response
Frontend->>Frontend: Keep optimistic update (user already removed)
Frontend->>Frontend: Show success message
Frontend->>Frontend: Navigate to /users (if on detail page)
Frontend-->>Admin: Display user list (without deleted user)
end