# 🕵️ DB Migrations Audit V1 **Date:** 04/12/2025 **Author:** Staff Engineer / DBA **Scope:** `veza-backend-api` Database Schema & Migrations ## 1. Executive Summary The current database schema is in a **transitional "Hybrid" state**, resulting from an incomplete migration from `INT/BIGINT` to `UUID`. While core entities (`users`, `tracks`, `playlists`) have been migrated to UUIDs, the surrounding infrastructure (secondary tables, audit logs, tokens, junction tables) remains largely on `BIGINT` sequences. This audit establishes the roadmap to move from this "Lab/Repair" state to a **Canonical V1 Schema** that is purely UUID-based, consistent, and production-ready. **Note on Source of Truth:** The file `docs/ORIGIN_DATABASE_SCHEMA.md` was referenced but not found. This audit treats `docs/UUID_DB_MIGRATION_PLAN.md` (Target Architecture) and the current `veza_uuid_lab_schema.sql` (Entity Inventory) as the combined Source of Truth. ## 2. Gap Analysis: Lab Schema vs. Target V1 ### 2.1 Core Conformance (Status: ✅ Mostly Good) The core entities align with the UUID target. * **Users:** `id` is UUID. * **Tracks:** `id` is UUID. * **Playlists:** `id` is UUID. * **RBAC (Roles/Permissions):** `id` is UUID. ### 2.2 Critical Deficiencies (Status: ❌ Needs Fix) The following tables currently use `BIGINT` (SERIAL) Primary Keys in the Lab Schema. In V1, these **MUST** be `UUID`. | Domain | Table | Current PK | Target V1 PK | | :--- | :--- | :--- | :--- | | **Auth** | `refresh_tokens` | `bigint` | `UUID` | | **Auth** | `password_reset_tokens` | `bigint` | `UUID` | | **Auth** | `email_verification_tokens` | `bigint` | `UUID` | | **Auth** | `user_sessions` | `bigint` | `UUID` | | **Streaming** | `bitrate_adaptation_logs` | `bigint` | `UUID` | | **Streaming** | `hls_streams` | `bigint` | `UUID` | | **Streaming** | `hls_transcode_queue` | `bigint` | `UUID` | | **Streaming** | `playback_analytics` | `bigint` | `UUID` | | **Streaming** | `track_comments` | `bigint` | `UUID` | | **Streaming** | `track_history` | `bigint` | `UUID` | | **Streaming** | `track_likes` | `bigint` | `UUID` | | **Streaming** | `track_plays` | `bigint` | `UUID` | | **Streaming** | `track_shares` | `bigint` | `UUID` | | **Streaming** | `track_versions` | `bigint` | `UUID` | | **Social** | `playlist_collaborators` | `bigint` | `UUID` | | **Social** | `playlist_follows` | `bigint` | `UUID` | | **Chat (Legacy)**| `rooms` | `bigint` | `UUID` | ### 2.3 Structural Issues 1. **Inconsistent Defaults:** Some tables use `now()`, others `CURRENT_TIMESTAMP`. V1 will standardize on `TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP`. 2. **Missing `deleted_at`:** Several tables lacking soft-delete where implied by domain (e.g., `playlist_collaborators` has it, but `playlist_tracks` does not). V1 will apply soft-deletes consistently for user-managed resources. 3. **Foreign Key Constraints:** Many FKs in the Lab schema lack explicit `ON DELETE` rules. V1 will enforce `ON DELETE CASCADE` for ownership relationships (e.g., User -> RefreshToken) and `ON DELETE SET NULL` or `RESTRICT` for references. ## 3. Schema Governance & Separation Per `UUID_DB_MIGRATION_PLAN.md`: * **`public` Schema:** Owned by `veza-backend-api`. Contains `users`, `auth`, `tracks`, `playlists` (and their satellite tables). * **`chat` Schema:** Owned by `veza-chat-server`. Contains `conversations`, `messages`. **V1 Scope Decision:** The `veza-backend-api` migrations will **strictly manage the `public` schema**. * Legacy `rooms` table (if still used by Go) will be migrated to UUID in `public`. * New `chat` schema tables will **NOT** be created by these migrations to respect the separation of concerns, unless a specific "Schema Init" migration is required for integration tests. ## 4. Recommendation Proceed with the **V1 "Clean Slate" Strategy**: 1. Archive all existing `001`...`072` migrations. 2. Create a fresh set of migrations (`001`...`999`) that define the tables correctly (UUID) from the start. 3. Do not implement "repair" scripts; implement the "final state".