- Remove better-sqlite3, add pg driver - Convert schema to PostgreSQL types (serial, timestamp, boolean, jsonb) - Generate fresh PostgreSQL migrations - Update database connection layer with pg.Pool - Fix all API routes: remove JSON.parse/stringify, use native timestamps and booleans - Update drizzle.config.ts and .env.example for PostgreSQL
81 lines
3.4 KiB
Markdown
81 lines
3.4 KiB
Markdown
## MODIFIED Requirements
|
|
|
|
### Requirement: Docker Compose configuration
|
|
The project SHALL include docker-compose.yml for simplified deployment orchestration.
|
|
|
|
#### Scenario: Service definition
|
|
- **WHEN** docker-compose.yml is parsed
|
|
- **THEN** defines service named 'candle-annotator' using Dockerfile from current directory
|
|
|
|
#### Scenario: Port mapping
|
|
- **WHEN** docker-compose up runs
|
|
- **THEN** maps host port 3000 to container port 3000
|
|
|
|
#### Scenario: Volume mounting for ML data
|
|
- **WHEN** docker-compose up runs
|
|
- **THEN** mounts named volume 'ml-data' to /app/ml-data in the candle-annotator container
|
|
|
|
#### Scenario: Frontend depends on PostgreSQL
|
|
- **WHEN** docker-compose up runs
|
|
- **THEN** the candle-annotator service starts only after the postgres service is healthy (`depends_on: postgres: condition: service_healthy`)
|
|
|
|
#### Scenario: Frontend DATABASE_URL
|
|
- **WHEN** the candle-annotator service starts
|
|
- **THEN** the `DATABASE_URL` environment variable is set to `postgresql://ml_user:ml_password@postgres:5432/candle_annotator`
|
|
|
|
#### Scenario: Restart policy
|
|
- **WHEN** container crashes or stops
|
|
- **THEN** docker-compose automatically restarts container unless explicitly stopped (restart: unless-stopped)
|
|
|
|
#### Scenario: No SQLite volume
|
|
- **WHEN** docker-compose.yml is parsed
|
|
- **THEN** there is no `candle-data` volume defined or mounted
|
|
|
|
### Requirement: Environment variable configuration
|
|
The project SHALL use environment variables for runtime configuration.
|
|
|
|
#### Scenario: .env.example file
|
|
- **WHEN** repository is cloned
|
|
- **THEN** includes .env.example file documenting all configurable environment variables with example values
|
|
|
|
#### Scenario: DATABASE_URL configuration
|
|
- **WHEN** `DATABASE_URL` environment variable is set
|
|
- **THEN** the Next.js application connects to the PostgreSQL database at the specified URL
|
|
|
|
#### Scenario: No DATABASE_PATH variable
|
|
- **WHEN** environment variables are inspected
|
|
- **THEN** there is no `DATABASE_PATH` variable (SQLite path is removed)
|
|
|
|
#### Scenario: PORT configuration
|
|
- **WHEN** PORT environment variable is set
|
|
- **THEN** Next.js server listens on specified port (default: 3000)
|
|
|
|
#### Scenario: NODE_ENV configuration
|
|
- **WHEN** NODE_ENV environment variable is set to 'production'
|
|
- **THEN** Next.js runs in production mode with optimizations enabled
|
|
|
|
### Requirement: Database persistence
|
|
The deployment SHALL ensure PostgreSQL data persists across container restarts.
|
|
|
|
#### Scenario: PostgreSQL volume
|
|
- **WHEN** docker-compose up runs
|
|
- **THEN** the `postgres-data` named volume is mounted to `/var/lib/postgresql/data` in the postgres container
|
|
|
|
#### Scenario: Container restart preserves data
|
|
- **WHEN** the postgres container is stopped and restarted
|
|
- **THEN** all database tables and data remain intact
|
|
|
|
#### Scenario: PostgreSQL database name
|
|
- **WHEN** the postgres service starts
|
|
- **THEN** the `POSTGRES_DB` environment variable is set to `candle_annotator`
|
|
|
|
### Requirement: Health check endpoint
|
|
The API SHALL provide a health check endpoint for container orchestration.
|
|
|
|
#### Scenario: Health check endpoint responds
|
|
- **WHEN** GET request sent to `/api/health`
|
|
- **THEN** system returns 200 status with JSON `{ status: 'ok', timestamp: <unix_timestamp> }`
|
|
|
|
#### Scenario: Database connection check
|
|
- **WHEN** GET request sent to `/api/health?check=db`
|
|
- **THEN** system attempts a PostgreSQL query and returns 200 if successful, 503 if database unavailable
|