-- Migration 008: Formulaire settings + contact visibility -- Adds site_settings key-value table for admin-configurable options -- Adds show_contact column to authors table -- Adds author_email + author_show_contact to views -- ── 1. site_settings ───────────────────────────────────────────────────────── CREATE TABLE IF NOT EXISTS site_settings ( key TEXT PRIMARY KEY, value TEXT NOT NULL DEFAULT '', updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- Default formulaire settings: -- access_type_interdit_enabled = 1 (Interdit is available in the add form) -- access_type_interne_enabled = 1 (Interne is available in the add form) -- access_type_libre_enabled = 0 (Libre is NOT yet available — next academic year) INSERT OR IGNORE INTO site_settings (key, value) VALUES ('access_type_interdit_enabled', '1'), ('access_type_interne_enabled', '1'), ('access_type_libre_enabled', '0'); -- ── 2. show_contact on authors ──────────────────────────────────────────────── -- NOTE: SQLite has no IF NOT EXISTS for ALTER TABLE. -- The migrate.sh script guards against re-running; ignore errors on existing DBs. ALTER TABLE authors ADD COLUMN show_contact INTEGER NOT NULL DEFAULT 0; -- ── 3. Rebuild views to expose author_email and author_show_contact ─────────── DROP VIEW IF EXISTS v_theses_public; DROP VIEW IF EXISTS v_theses_full; CREATE VIEW IF NOT EXISTS v_theses_full AS SELECT t.id, t.identifier, t.title, t.subtitle, t.year, t.is_doctoral, o.name as orientation, ap.name as ap_program, ft.name as finality_type, t.synopsis, t.context_note, t.duration_minutes, t.duration_pages, t.file_size_info, at.name as access_type, lt.name as license_type, t.license_id, t.jury_points, t.submitted_at, t.defense_date, t.published_at, t.is_published, t.baiu_link, t.banner_path, t.access_type_id, GROUP_CONCAT(DISTINCT a.name) as authors, GROUP_CONCAT(DISTINCT s.name) as supervisors, GROUP_CONCAT(DISTINCT CASE WHEN ts.role = 'president' THEN s.name END) as jury_president, GROUP_CONCAT(DISTINCT CASE WHEN ts.role = 'promoteur' THEN s.name END) as jury_promoteurs, GROUP_CONCAT(DISTINCT CASE WHEN ts.role = 'lecteur' THEN s.name END) as jury_lecteurs, GROUP_CONCAT(DISTINCT l.name) as languages, GROUP_CONCAT(DISTINCT fmt.name) as formats, GROUP_CONCAT(DISTINCT tg.name) as keywords, -- First author's email and contact-visibility flag (SELECT a2.email FROM authors a2 JOIN thesis_authors ta2 ON a2.id = ta2.author_id WHERE ta2.thesis_id = t.id ORDER BY ta2.author_order LIMIT 1) as author_email, (SELECT a2.show_contact FROM authors a2 JOIN thesis_authors ta2 ON a2.id = ta2.author_id WHERE ta2.thesis_id = t.id ORDER BY ta2.author_order LIMIT 1) as author_show_contact FROM theses t LEFT JOIN orientations o ON t.orientation_id = o.id LEFT JOIN ap_programs ap ON t.ap_program_id = ap.id LEFT JOIN finality_types ft ON t.finality_id = ft.id LEFT JOIN access_types at ON t.access_type_id = at.id LEFT JOIN license_types lt ON t.license_id = lt.id LEFT JOIN thesis_authors ta ON t.id = ta.thesis_id LEFT JOIN authors a ON ta.author_id = a.id LEFT JOIN thesis_supervisors ts ON t.id = ts.thesis_id LEFT JOIN supervisors s ON ts.supervisor_id = s.id LEFT JOIN thesis_languages tl ON t.id = tl.thesis_id LEFT JOIN languages l ON tl.language_id = l.id LEFT JOIN thesis_formats tf ON t.id = tf.thesis_id LEFT JOIN format_types fmt ON tf.format_id = fmt.id LEFT JOIN thesis_tags tt ON t.id = tt.thesis_id LEFT JOIN tags tg ON tt.tag_id = tg.id GROUP BY t.id; CREATE VIEW IF NOT EXISTS v_theses_public AS SELECT * FROM v_theses_full WHERE is_published = 1;