Notifiche¶
GesTask notifica sei canali: in-app, Web Push, email, ntfy, Slack e Telegram. Ogni utente sceglie dal profilo quali canali attivare e quali eventi silenziare per ciascuno.
Tipi di evento¶
Le costanti TYPE_* di UserNotificationPreference definiscono gli eventi:
- task:
task_created,task_assigned,task_status_changed,task_comment,comment_mention,task_due_reminder; - riunioni:
meeting_*(creazione, promemoria, riepilogo); - amministrazione:
admin_*(vedi sotto); system.
Preferenze¶
UserNotificationPreference (una riga per utente, findOrCreateForUser())
contiene:
- l'attivazione dei canali:
push_enabled,email_enabled,ntfy_enabled,slack_enabled,telegram_enabled; - le destinazioni:
ntfy_topic,slack_webhook_url(verificato contro SSRF),telegram_chat_id; muted_events: per ogni canale, i tipi silenziati;due_reminder_days: quanti giorni prima avvisare delle scadenze;digest_frequency: riepilogonone,dailyoweekly.
Di base la push riceve tutto; gli altri canali partono con tutto silenziato,
tranne le email delle riunioni. allows(canale, tipo) guarda solo i
silenziamenti: ogni canale controlla da sé se è attivo.
Invio: NotificationDispatcher¶
NotificationDispatcher::notify(userIds, tipo, payload) è l'ingresso unico:
| Canale | Come parte | Servizio |
|---|---|---|
| In-app | subito, nella richiesta, per tutti i destinatari senza guardare le preferenze | InAppNotification |
| Web Push | job SendExternalNotificationJob |
PushNotificationService (VAPID) |
job SendNotificationJob |
EmailNotificationService |
|
| ntfy, Slack, Telegram | un job SendExternalNotificationJob per canale |
NtfyNotificationService, SlackNotificationService, TelegramNotificationService |
I job passano da JobDispatcher (vedi Architettura):
in Docker li esegue il worker, in XAMPP girano subito.
Web Push¶
- Le iscrizioni del browser sono in
PushSubscription; la chiave pubblica si legge dapush-subscription/public-key. - Le chiavi VAPID si generano con
php yii vapid/generate(in Docker lo fa l'entrypoint del worker). PushNotificationconserva il contenuto: il service worker lo recupera se il payload cifrato non arriva, e serve a non mandare due volte la stessa notifica (stessotag, es.task-<id>-<tipo>).- In XAMPP il frontend imposta
OPENSSL_CONFall'avvio (frontend/web/index.php): senza, la cifratura dei payload fallisce.
Chi riceve cosa¶
TaskNotifier, chiamato da TaskWorkflow:
- creazione: gli assegnatari ricevono
task_assigned, il resto del teamtask_created; - nuovi assegnatari:
task_assigned; - spostamento e cambio di stato: chi segue la task (assegnatari, iscritti, autore);
- cambio di date:
task_due_reminder.
I commenti li notifica TaskCommentPublisher (vedi Task),
le riunioni MeetingNotifier.
Attività pianificate¶
| Comando | Frequenza | Cosa fa |
|---|---|---|
task/send-notifications |
5 minuti | promemoria delle task arrivati all'ora fissata |
task/process-due-tasks |
5 minuti | task in scadenza entro un'ora o scadute negli ultimi 7 giorni |
task/send-due-reminders |
ogni ora | avvisi di scadenza secondo due_reminder_days |
meeting/send-reminders |
5 minuti | riunioni che iniziano entro un'ora |
digest/send daily\|weekly |
ogni giorno, il lunedì | riepiloghi (DigestService), idempotenti |
task/cleanup-notifications |
ogni giorno | elimina le notifiche in-app lette da oltre 30 giorni |
Per non avvisare due volte, i comandi annotano gli invii in task_alerts_sent
(TaskAlertLog) o riconoscono una PushNotification con lo stesso tag.
Notifiche agli amministratori¶
AdminNotificationService scrive ai super amministratori e agli amministratori
(escluso chi ha fatto l'azione, e solo per i team che possono vedere):
- sempre, perché riguardano la sicurezza: nuovo utente registrato, password reimpostata da un amministratore (anche all'utente), cambio di ruolo globale, account attivato o disattivato;
- secondo le preferenze: membri aggiunti, rimossi o con ruolo cambiato;
bacheche archiviate; bacheche, team e task nel cestino. Le task eliminate
nella stessa richiesta arrivano in un'unica email (
AdminAlertBootstrap).
AdminReportService invia due riepiloghi, solo se c'è qualcosa da dire:
admin-report/daily: webhook falliti, elementi del cestino in scadenza, errori nei log delle applicazioni;admin-report/weekly: nuovi utenti, task create e concluse, login falliti, consegne dei webhook fallite, utenti inattivi, azioni sensibili.