-- Migration: Add authentication tables -- Date: 2026-02-19 -- Description: Adds users, sessions, and login_attempts tables for authentication -- Create users table CREATE TABLE IF NOT EXISTS users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, role ENUM('admin', 'guest') DEFAULT 'guest', is_active BOOLEAN DEFAULT 1, last_login TIMESTAMP NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_username (username), INDEX idx_email (email), INDEX idx_role (role) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Create sessions table CREATE TABLE IF NOT EXISTS sessions ( id VARCHAR(128) PRIMARY KEY, user_id INT NOT NULL, ip_address VARCHAR(45), user_agent VARCHAR(255), last_activity TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_user_id (user_id), INDEX idx_last_activity (last_activity) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Create login_attempts table CREATE TABLE IF NOT EXISTS login_attempts ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), ip_address VARCHAR(45), success BOOLEAN DEFAULT 0, attempted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_username (username), INDEX idx_ip_address (ip_address), INDEX idx_attempted_at (attempted_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Insert default admin user (password: Admin@2026!) -- Password hash generated with: password_hash('Admin@2026!', PASSWORD_BCRYPT) INSERT INTO users (username, email, password_hash, role, is_active) VALUES ('admin', 'admin@telvero.nl', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin', 1); -- Insert default guest user (password: Guest@2026!) -- Password hash generated with: password_hash('Guest@2026!', PASSWORD_BCRYPT) INSERT INTO users (username, email, password_hash, role, is_active) VALUES ('guest', 'guest@telvero.nl', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'guest', 1);