CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- Users table CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_login TIMESTAMP ); -- Hunts table CREATE TABLE hunts ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), name VARCHAR(100) NOT NULL, description TEXT, created_by UUID REFERENCES users(id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('active', 'completed', 'archived')) ); -- Files table CREATE TABLE files ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), hunt_id UUID REFERENCES hunts(id) ON DELETE CASCADE, filename VARCHAR(255) NOT NULL, original_filename VARCHAR(255) NOT NULL, file_size BIGINT, file_type VARCHAR(50), uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, analysis_status VARCHAR(20) DEFAULT 'pending' CHECK (analysis_status IN ('pending', 'processing', 'completed', 'failed')) ); -- Analysis results table CREATE TABLE analysis_results ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), file_id UUID REFERENCES files(id) ON DELETE CASCADE, analysis_type VARCHAR(50) NOT NULL, results JSONB, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create indexes CREATE INDEX idx_hunts_created_by ON hunts(created_by); CREATE INDEX idx_files_hunt_id ON files(hunt_id); CREATE INDEX idx_analysis_file_id ON analysis_results(file_id); -- Insert default admin user (password: admin123) INSERT INTO users (username, email, password_hash) VALUES ('admin', 'admin@threathunter.local', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewKyIqhFrMpGLgGi');