Skip to content

Users API (Pending)

Migration Pending

This API is pending migration to Cloudflare Workers.

The Users API provides user management, role assignment, and access control.

Planned Procedures

ProcedureTypeDescription
users.getAllQueryGet all users (admin only)
users.getByIdQueryGet user by ID
users.createMutationCreate new user
users.updateMutationUpdate user profile
users.deleteMutationDelete user
users.updateRoleMutationChange user role
users.resetPasswordMutationReset user password
users.getActivityQueryGet user activity log

Data Model

User

typescript
interface User {
  id: string;
  email: string;
  firstName: string;
  lastName: string;
  role: UserRole;
  phone?: string;
  avatar?: string;
  department?: string;
  isActive: boolean;
  lastLogin?: Date;
  createdAt: Date;
  updatedAt: Date;
}

User Role

typescript
enum UserRole {
  ADMIN = "ADMIN",           // Full system access
  OPERATOR = "OPERATOR",     // Monitor & manage operations
  ANALYST = "ANALYST",       // View reports & analytics
  FIELD = "FIELD",           // Field operations
  VIEWER = "VIEWER"          // Read-only access
}

Role Permissions

PermissionAdminOperatorAnalystFieldViewer
View DashboardYesYesYesYesYes
Manage SensorsYesYesNoNoNo
View ReportsYesYesYesNoYes
Generate ReportsYesYesYesNoNo
Manage IncidentsYesYesNoYesNo
Manage UsersYesNoNoNoNo
System SettingsYesNoNoNoNo

Planned Input Schemas

Create User

typescript
{
  email: string;               // Required, valid email
  password: string;            // Required, min 8 chars
  firstName: string;           // Required
  lastName: string;            // Required
  role: UserRole;              // Default: VIEWER
  phone?: string;
  department?: string;
}

Update User

typescript
{
  id: string;                  // Required
  firstName?: string;
  lastName?: string;
  phone?: string;
  department?: string;
  avatar?: string;             // URL or base64
  isActive?: boolean;
}

Query Users

typescript
{
  skip?: number;
  take?: number;
  search?: string;             // Search email, name
  role?: UserRole;
  department?: string;
  isActive?: boolean;
  sortBy?: "firstName" | "email" | "role" | "lastLogin" | "createdAt";
  sortOrder?: "asc" | "desc";
}

Reset Password

typescript
{
  userId: string;              // Required
  newPassword?: string;        // If not provided, generates random
  sendEmail?: boolean;         // Send password reset email
}

Expected Responses

Get All Users

json
{
  "users": [
    {
      "id": "user-001",
      "email": "admin@itms.solutions",
      "firstName": "System",
      "lastName": "Administrator",
      "role": "ADMIN",
      "department": "IT",
      "isActive": true,
      "lastLogin": "2024-11-15T14:30:00.000Z",
      "createdAt": "2024-01-01T00:00:00.000Z"
    },
    {
      "id": "user-002",
      "email": "operator@itms.solutions",
      "firstName": "John",
      "lastName": "Operator",
      "role": "OPERATOR",
      "department": "Operations",
      "isActive": true,
      "lastLogin": "2024-11-15T12:00:00.000Z",
      "createdAt": "2024-03-15T00:00:00.000Z"
    }
  ],
  "total": 25,
  "pageCount": 3
}

Get User Activity

json
{
  "userId": "user-001",
  "activities": [
    {
      "action": "LOGIN",
      "timestamp": "2024-11-15T14:30:00.000Z",
      "ipAddress": "192.168.1.100",
      "userAgent": "Mozilla/5.0..."
    },
    {
      "action": "SENSOR_CREATE",
      "timestamp": "2024-11-15T14:35:00.000Z",
      "details": { "sensorId": "sensor-005" }
    },
    {
      "action": "REPORT_GENERATE",
      "timestamp": "2024-11-15T15:00:00.000Z",
      "details": { "reportType": "WEEKLY" }
    }
  ],
  "totalActivities": 150
}

Security Considerations

Password Requirements

  • Minimum 8 characters
  • At least one uppercase letter
  • At least one lowercase letter
  • At least one number
  • At least one special character

Password Storage

  • Hashed using bcrypt
  • Salt rounds: 10
  • Never stored in plain text

Session Management

  • JWT tokens expire after 24 hours
  • Refresh tokens for extended sessions
  • Token blacklist for logout

Audit Log

All user actions are logged:

typescript
interface AuditLog {
  id: string;
  userId: string;
  action: string;
  resource: string;
  resourceId?: string;
  details?: Record<string, any>;
  ipAddress: string;
  userAgent: string;
  timestamp: Date;
}

D1 Schema

sql
-- Users table already exists from auth migration

-- Activity log
CREATE TABLE user_activity (
  id TEXT PRIMARY KEY,
  userId TEXT NOT NULL,
  action TEXT NOT NULL,
  resource TEXT,
  resourceId TEXT,
  details TEXT,
  ipAddress TEXT,
  userAgent TEXT,
  createdAt TEXT NOT NULL,
  FOREIGN KEY (userId) REFERENCES User(id)
);

CREATE INDEX idx_activity_user ON user_activity(userId);
CREATE INDEX idx_activity_created ON user_activity(createdAt);
CREATE INDEX idx_activity_action ON user_activity(action);

SCS Smart City - Traffic, Gateway, Camera, and NVR Platform