Vai al contenuto

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: riepilogo none, daily o weekly.

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)
Email 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 da push-subscription/public-key.
  • Le chiavi VAPID si generano con php yii vapid/generate (in Docker lo fa l'entrypoint del worker).
  • PushNotification conserva il contenuto: il service worker lo recupera se il payload cifrato non arriva, e serve a non mandare due volte la stessa notifica (stesso tag, es. task-<id>-<tipo>).
  • In XAMPP il frontend imposta OPENSSL_CONF all'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 team task_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.