All checks were successful
dev - build & deploy naar test / build-and-deploy (push) Successful in 13s
52 lines
2.4 KiB
SQL
52 lines
2.4 KiB
SQL
-- v0.2.00: scholen, klassen, rollen en sessies.
|
|
-- Rollen: super (overkoepelend beheerder), admin (schoolbeheerder),
|
|
-- teacher (groepsleiding), pupil (leerling).
|
|
|
|
CREATE TABLE IF NOT EXISTS schools (
|
|
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS classes (
|
|
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
school_id BIGINT NOT NULL REFERENCES schools(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
ALTER TABLE users
|
|
ADD COLUMN IF NOT EXISTS school_id BIGINT REFERENCES schools(id) ON DELETE CASCADE,
|
|
ADD COLUMN IF NOT EXISTS display_name TEXT,
|
|
ADD COLUMN IF NOT EXISTS password_hash TEXT,
|
|
-- alleen voor leerlingen: wachtwoord dat groepsleiding/beheer mag inzien
|
|
ADD COLUMN IF NOT EXISTS password_plain TEXT,
|
|
-- eenmalige koppelcode waarmee nieuwe gebruikers hun account activeren
|
|
ADD COLUMN IF NOT EXISTS link_code TEXT UNIQUE,
|
|
ADD COLUMN IF NOT EXISTS class_id BIGINT REFERENCES classes(id) ON DELETE SET NULL,
|
|
-- alle app-gegevens van de gebruiker (borden, thema's, eigen woorden)
|
|
ADD COLUMN IF NOT EXISTS data JSONB NOT NULL DEFAULT '{}'::jsonb;
|
|
|
|
-- gebruikersnaam uniek binnen een school; supers (school_id IS NULL) landelijk uniek
|
|
ALTER TABLE users DROP CONSTRAINT IF EXISTS users_username_key;
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_school_username
|
|
ON users (school_id, lower(username)) WHERE school_id IS NOT NULL;
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_super_username
|
|
ON users (lower(username)) WHERE school_id IS NULL;
|
|
|
|
-- welke groepsleiding hoort bij welke klas
|
|
CREATE TABLE IF NOT EXISTS class_teachers (
|
|
class_id BIGINT NOT NULL REFERENCES classes(id) ON DELETE CASCADE,
|
|
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (class_id, user_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
token TEXT PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
expires_at TIMESTAMPTZ NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_users_school ON users(school_id);
|
|
CREATE INDEX IF NOT EXISTS idx_users_class ON users(class_id);
|