Files
MABEA/backend/alembic/versions/0024_dokument_hash.py
T
patrickandClaude Sonnet 5 707701d897
CI / backend-tests (push) Failing after 2m11s
CI / frontend-build (push) Successful in 20s
feat(dokumente): DOC-001 Duplikat-Erkennung + Fix Online-Ansicht (Popup-Blocker)
Duplikat-Erkennung: SHA-256-Hash je Dokument (Migration 0024), Upload wird
mit 409 abgelehnt, wenn dieselbe Datei bereits an derselben Entität liegt
(Vergleich bewusst pro Entität, nicht global - gleiche Datei an zwei
Objekten ist kein Duplikat). Frontend zeigt die Backend-Fehlermeldung
(Dateiname/Datum des bestehenden Dokuments) statt generischem Text.

Nebenbei gefunden+gefixt: "Ansehen" (PDF/JPG/PNG online statt Download)
funktionierte nicht zuverlässig, weil window.open() erst nach einem await
fetch() aufgerufen wurde - Popup-Blocker werten das nicht mehr als direkte
Nutzeraktion. Jetzt öffnet der Tab sofort synchron, die Blob-URL wird
nachgeladen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 00:59:15 +02:00

31 lines
1.0 KiB
Python

"""DOC-001: SHA-256-Hash am Dokument für Duplikat-Erkennung beim Upload.
Revision ID: 0024_dokument_hash
Revises: 0023_suchindex
Create Date: 2026-09-08
"""
from typing import Sequence, Union
from alembic import op
revision: str = "0024_dokument_hash"
down_revision: Union[str, None] = "0023_suchindex"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# Nullable: Altbestand vor dieser Migration hat keinen Hash (nachträgliche
# Befüllung würde Dateizugriff je Dokument brauchen, kein Datenverlust-
# Risiko - Duplikatprüfung greift nur für Dokumente, die NACH dieser
# Migration hochgeladen werden).
op.execute("ALTER TABLE dokument ADD COLUMN dateihash VARCHAR(64)")
op.execute(
"CREATE INDEX ix_dokument_entitaet_hash ON dokument (entitaet_typ, entitaet_id, dateihash)"
)
def downgrade() -> None:
op.execute("DROP INDEX IF EXISTS ix_dokument_entitaet_hash")
op.execute("ALTER TABLE dokument DROP COLUMN dateihash")