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:
2026-08-11 21:27:53 +02:00
parent 40ed80da71
commit 9a24ea29e1
274 changed files with 53708 additions and 0 deletions
+77
View File
@@ -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.
+11
View File
@@ -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)