Build and Push Multi-Platform Images / build-and-push (push) Successful in 55s
Die tägliche E-Mail-Zusammenfassung zeigte Nutzern Bereiche, für die sie
keine Berechtigung haben. Zwei unabhängige Ursachen:
- Das Backend prüfte weiterhin die Altgruppe PM_Belege. Die Umbenennung
zu PM_Buchhaltung (ca1d371) war nur im Frontend angekommen, weshalb
der Digest "Manuell bearbeiten" und "In Agrarmonitor" anbot, während
die Oberfläche beide Bereiche sperrte.
- Der Cron-Versand wertet die Gruppen aus user_settings aus. Diese Spalte
wurde nur beim Aufruf der Benutzereinstellungen gefüllt; entzogene
Berechtigungen erreichten den Digest daher unter Umständen nie.
Behoben durch Angleichen des Gruppen-Mappings und den neuen
UserIdentitySyncService, der E-Mail, Benutzername und Gruppen bei jedem
authentifizierten Request aus dem Token spiegelt – ohne den Request zu
blockieren und ohne DB-Zugriff, solange sich das Token nicht ändert. Die
doppelte Identitätspflege im UserSettingsService entfällt.
WebDAV wird nicht eingesetzt und ist entfernt; Export-Ziele bieten nur
noch FTP. Damit verschwindet das ESM-Paket webdav, an dem zwei
Jest-Suites bereits beim Parsen scheiterten.
Veraltete Tests instand gesetzt: email.controller und settings.controller
mockten weniger Abhängigkeiten, als die Klassen inzwischen haben;
postprocessing.service.spec beschrieb noch das alte Regelmodell mit
Einzelfeldern statt FilterJson und ist gegen die heutige Filter-Engine
neu geschrieben (AND/OR, verschachtelte Gruppen, Fehlerprotokollierung).
Enthält außerdem den Arbeitsstand der E-Rechnungs-Mandantenzuordnung, da
sich beide Änderungen dieselben Dateien teilen (SettingsPage, package.json).
98 Tests in 12 Suites grün, Backend- und Frontend-Build sauber.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
86 lines
2.1 KiB
TypeScript
86 lines
2.1 KiB
TypeScript
import 'reflect-metadata';
|
|
import { join } from 'path';
|
|
import { config as loadEnv } from 'dotenv';
|
|
import { DataSource, DataSourceOptions } from 'typeorm';
|
|
import {
|
|
Client,
|
|
DocumentType,
|
|
DocumentField,
|
|
Task,
|
|
Postprocessing,
|
|
PostprocessingAction,
|
|
PostprocessingLog,
|
|
ExportTarget,
|
|
Setting,
|
|
Kontonummer,
|
|
Document,
|
|
UserClient,
|
|
ClientIdentifier,
|
|
Email,
|
|
Attachment,
|
|
Content,
|
|
ApiKey,
|
|
CorrespondentSetting,
|
|
BarcodeTemplate,
|
|
InboxDocument,
|
|
InboxPostprocessingAction,
|
|
CorrespondentEmailMapping,
|
|
UserSettings,
|
|
LabelPrintJob,
|
|
WebhookQueueItem,
|
|
} from './entities';
|
|
|
|
// CLI-Kontext: .env laden (Laufzeit im Container liefert die Variablen via Docker,
|
|
// dotenv ist dort ein No-Op). dotenv überschreibt bereits gesetzte Variablen nicht.
|
|
loadEnv();
|
|
loadEnv({ path: join(process.cwd(), '..', '.env') });
|
|
|
|
export const entities = [
|
|
Client,
|
|
DocumentType,
|
|
DocumentField,
|
|
Task,
|
|
Postprocessing,
|
|
PostprocessingAction,
|
|
PostprocessingLog,
|
|
ExportTarget,
|
|
Setting,
|
|
Kontonummer,
|
|
Document,
|
|
UserClient,
|
|
ClientIdentifier,
|
|
Email,
|
|
Attachment,
|
|
Content,
|
|
ApiKey,
|
|
CorrespondentSetting,
|
|
BarcodeTemplate,
|
|
InboxDocument,
|
|
InboxPostprocessingAction,
|
|
CorrespondentEmailMapping,
|
|
UserSettings,
|
|
LabelPrintJob,
|
|
WebhookQueueItem,
|
|
];
|
|
|
|
const isProduction = process.env.NODE_ENV === 'production';
|
|
|
|
export const dataSourceOptions: DataSourceOptions = {
|
|
type: 'mysql',
|
|
host: process.env.DB_HOST ?? 'localhost',
|
|
port: Number(process.env.DB_PORT ?? 3306),
|
|
username: process.env.DB_USERNAME ?? 'root',
|
|
password: process.env.DB_PASSWORD ?? '',
|
|
database: process.env.DB_DATABASE ?? 'paperlessadd',
|
|
charset: 'utf8mb4',
|
|
entities,
|
|
migrations: [join(__dirname, 'migrations', '*.{ts,js}')],
|
|
// In Produktion: kein synchronize (zerstörerischer ALTER-Churn), Migrationen
|
|
// werden beim Start automatisch ausgeführt. In Dev: synchronize wie bisher.
|
|
synchronize: !isProduction,
|
|
migrationsRun: isProduction,
|
|
};
|
|
|
|
// Wird von der TypeORM-CLI verwendet (migration:generate / :run / :revert).
|
|
export default new DataSource(dataSourceOptions);
|