-- 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);