# Veza Integration Reference ## 1. Global Configuration ### Network & Environment | Config | Value / Default | Source of Truth | |--------|----------------|-----------------| | **Backend Port** | `:8080` (Default) | `cmd/api/main.go` | | **Frontend Port** | `:3000` or `:5173` | `vite.config.ts` | | **API Base URL** | `http://localhost:8080` | `apps/web/src/config/env.ts` (`VITE_API_URL`) | | **Auth Header** | `Authorization: Bearer ` | `apps/web/src/services/api/client.ts` | | **Time Format** | ISO 8601 Strings (`2023-12-25T15:04:05Z`) | JSON serialization of `time.Time` | ### System Limits | Parameter | Limit | implemented In | |-----------|-------|----------------| | **Max Track Size** | 100 MB | `internal/core/track/service.go` | | **Supported Audio** | MP3, FLAC, WAV, OGG, M4A, AAC | `internal/core/track/service.go` | | **Request Timeout** | 10s (Scan), 30s (Upload/Assembly) | `internal/core/track/handler.go` | | **Client Timeout** | 10,000ms | `apps/web/src/services/api/client.ts` | --- ## 2. API Surface Coverage This table compares available Backend routes with Frontend service implementations. ### đŸŸĸ Fully Implemented | âš ī¸ Partial / Discrepancy | ❌ Missing in Frontend #### Auth & Users | Method | URL | Frontend Function | Status | Notes | |--------|-----|-------------------|--------|-------| | `POST` | `/api/v1/auth/login` | `authApi.login` | đŸŸĸ | | | `POST` | `/api/v1/auth/register` | `authApi.register` | đŸŸĸ | | | `POST` | `/api/v1/auth/refresh` | `client.ts` (interceptor) | đŸŸĸ | Auto-refresh on 401 | | `POST` | `/api/v1/auth/logout` | `authApi.logout` | đŸŸĸ | | | `GET` | `/api/v1/auth/me` | `authApi.getMe` | đŸŸĸ | | | `GET` | `/api/v1/users/:id` | `userApi.getUser` | đŸŸĸ | | | `PUT` | `/api/v1/users/:id` | `userApi.updateUser` | đŸŸĸ | Requires Ownership or Admin | #### Tracks (Core) | Method | URL | Frontend Function | Status | Notes | |--------|-----|-------------------|--------|-------| | `GET` | `/api/v1/tracks` | `trackApi.getTracks` | đŸŸĸ | Supports pagination & filters | | `POST` | `/api/v1/tracks` | `trackApi.uploadTrack` | âš ī¸ | **CRITICAL GAP**: Backend ignores metadata fields (see Section 5) | | `GET` | `/api/v1/tracks/:id` | `trackApi.getTrack` | đŸŸĸ | | | `PUT` | `/api/v1/tracks/:id` | `trackApi.updateTrack` | đŸŸĸ | | | `DELETE` | `/api/v1/tracks/:id` | `trackApi.deleteTrack` | ❌ | Function missing in `trackApi.ts` currently | | `GET` | `/api/v1/tracks/:id/status` | `trackApi.pollTrackStatus` | đŸŸĸ | Used for async upload polling | #### Tracks (Features) | Method | URL | Frontend Function | Status | Notes | |--------|-----|-------------------|--------|-------| | `GET` | `/api/v1/tracks/:id/stats` | `trackApi.getTrackStats` | đŸŸĸ | | | `GET` | `/api/v1/tracks/:id/history` | `trackApi.getTrackHistory` | đŸŸĸ | | | `GET` | `/api/v1/tracks/:id/download` | `trackApi.downloadTrack` | đŸŸĸ | | | `POST` | `/api/v1/tracks/:id/like` | `trackApi.likeTrack` | đŸŸĸ | | | `DELETE` | `/api/v1/tracks/:id/like` | `trackApi.unlikeTrack` | đŸŸĸ | | | `GET` | `/api/v1/tracks/:id/likes` | `trackApi.getTrackLikes` | đŸŸĸ | | | `POST` | `/api/v1/tracks/:id/share` | `trackApi.createTrackShare` | đŸŸĸ | | #### Upload (Chunked) | Method | URL | Frontend Function | Status | Notes | |--------|-----|-------------------|--------|-------| | `POST` | `/api/v1/tracks/initiate` | *No direct function* | ❌ | Chunked upload logic seems internal to `trackApi.uploadTrack` or unimplemented | | `POST` | `/api/v1/tracks/chunk` | *No direct function* | ❌ | | | `POST` | `/api/v1/tracks/complete` | *No direct function* | ❌ | | --- ## 3. Data Models Discrepancies ### User Model | Field | Backend (`models.User`) | Frontend (`interfaces/User`) | Match? | |-------|-------------------------|------------------------------|--------| | `ID` | `uuid.UUID` | `string` | ✅ | | `Username` | `string` | `string` | ✅ | | `Birthdate` | `*time.Time` (Nullable) | `string` | âš ī¸ Frontend expects ISO string, Backend sends strict null or time | | `UsernameChangedAt` | `*time.Time` | `string` | âš ī¸ Same as above | | `TokenVersion` | `int` | *Missing* | âš ī¸ Internal field? | ### Track Model | Field | Backend (`models.Track`) | Frontend (`interfaces/Track`) | Match? | |-------|--------------------------|-------------------------------|--------| | `UserID` | `CreatorID` (JSON) | `creator_id` | ✅ JSON tag aligns | | `FileID` | `*uuid.UUID` (Nullable) | `string` | âš ī¸ Optional vs Nullable | | `Duration` | `int` (Seconds) | `number` | ✅ | | `CoverArtPath` | `cover_art_path` | `cover_art_path` | ✅ | | `StreamManifestURL`| `stream_manifest_url` | `stream_manifest_url` | ✅ | | `UpdatedAt` | `time.Time` | `string` | ✅ | --- ## 4. Error Handling Protocol ### Protocol Mismatch Alert 🚨 There is a **divergence** between how the Backend reports errors and how the Frontend expects them. **Backend Format (`middleware.ErrorHandler`):** ```json { "error": { "code": 1234, "message": "Error message", "details": ["Validation error 1"] } } ``` *Note: The root object DOES NOT contain `success: false`.* **Frontend Expectation (`utils/apiErrorHandler.ts`):** 1. Checks for `{ success: false, error: { ... } }` 2. OR Checks for `{ code: ..., message: ... }` (Root level) **Consequence**: The Frontend `parseApiError` function will likely fail to extract the structured `ApiError` from the Backend's response, falling back to a generic "An unexpected error occurred" or the raw HTTP status message, losing valuable context (like validation details or specific error codes). --- ## 5. Action Items (Prioritized) ### 🚨 P0 - Critical Integration Fixes * **Fix Error Parsing**: Update `apps/web/src/utils/apiErrorHandler.ts` to handle the `{ error: { code: ... } }` format (without `success` field) or update the Backend Middleware to wrap errors in `{ success: false, ... }`. * **Fix Track Upload Metadata**: The Frontend creates a `FormData` with `title`, `artist`, `genre`, etc., but the Backend `UploadTrack` handler **ignores** all fields except `file`. * *Remediation*: Update Backend `UploadTrack` to parse `c.PostForm` fields and pass them to `TrackService`. ### âš ī¸ P1 - Type Safety & Feature Gaps * **Implement Chunked Uploads**: The Frontend is missing the implementation for `/tracks/initiate`, `/tracks/chunk`, and `/tracks/complete`. Large file uploads will be unreliable. * **Date Normalization**: Ensure Frontend correctly handles `null` values for `birthdate` and `username_changed_at` instead of potentially expecting empty strings or undefined. ### â„šī¸ P2 - Completeness * **Implement Delete**: Add `deleteTrack` to `trackApi.ts`. * **Sync Async Flows**: Ensure the "Polling" logic in Frontend correctly interprets the Backend's `202 Accepted` response.