101 lines
3.6 KiB
Python
101 lines
3.6 KiB
Python
"""Initialize database with all tables and seed data."""
|
|
import sqlite3
|
|
from datetime import datetime
|
|
from passlib.context import CryptContext
|
|
|
|
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
|
|
def get_password_hash(password: str) -> str:
|
|
return pwd_context.hash(password)
|
|
|
|
def init_db():
|
|
"""Create all tables and seed with initial users."""
|
|
conn = sqlite3.connect('/app/data/family_hub.db')
|
|
cursor = conn.cursor()
|
|
|
|
# Create users table with ALL fields
|
|
cursor.execute("""
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username VARCHAR(50) UNIQUE NOT NULL,
|
|
email VARCHAR(100) UNIQUE NOT NULL,
|
|
full_name VARCHAR(100) NOT NULL,
|
|
hashed_password VARCHAR(255) NOT NULL,
|
|
discord_id VARCHAR(100),
|
|
profile_picture VARCHAR(500),
|
|
is_active BOOLEAN DEFAULT 1,
|
|
is_admin BOOLEAN DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
""")
|
|
|
|
# Create chores table
|
|
cursor.execute("""
|
|
CREATE TABLE IF NOT EXISTS chores (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
title VARCHAR(200) NOT NULL,
|
|
description TEXT,
|
|
assigned_to INTEGER,
|
|
created_by INTEGER NOT NULL,
|
|
due_date DATE,
|
|
frequency VARCHAR(20) DEFAULT 'ON_TRIGGER',
|
|
status VARCHAR(20) DEFAULT 'pending',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (assigned_to) REFERENCES users(id),
|
|
FOREIGN KEY (created_by) REFERENCES users(id)
|
|
)
|
|
""")
|
|
|
|
# Check if users already exist
|
|
cursor.execute("SELECT COUNT(*) FROM users")
|
|
user_count = cursor.fetchone()[0]
|
|
|
|
if user_count == 0:
|
|
print("Seeding database with initial users...")
|
|
|
|
# Create family members with default password
|
|
default_password_hash = get_password_hash("password123")
|
|
|
|
users = [
|
|
("lou", "lou@family.local", "Lou", default_password_hash, False),
|
|
("jess", "jess@family.local", "Jess", default_password_hash, True),
|
|
("william", "william@family.local", "William", default_password_hash, False),
|
|
("xander", "xander@family.local", "Xander", default_password_hash, False),
|
|
("bella", "bella@family.local", "Bella", default_password_hash, False),
|
|
]
|
|
|
|
for username, email, full_name, password_hash, is_admin in users:
|
|
cursor.execute("""
|
|
INSERT INTO users (username, email, full_name, hashed_password, is_active, is_admin)
|
|
VALUES (?, ?, ?, ?, 1, ?)
|
|
""", (username, email, full_name, password_hash, 1 if is_admin else 0))
|
|
print(f" Created user: {username} (Admin: {is_admin})")
|
|
else:
|
|
print(f"Users table already contains {user_count} users, skipping seed.")
|
|
|
|
conn.commit()
|
|
|
|
# Verify tables
|
|
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
|
|
tables = cursor.fetchall()
|
|
print(f"\nDatabase tables created: {[t[0] for t in tables]}")
|
|
|
|
# Verify columns in users table
|
|
cursor.execute("PRAGMA table_info(users)")
|
|
columns = cursor.fetchall()
|
|
print("\nColumns in 'users' table:")
|
|
for col in columns:
|
|
print(f" - {col[1]} ({col[2]})")
|
|
|
|
cursor.execute("SELECT COUNT(*) FROM users")
|
|
user_count = cursor.fetchone()[0]
|
|
print(f"\nTotal users in database: {user_count}")
|
|
|
|
conn.close()
|
|
print("\nDatabase initialization complete!")
|
|
|
|
if __name__ == "__main__":
|
|
init_db()
|