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
+36
View File
@@ -0,0 +1,36 @@
-- PROJ: trash-staged-deletion
-- Doku-only (siehe README.md in diesem Verzeichnis) — die tatsächliche
-- Ausführung passiert idempotent über internal/storage/trash.go
-- initTrashSchema(), aufgerufen aus (*Store).initSchema().
--
-- Papierkorb + gestaffeltes Löschkonzept (GoBD):
-- * documents.deleted_at/deleted_by = Soft-Delete (Papierkorb). Die WORM-Datei
-- bleibt physisch unangetastet (chmod 0440) bis ein Löschantrag den Status
-- 'executed' erreicht.
-- * document_delete_requests = Vier-/Zwei-Augen-Workflow für finales Löschen:
-- User A stellt Antrag ('pending'), ein anderer domain_admin (User B)
-- bestätigt ('confirmed'->'executed'). Retention (retain_until) wird bei
-- Antrag UND Bestätigung geprüft; ein blockierter Versuch wird als
-- 'blocked_retention' protokolliert (Nachvollziehbarkeit).
-- * Finales Löschen: physische Datei via os.Remove entfernt, DB-Row als
-- Tombstone behalten (storage_path/ocr_text geleert, content_hash bleibt).
-- * Das Vier-Augen-Prinzip (confirmed_by != requested_by) wird im Go-Store
-- erzwungen, NICHT per CHECK-Constraint (confirmed_by wird erst später
-- gesetzt).
ALTER TABLE documents ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ;
ALTER TABLE documents ADD COLUMN IF NOT EXISTS deleted_by BIGINT;
CREATE TABLE IF NOT EXISTS document_delete_requests (
id BIGSERIAL PRIMARY KEY,
document_id BIGINT NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
tenant_id BIGINT NOT NULL,
requested_by BIGINT NOT NULL,
requested_at TIMESTAMPTZ NOT NULL DEFAULT now(),
confirmed_by BIGINT,
confirmed_at TIMESTAMPTZ,
status TEXT NOT NULL DEFAULT 'pending'
CHECK (status IN ('pending','confirmed','executed','cancelled','blocked_retention')),
UNIQUE(document_id, status)
);
CREATE INDEX IF NOT EXISTS idx_ddr_tenant_status ON document_delete_requests(tenant_id, status);