HEX
Server: LiteSpeed
System: Linux houston.panomity.com 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64
User: nudepix (1011)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //opt/kw-schueler.bak.21032025/add_sharing_and_visibility.sql
-- SQL-Skript zum Hinzufügen von Tabellen für das Teilen von Materialien und Sichtbarkeitskontrolle
-- Erstellt am: 2024-07-05

USE klausurenweb_db;

-- Tabelle für geteilte Materialien
CREATE TABLE IF NOT EXISTS shared_materials (
    id INT AUTO_INCREMENT PRIMARY KEY,
    material_id INT NOT NULL,
    owner_teacher_id INT NOT NULL,
    shared_with_teacher_id INT NOT NULL,
    shared_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (material_id) REFERENCES materials(id) ON DELETE CASCADE,
    FOREIGN KEY (owner_teacher_id) REFERENCES teachers(id) ON DELETE CASCADE,
    FOREIGN KEY (shared_with_teacher_id) REFERENCES teachers(id) ON DELETE CASCADE,
    UNIQUE KEY (material_id, shared_with_teacher_id)
);

-- Prüfe, ob die Tabelle material_visibility existiert
CREATE TABLE IF NOT EXISTS material_visibility (
    id INT AUTO_INCREMENT PRIMARY KEY,
    material_id INT NOT NULL,
    is_visible_to_students BOOLEAN DEFAULT FALSE,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (material_id) REFERENCES materials(id) ON DELETE CASCADE,
    UNIQUE KEY (material_id)
);

-- Füge die neue Spalte updated_by_teacher_id zunächst als NULL-erlaubend hinzu
SET @dbname = DATABASE();
SET @tablename = "material_visibility";
SET @columnname = "updated_by_teacher_id";
SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (TABLE_SCHEMA = @dbname)
      AND (TABLE_NAME = @tablename)
      AND (COLUMN_NAME = @columnname)
  ) > 0,
  "SELECT 1",
  CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " INT NULL")
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;

-- Aktualisiere bestehende Einträge, setze den teacher_id des Materials als updated_by_teacher_id
UPDATE material_visibility mv
JOIN materials m ON mv.material_id = m.id
SET mv.updated_by_teacher_id = m.teacher_id
WHERE mv.updated_by_teacher_id IS NULL;

-- Füge den Foreign Key Constraint hinzu
ALTER TABLE material_visibility
ADD FOREIGN KEY (updated_by_teacher_id) REFERENCES teachers(id) ON DELETE CASCADE;

-- Setze die Spalte auf NOT NULL, nachdem alle Werte aktualisiert wurden
ALTER TABLE material_visibility
MODIFY updated_by_teacher_id INT NOT NULL;

-- Standardmäßig alle vorhandenen Materialien als nicht sichtbar für Schüler markieren
INSERT IGNORE INTO material_visibility (material_id, is_visible_to_students, updated_by_teacher_id)
SELECT m.id, FALSE, m.teacher_id 
FROM materials m
WHERE NOT EXISTS (
    SELECT 1 FROM material_visibility mv WHERE mv.material_id = m.id
);

-- Trigger, der sicherstellt, dass jedem neuen Material ein Eintrag in der Sichtbarkeitstabelle zugewiesen wird
DELIMITER //
DROP TRIGGER IF EXISTS after_material_insert//
CREATE TRIGGER after_material_insert
AFTER INSERT ON materials
FOR EACH ROW
BEGIN
    INSERT INTO material_visibility (material_id, is_visible_to_students, updated_by_teacher_id)
    VALUES (NEW.id, FALSE, NEW.teacher_id);
END//
DELIMITER ;

-- Hinweis: Diese Änderungen ermöglichen, dass Lehrkräfte:
-- 1. Materialien mit Kollegen teilen können (shared_materials Tabelle)
-- 2. Die Sichtbarkeit für Schüler kontrollieren können (material_visibility Tabelle)