| """ |
| Database schema initialization for LockIn AI. |
| |
| Creates all necessary tables for profiles, cache, and progress tracking. |
| """ |
|
|
| from app.database.connection import db |
|
|
|
|
| def initialize_database() -> None: |
| """Create all database tables if they don't exist.""" |
| |
| with db.get_connection() as conn: |
| |
| conn.execute(""" |
| CREATE TABLE IF NOT EXISTS profiles ( |
| user_id TEXT PRIMARY KEY, |
| age INTEGER NOT NULL, |
| sex TEXT NOT NULL CHECK(sex IN ('male', 'female')), |
| height_cm REAL NOT NULL, |
| weight_kg REAL NOT NULL, |
| goal TEXT NOT NULL CHECK(goal IN ('lose_fat', 'maintain', 'gain_muscle')), |
| activity_level TEXT NOT NULL CHECK( |
| activity_level IN ('sedentary', 'light', 'moderate', 'active', 'very_active') |
| ), |
| gym_sessions_per_week INTEGER DEFAULT 0, |
| running_sessions_per_week INTEGER DEFAULT 0, |
| allergies TEXT, |
| dietary_restrictions TEXT, |
| disliked_foods TEXT, |
| country TEXT, |
| budget_per_day REAL, |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
| updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
| ) |
| """) |
| |
| |
| conn.execute(""" |
| CREATE TABLE IF NOT EXISTS api_cache ( |
| cache_key TEXT PRIMARY KEY, |
| source TEXT NOT NULL, |
| query TEXT NOT NULL, |
| response_json TEXT NOT NULL, |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
| expires_at TIMESTAMP NOT NULL |
| ) |
| """) |
| |
| conn.execute(""" |
| CREATE INDEX IF NOT EXISTS idx_api_cache_source |
| ON api_cache(source) |
| """) |
| |
| conn.execute(""" |
| CREATE INDEX IF NOT EXISTS idx_api_cache_expires |
| ON api_cache(expires_at) |
| """) |
| |
| |
| conn.execute(""" |
| CREATE TABLE IF NOT EXISTS daily_progress ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id TEXT NOT NULL, |
| date DATE NOT NULL, |
| consumed_calories REAL DEFAULT 0, |
| consumed_protein_g REAL DEFAULT 0, |
| consumed_carbs_g REAL DEFAULT 0, |
| consumed_fat_g REAL DEFAULT 0, |
| target_calories REAL NOT NULL, |
| target_protein_g REAL NOT NULL, |
| target_carbs_g REAL NOT NULL, |
| target_fat_g REAL NOT NULL, |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
| updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
| FOREIGN KEY (user_id) REFERENCES profiles(user_id), |
| UNIQUE(user_id, date) |
| ) |
| """) |
| |
| conn.execute(""" |
| CREATE INDEX IF NOT EXISTS idx_daily_progress_user_date |
| ON daily_progress(user_id, date) |
| """) |
| |
| |
| conn.execute(""" |
| CREATE TABLE IF NOT EXISTS meal_logs ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| user_id TEXT NOT NULL, |
| date DATE NOT NULL, |
| meal_type TEXT NOT NULL CHECK( |
| meal_type IN ('breakfast', 'lunch', 'dinner', 'snack') |
| ), |
| food_name TEXT NOT NULL, |
| quantity_g REAL NOT NULL, |
| calories REAL NOT NULL, |
| protein_g REAL NOT NULL, |
| carbs_g REAL NOT NULL, |
| fat_g REAL NOT NULL, |
| logged_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
| FOREIGN KEY (user_id) REFERENCES profiles(user_id) |
| ) |
| """) |
| |
| conn.execute(""" |
| CREATE INDEX IF NOT EXISTS idx_meal_logs_user_date |
| ON meal_logs(user_id, date) |
| """) |
| |
| conn.commit() |
|
|
|
|
| def drop_all_tables() -> None: |
| """Drop all tables. Use with caution - for testing only.""" |
| |
| with db.get_connection() as conn: |
| conn.execute("DROP TABLE IF EXISTS meal_logs") |
| conn.execute("DROP TABLE IF EXISTS daily_progress") |
| conn.execute("DROP TABLE IF EXISTS api_cache") |
| conn.execute("DROP TABLE IF EXISTS profiles") |
| conn.commit() |
|
|
|
|
| if __name__ == "__main__": |
| |
| initialize_database() |
| print("Database initialized successfully") |
|
|