FDN-01: repository & projektgerüst
Git-Repository für bestehenden archivdms-Code initialisiert, Branch-/Commit-Konvention (feature/<ticket>-<slug>-Branches, Ticket-Prefix in Commit-Nachricht) etabliert.
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# 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.
|
||||
@@ -0,0 +1,11 @@
|
||||
# Feature-Spezifikationen
|
||||
|
||||
Konvention übernommen von archivmail: jedes fachliche Feature bekommt eine
|
||||
eigene `PROJ-N-name.md`-Datei in diesem Verzeichnis. Die Datei beschreibt
|
||||
Zweck, Datenmodell, API, und Akzeptanzkriterien — geschrieben *bevor* oder
|
||||
*während* der Implementierung, als lebendige Spec, nicht als nachträgliche
|
||||
Doku.
|
||||
|
||||
## Index
|
||||
|
||||
- `PROJ-1-wiedervorlage.md` — Wiedervorlage (Reminder pro Dokument)
|
||||
Reference in New Issue
Block a user