Quelltext des aktuellen Standes
-- ============================================================
-- Persönliche Benachrichtigungen im Self-Service-Portal
-- ============================================================
-- Das Portal kannte bisher nur betreiberseitige Ankündigungen und
-- Störungshinweise – also das, was alle angeht. Was eine einzelne Person
-- angeht (ihr Antrag ist entschieden, auf ihr Ticket wurde geantwortet),
-- ging ausschließlich per E-Mail hinaus.
--
-- Eine eigene Tabelle, weil `user_notifications` an `users` hängt: Eine
-- Portal-Person ist eine Zeile in `directory_persons` und hat dort keinen
-- Eintrag.
CREATE TABLE IF NOT EXISTS `person_notifications` (
`id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`person_id` INT UNSIGNED NOT NULL,
`type` VARCHAR(50) NOT NULL DEFAULT 'info'
COMMENT 'Anlass, steuert Symbol und Farbe im Portal',
`title` VARCHAR(255) NOT NULL,
`message` TEXT NULL,
`link` VARCHAR(500) NULL COMMENT 'Ziel im Portal, immer ein eigener Pfad',
`object_type` VARCHAR(50) NULL,
`object_id` BIGINT UNSIGNED NULL,
`is_read` TINYINT(1) NOT NULL DEFAULT 0,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`read_at` DATETIME NULL,
INDEX `idx_person_notif` (`person_id`, `is_read`, `created_at`),
INDEX `idx_person_notif_zeit` (`created_at`),
CONSTRAINT `fk_person_notif_person` FOREIGN KEY (`person_id`)
REFERENCES `directory_persons` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Gelesene Nachrichten jenseits der Aufbewahrung räumt ein täglicher Lauf ab;
-- ungelesene bleiben stehen. Standardmäßig an: Ohne ihn wüchse die Tabelle
-- unbegrenzt, und der Lauf hat ohne Portal ohnehin nichts zu tun.
INSERT IGNORE INTO `cron_tasks`
(`name`, `label`, `description`, `handler_class`, `frequency_minutes`, `enabled`, `run_in_background`, `max_runtime_seconds`)
VALUES
('portal_notification_prune', 'Portal-Nachrichten aufräumen',
'Entfernt gelesene Nachrichten im Postfach des Self-Service-Portals nach Ablauf der Aufbewahrung. Ungelesene bleiben erhalten.',
'OpenNIT\\Cron\\Handlers\\PortalNotificationPruneHandler', 1440, 1, 0, 300);