From 7ccc9199e06013e7bf3dcf5c1d273e5df8e7801a Mon Sep 17 00:00:00 2001 From: dev Date: Thu, 10 Sep 2026 01:16:32 +0300 Subject: [PATCH] Add cover_path column to groups table for group cover photo feature --- db/init.sql | 43 ++++++++++++++++++++++++++++++++++++++++++- db/migration.sql | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/db/init.sql b/db/init.sql index 1d195e5..7a2f04f 100644 --- a/db/init.sql +++ b/db/init.sql @@ -1,7 +1,20 @@ +CREATE TABLE IF NOT EXISTS branches ( + id SERIAL PRIMARY KEY, + name VARCHAR(200) NOT NULL UNIQUE, + address TEXT, + phone VARCHAR(50), + created_at TIMESTAMPTZ DEFAULT now() +); + CREATE TABLE IF NOT EXISTS groups ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE, - created_at TIMESTAMPTZ DEFAULT now() + branch_id INT REFERENCES branches(id) ON DELETE SET NULL, + created_at TIMESTAMPTZ DEFAULT now(), + day_of_week INT, + time_start TIME, + time_end TIME, + cover_path VARCHAR(255) ); CREATE TABLE IF NOT EXISTS students ( @@ -72,8 +85,36 @@ CREATE TABLE IF NOT EXISTS project_files ( detached_at TIMESTAMPTZ ); +CREATE TABLE IF NOT EXISTS users ( + id SERIAL PRIMARY KEY, + username VARCHAR(100) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, + name VARCHAR(150), + role VARCHAR(20) NOT NULL DEFAULT 'tutor' CHECK (role IN ('admin','tutor')), + is_active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS user_branches ( + user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + branch_id INT NOT NULL REFERENCES branches(id) ON DELETE CASCADE, + PRIMARY KEY (user_id, branch_id) +); + +CREATE TABLE IF NOT EXISTS sessions ( + id SERIAL PRIMARY KEY, + user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + token VARCHAR(64) NOT NULL UNIQUE, + created_at TIMESTAMPTZ DEFAULT now(), + expires_at TIMESTAMPTZ NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_sessions_token ON sessions(token); +CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at); + CREATE TABLE IF NOT EXISTS audit_log ( id SERIAL PRIMARY KEY, + user_id INT REFERENCES users(id) ON DELETE SET NULL, action VARCHAR(100) NOT NULL, target JSONB, ip VARCHAR(45), diff --git a/db/migration.sql b/db/migration.sql index 826c82e..39dfa31 100644 --- a/db/migration.sql +++ b/db/migration.sql @@ -50,6 +50,49 @@ ALTER TABLE project_files ADD COLUMN IF NOT EXISTS detached_at TIMESTAMPTZ; ALTER TABLE entries ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ; +CREATE TABLE IF NOT EXISTS branches ( + id SERIAL PRIMARY KEY, + name VARCHAR(200) NOT NULL UNIQUE, + address TEXT, + phone VARCHAR(50), + created_at TIMESTAMPTZ DEFAULT now() +); + +ALTER TABLE groups ADD COLUMN IF NOT EXISTS branch_id INT REFERENCES branches(id) ON DELETE SET NULL; +ALTER TABLE groups ADD COLUMN IF NOT EXISTS day_of_week INT; +ALTER TABLE groups ADD COLUMN IF NOT EXISTS time_start TIME; +ALTER TABLE groups ADD COLUMN IF NOT EXISTS time_end TIME; +ALTER TABLE groups ADD COLUMN IF NOT EXISTS cover_path VARCHAR(255); + +CREATE TABLE IF NOT EXISTS users ( + id SERIAL PRIMARY KEY, + username VARCHAR(100) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, + name VARCHAR(150), + role VARCHAR(20) NOT NULL DEFAULT 'tutor' CHECK (role IN ('admin','tutor')), + is_active BOOLEAN DEFAULT true, + created_at TIMESTAMPTZ DEFAULT now() +); + +CREATE TABLE IF NOT EXISTS user_branches ( + user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + branch_id INT NOT NULL REFERENCES branches(id) ON DELETE CASCADE, + PRIMARY KEY (user_id, branch_id) +); + +CREATE TABLE IF NOT EXISTS sessions ( + id SERIAL PRIMARY KEY, + user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + token VARCHAR(64) NOT NULL UNIQUE, + created_at TIMESTAMPTZ DEFAULT now(), + expires_at TIMESTAMPTZ NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_sessions_token ON sessions(token); +CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at); + +ALTER TABLE audit_log ADD COLUMN IF NOT EXISTS user_id INT REFERENCES users(id) ON DELETE SET NULL; + CREATE TABLE IF NOT EXISTS group_photos ( id SERIAL PRIMARY KEY, group_id INT NOT NULL REFERENCES groups(id) ON DELETE CASCADE, @@ -59,4 +102,4 @@ CREATE TABLE IF NOT EXISTS group_photos ( created_at TIMESTAMPTZ DEFAULT now() ); -CREATE INDEX IF NOT EXISTS idx_group_photos_group_id ON group_photos(group_id); \ No newline at end of file +CREATE INDEX IF NOT EXISTS idx_group_photos_group_id ON group_photos(group_id);