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
31 lines
1.0 KiB
Python
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")
|