#!/usr/bin/env python3 """ Script de inicialização automática da base de dados Executado automaticamente ao iniciar a aplicação no Hugging Face Spaces """ import sqlite3 import bcrypt from pathlib import Path def init_database(): """Inicializa a base de dados se não existir""" BASE_DIR = Path(__file__).parent DB_PATH = BASE_DIR / "db" / "app.db" # Se a base de dados já existe, não fazer nada if DB_PATH.exists(): print("✅ Base de dados já existe") return # Criar diretório DB_PATH.parent.mkdir(parents=True, exist_ok=True) print("=" * 60) print("Inicialização da Base de Dados") print("=" * 60) # Conectar à BD conn = sqlite3.connect(DB_PATH) conn.execute("PRAGMA foreign_keys = ON") cur = conn.cursor() # Criar tabela users print("\n[1/4] Criando tabela 'users'...") cur.execute(""" CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """) print("✅ Tabela 'users' criada") # Criar tabela tasks print("\n[2/4] Criando tabela 'tasks'...") cur.execute(""" CREATE TABLE IF NOT EXISTS tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, task_code TEXT UNIQUE NOT NULL, task_name TEXT NOT NULL, task_date DATE NOT NULL, start_time TIMESTAMP NOT NULL, end_time TIMESTAMP NOT NULL, planned_hours REAL NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (username) REFERENCES users(username) ON DELETE CASCADE ) """) print("✅ Tabela 'tasks' criada") # Criar tabela subtasks print("\n[3/4] Criando tabela 'subtasks'...") cur.execute(""" CREATE TABLE IF NOT EXISTS subtasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, task_id INTEGER NOT NULL, subtask_code TEXT UNIQUE NOT NULL, subtask_name TEXT NOT NULL, start_time TIMESTAMP NOT NULL, end_time TIMESTAMP NOT NULL, planned_hours REAL NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE ) """) print("✅ Tabela 'subtasks' criada") # Criar tabela task_logs print("\n[4/4] Criando tabela 'task_logs'...") cur.execute(""" CREATE TABLE IF NOT EXISTS task_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, task_id INTEGER, activity TEXT NOT NULL, event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (username) REFERENCES users(username) ON DELETE CASCADE, FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE ) """) print("✅ Tabela 'task_logs' criada") # Criar utilizador de teste print("\n[5/5] Criando utilizador de teste...") username = "admin" password = "admin123" pw_hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode() try: cur.execute( "INSERT INTO users (username, password_hash) VALUES (?, ?)", (username, pw_hash) ) print(f"✅ Utilizador de teste criado:") print(f" Username: {username}") print(f" Password: {password}") except sqlite3.IntegrityError: print(f"⚠️ Utilizador '{username}' já existe") # Commit e fechar conn.commit() conn.close() print("\n" + "=" * 60) print("✅ BASE DE DADOS INICIALIZADA COM SUCESSO!") print("=" * 60) if __name__ == "__main__": init_database()