-- Initial database schema for clinic tests application -- Version: 1.0 -- Enable UUID extension CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- Departments table CREATE TABLE IF NOT EXISTS departments ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- User roles enum CREATE TYPE user_role AS ENUM ('hr', 'manager', 'employee'); -- Users table CREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), login VARCHAR(100) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, full_name VARCHAR(255) NOT NULL, role user_role NOT NULL DEFAULT 'employee', department_id UUID REFERENCES departments(id), is_active BOOLEAN DEFAULT true, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create index for login lookup CREATE INDEX IF NOT EXISTS idx_users_login ON users(login); CREATE INDEX IF NOT EXISTS idx_users_department ON users(department_id); -- Tests table CREATE TABLE IF NOT EXISTS tests ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), title VARCHAR(255) NOT NULL, description TEXT, passing_threshold INTEGER DEFAULT 70, time_limit INTEGER, allow_back BOOLEAN DEFAULT true, is_active BOOLEAN DEFAULT true, is_versioned BOOLEAN DEFAULT false, created_by UUID REFERENCES users(id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Test versions table CREATE TABLE IF NOT EXISTS test_versions ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), test_id UUID REFERENCES tests(id) ON DELETE CASCADE, version INTEGER NOT NULL DEFAULT 1, is_active BOOLEAN DEFAULT false, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(test_id, version) ); -- Questions table CREATE TABLE IF NOT EXISTS questions ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), test_version_id UUID REFERENCES test_versions(id) ON DELETE CASCADE, text TEXT NOT NULL, question_order INTEGER NOT NULL, has_multiple_answers BOOLEAN DEFAULT false ); -- Answer options table CREATE TABLE IF NOT EXISTS answer_options ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), question_id UUID REFERENCES questions(id) ON DELETE CASCADE, text TEXT NOT NULL, is_correct BOOLEAN DEFAULT false, option_order INTEGER NOT NULL ); -- Test assignments table CREATE TABLE IF NOT EXISTS test_assignments ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), test_version_id UUID REFERENCES test_versions(id) ON DELETE CASCADE, assigned_by UUID REFERENCES users(id), deadline DATE, max_attempts INTEGER DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Assignment targets table CREATE TYPE target_type AS ENUM ('department', 'user'); CREATE TABLE IF NOT EXISTS test_assignment_targets ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), assignment_id UUID REFERENCES test_assignments(id) ON DELETE CASCADE, target_type target_type NOT NULL, target_id UUID NOT NULL ); -- Test attempts table CREATE TYPE attempt_status AS ENUM ('in_progress', 'completed', 'expired'); CREATE TABLE IF NOT EXISTS test_attempts ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), test_version_id UUID REFERENCES test_versions(id) ON DELETE CASCADE, user_id UUID REFERENCES users(id), attempt_number INTEGER NOT NULL DEFAULT 1, status attempt_status DEFAULT 'in_progress', started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, completed_at TIMESTAMP, correct_count INTEGER DEFAULT 0, total_questions INTEGER DEFAULT 0, passed BOOLEAN DEFAULT false, UNIQUE(test_version_id, user_id, attempt_number) ); -- User answers table CREATE TABLE IF NOT EXISTS user_answers ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), attempt_id UUID REFERENCES test_attempts(id) ON DELETE CASCADE, question_id UUID REFERENCES questions(id) ON DELETE CASCADE, selected_options UUID[] DEFAULT '{}' ); -- Settings table CREATE TABLE IF NOT EXISTS settings ( key VARCHAR(100) PRIMARY KEY, value TEXT ); -- Insert default admin user (password: admin123) -- This will be done via application code to properly hash the password