fix(mail): Duplikate auch bei neu erzeugten PDFs erkennen
Build and Push Multi-Platform Images / build-and-push (push) Successful in 45s
Build and Push Multi-Platform Images / build-and-push (push) Successful in 45s
Absender erzeugen PDFs beim erneuten Versand oft neu (andere Erstellungszeit/Dokument-ID), dadurch unterscheidet sich die Checksumme und die Duplikatprüfung griff nicht (z.B. Mail 7071 vs. 7072). - Neuer Text-Fingerprint (SHA-256 über normalisierten PDF-Text via pdf-parse) in Attachments.ContentFingerprint, inkl. Migration und Index - Wird beim Mail-Abruf berechnet; Altbestand füllt ein Hintergrund- Backfill beim Start auf, fehlende Werte werden bei Bedarf nachberechnet - Duplikatprüfung und Import-Sperre berücksichtigen Anhänge mit gleichem Inhalt, die importiert sind oder gerade importiert werden - Jest braucht für pdf-parse --experimental-vm-modules (test-Skripte) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
534b313054
commit
797cbb9b71
12 files changed
+746
-7
No files matched your search
@@ -31,6 +31,15 @@ export class Attachment {
|
||||
@Column({ type: 'varchar', length: 32, default: '' })
|
||||
Checksum!: string;
|
||||
|
||||
/**
|
||||
* SHA-256 über den normalisierten PDF-Text (siehe pdf-fingerprint.util).
|
||||
* Erkennt Duplikate, deren Datei neu erzeugt wurde (andere Checksumme).
|
||||
* `''` = berechnet, aber ohne Textebene; `null` = noch nicht berechnet.
|
||||
*/
|
||||
@Index('IX_Attachments_ContentFingerprint')
|
||||
@Column({ type: 'varchar', length: 64, nullable: true })
|
||||
ContentFingerprint!: string | null;
|
||||
|
||||
@Column({ type: 'varchar', length: 255, nullable: true })
|
||||
ContentId!: string | null;
|
||||
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm';
|
||||
|
||||
/**
|
||||
* Inhaltsbasierter Fingerprint für Mail-Anhänge: erkennt Duplikate, deren
|
||||
* PDF vom Absender neu erzeugt wurde und daher eine andere Checksumme hat.
|
||||
* Bestehende Anhänge werden beim Start im Hintergrund nachberechnet
|
||||
* (AttachmentFingerprintService).
|
||||
*/
|
||||
export class AttachmentContentFingerprint1790000000000 implements MigrationInterface {
|
||||
name = 'AttachmentContentFingerprint1790000000000';
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE \`Attachments\`
|
||||
ADD \`ContentFingerprint\` varchar(64) NULL DEFAULT NULL
|
||||
`);
|
||||
await queryRunner.query(`
|
||||
CREATE INDEX \`IX_Attachments_ContentFingerprint\`
|
||||
ON \`Attachments\` (\`ContentFingerprint\`)
|
||||
`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`DROP INDEX \`IX_Attachments_ContentFingerprint\` ON \`Attachments\``,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE \`Attachments\` DROP COLUMN \`ContentFingerprint\``,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user