Git-Repository für bestehenden archivdms-Code initialisiert, Branch-/Commit-Konvention (feature/<ticket>-<slug>-Branches, Ticket-Prefix in Commit-Nachricht) etabliert.
78 lines
3.2 KiB
Markdown
78 lines
3.2 KiB
Markdown
# PROJ-1: Wiedervorlage (Reminder pro Dokument)
|
|
|
|
## Zweck
|
|
|
|
Nutzer können ein Dokument mit einem Fälligkeitsdatum ("Wiedervorlage")
|
|
versehen, z.B. um eine Frist oder Rückmeldung nicht zu verpassen. Bei
|
|
Fälligkeit wird der Ersteller per E-Mail benachrichtigt.
|
|
|
|
## Datenmodell
|
|
|
|
Tabelle `reminders` (`internal/storage/reminders.go`):
|
|
|
|
```sql
|
|
CREATE TABLE IF NOT EXISTS reminders (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
document_id BIGINT NOT NULL REFERENCES documents(id),
|
|
tenant_id BIGINT NOT NULL,
|
|
user_id BIGINT NOT NULL,
|
|
due_date TIMESTAMPTZ NOT NULL,
|
|
note TEXT,
|
|
status TEXT NOT NULL DEFAULT 'open', -- open|done|dismissed
|
|
notified_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_reminders_tenant_due ON reminders(tenant_id, due_date) WHERE status = 'open';
|
|
CREATE INDEX IF NOT EXISTS idx_reminders_document ON reminders(document_id);
|
|
```
|
|
|
|
## API (`internal/api/reminder_handlers.go`)
|
|
|
|
| Methode | Pfad | Beschreibung |
|
|
|---------|------------------------------------|--------------------------------------|
|
|
| POST | `/api/documents/{id}/reminders` | Wiedervorlage für Dokument anlegen |
|
|
| GET | `/api/reminders?status=` | Eigene Wiedervorlagen auflisten |
|
|
| PATCH | `/api/reminders/{id}` | Status ändern (open/done/dismissed) |
|
|
| DELETE | `/api/reminders/{id}` | Wiedervorlage löschen |
|
|
|
|
Alle Routen laufen durch `s.auth(...)` (Session + Tenant-Context). Ownership
|
|
wird in der Store-Schicht über `id + tenant_id + user_id` erzwungen. Jede
|
|
Statusänderung wird auditiert — auch fehlgeschlagene Versuche.
|
|
|
|
## Audit-Events (`internal/audit/audit.go`)
|
|
|
|
- `reminder_create`
|
|
- `reminder_status_change`
|
|
- `reminder_delete`
|
|
- `reminder_notify` (Cron-Benachrichtigung)
|
|
|
|
## Cron-Benachrichtigung
|
|
|
|
`archivdms reminders notify [-config PATH] [-dry-run]`
|
|
(`cmd/archivdms/cmd_reminders_notify.go`) liest alle offenen Wiedervorlagen
|
|
mit `due_date <= now()` und `notified_at IS NULL`, versendet eine E-Mail über
|
|
`internal/mailer`, und setzt `notified_at`. Läuft stündlich per
|
|
`deploy/cron.d/archivdms-reminders`.
|
|
|
|
## Frontend
|
|
|
|
- `src/components/reminders/CreateReminderButton.tsx` — Dialog zum Anlegen
|
|
(Datum via shadcn `calendar.tsx` + `popover.tsx`, Notiz-Textarea)
|
|
- `src/components/reminders/ReminderBadge.tsx` — Statusanzeige in der
|
|
Dokument-Detailansicht (offen/fällig/erledigt)
|
|
- `src/components/reminders/ReminderList.tsx` — Listendarstellung
|
|
- `src/app/reminders/page.tsx` — Übersichtsseite offen/erledigt
|
|
|
|
## Akzeptanzkriterien
|
|
|
|
1. Ein Nutzer kann für ein Dokument seines Tenants eine Wiedervorlage mit
|
|
Fälligkeitsdatum und optionaler Notiz anlegen.
|
|
2. `/reminders` zeigt eigene offene und erledigte Wiedervorlagen getrennt an.
|
|
3. Statusänderung (erledigt/verworfen) ist nur für den Ersteller möglich
|
|
(Ownership-Check via user_id).
|
|
4. Der Cron-Job versendet für jede fällige, noch nicht benachrichtigte
|
|
Wiedervorlage genau eine E-Mail und markiert sie danach als benachrichtigt.
|
|
5. Jede Statusänderung und jeder Benachrichtigungsversuch erscheint im
|
|
Audit-Log, inklusive Fehlschläge.
|