# SecureCam database schema ```mermaid erDiagram USERS { uuid id PK varchar email UK varchar name varchar password_hash boolean email_verified text image timestamp created_at timestamp updated_at } DEVICES { uuid id PK uuid user_id FK varchar name varchar role varchar platform varchar app_version text push_token varchar status boolean is_camera timestamp last_seen_at timestamp updated_at timestamp created_at } DEVICE_LINKS { uuid id PK uuid owner_user_id FK uuid camera_device_id FK uuid client_device_id FK varchar status timestamp created_at timestamp updated_at } COMMANDS { uuid id PK uuid owner_user_id FK uuid source_device_id FK uuid target_device_id FK varchar command_type jsonb payload varchar status integer retry_count timestamp last_dispatched_at timestamp acknowledged_at text error timestamp created_at timestamp updated_at } STREAM_SESSIONS { uuid id PK uuid owner_user_id FK uuid camera_device_id FK uuid requester_device_id FK varchar status varchar reason varchar media_provider varchar media_session_id text publish_endpoint text subscribe_endpoint varchar stream_key timestamp started_at timestamp ended_at jsonb metadata timestamp created_at timestamp updated_at } RECORDINGS { uuid id PK uuid owner_user_id FK uuid stream_session_id FK uuid camera_device_id FK uuid requester_device_id FK uuid event_id FK varchar object_key varchar bucket integer duration_seconds integer size_bytes varchar status timestamp available_at text error timestamp created_at timestamp updated_at } EVENTS { uuid id PK uuid user_id FK uuid device_id FK varchar title varchar triggered_by varchar status timestamp started_at timestamp ended_at timestamp notified_at varchar video_url UK timestamp created_at timestamp updated_at } NOTIFICATIONS { uuid id PK uuid event_id FK uuid user_id FK timestamp sent_at varchar channel varchar status boolean is_read } NOTIFICATION_DELIVERIES { uuid id PK uuid owner_user_id FK uuid recipient_device_id FK varchar type jsonb payload varchar status integer attempts text last_error timestamp sent_at timestamp next_attempt_at timestamp created_at timestamp updated_at } AUDIT_LOGS { uuid id PK uuid owner_user_id FK uuid actor_device_id FK varchar action varchar target_type varchar target_id jsonb metadata text ip_address timestamp created_at } ACCOUNT { uuid id PK uuid user_id FK text account_id text provider_id text access_token text refresh_token timestamp access_token_expires_at timestamp refresh_token_expires_at text id_token text scope text password timestamp created_at timestamp updated_at } SESSION { uuid id PK text token UK uuid user_id FK timestamp expires_at text ip_address text user_agent timestamp created_at timestamp updated_at } VERIFICATION { uuid id PK text identifier text value timestamp expires_at timestamp created_at timestamp updated_at } USERS ||--o{ DEVICES : owns USERS ||--o{ DEVICE_LINKS : owns USERS ||--o{ COMMANDS : owns USERS ||--o{ STREAM_SESSIONS : owns USERS ||--o{ RECORDINGS : owns USERS ||--o{ EVENTS : creates USERS ||--o{ NOTIFICATIONS : receives USERS ||--o{ NOTIFICATION_DELIVERIES : owns USERS ||--o{ AUDIT_LOGS : owns USERS ||--o{ ACCOUNT : auth_account USERS ||--o{ SESSION : auth_session DEVICES ||--o{ DEVICE_LINKS : camera_device DEVICES ||--o{ DEVICE_LINKS : client_device DEVICES ||--o{ COMMANDS : source_device DEVICES ||--o{ COMMANDS : target_device DEVICES ||--o{ STREAM_SESSIONS : camera_device DEVICES ||--o{ STREAM_SESSIONS : requester_device DEVICES ||--o{ RECORDINGS : camera_device DEVICES ||--o{ RECORDINGS : requester_device DEVICES ||--o{ EVENTS : triggers DEVICES ||--o{ NOTIFICATION_DELIVERIES : recipient_device DEVICES ||--o{ AUDIT_LOGS : actor_device STREAM_SESSIONS ||--o{ RECORDINGS : produces EVENTS o|--o{ RECORDINGS : may_attach EVENTS ||--o{ NOTIFICATIONS : generates ``` ## Notes - This is generated from the current Drizzle schema in [schema.ts](/home/matiss/Documents/Final Year Project/Backend/db/schema.ts). - `VERIFICATION` is currently standalone in the schema and does not reference `USERS`. - `DEVICE_LINKS`, `COMMANDS`, `STREAM_SESSIONS`, and `RECORDINGS` each reference `DEVICES` more than once for different roles. - `ACCOUNT`, `SESSION`, and `VERIFICATION` are the Better Auth support tables. - `recordings` now absorbs the old upload metadata responsibility that previously lived in `videos`. - `notification_deliveries` represents push delivery jobs, while `notifications` remains the user-facing event notification history.