forked from jappel/leistungsbilanz-ts
- Seitenansicht (/projects/:projectId/print): tabular cover page, board overview with supply structure and power sums, one plan per board with a repeating title block; PDF via the browser print dialog with named @page rules (A4 portrait cover, A4/A3 landscape plans, page x of y). - Distribution-board info card (board number, location, fed-from, remark) in the board edit dialog, persisted through the additively extended distribution-board.update command (migration 0008, snapshot schema 6, legacy subtree commands normalized). - Global document logo upload (PNG/JPEG/SVG, max 2 MB) outside project revisions and snapshots. - fed-from stays free text; the overview hierarchy and cumulated sums are preliminary until the feed link is modeled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import { eq } from "drizzle-orm";
|
|
import type { AppDatabase } from "../database-context.js";
|
|
import {
|
|
documentBrandingAssets,
|
|
type DocumentBrandingAsset,
|
|
} from "../schema/document-branding-assets.js";
|
|
|
|
// Plain repository without revision semantics: branding is global office
|
|
// configuration, not a project mutation.
|
|
export class DocumentBrandingRepository {
|
|
constructor(private readonly db: AppDatabase) {}
|
|
|
|
get(key: string): DocumentBrandingAsset | undefined {
|
|
return this.db
|
|
.select()
|
|
.from(documentBrandingAssets)
|
|
.where(eq(documentBrandingAssets.key, key))
|
|
.get();
|
|
}
|
|
|
|
upsert(asset: {
|
|
key: string;
|
|
mimeType: string;
|
|
fileName: string | null;
|
|
data: Buffer;
|
|
}): DocumentBrandingAsset {
|
|
const updatedAt = new Date();
|
|
return this.db
|
|
.insert(documentBrandingAssets)
|
|
.values({ ...asset, updatedAt })
|
|
.onConflictDoUpdate({
|
|
target: documentBrandingAssets.key,
|
|
set: {
|
|
mimeType: asset.mimeType,
|
|
fileName: asset.fileName,
|
|
data: asset.data,
|
|
updatedAt,
|
|
},
|
|
})
|
|
.returning()
|
|
.get();
|
|
}
|
|
|
|
delete(key: string): boolean {
|
|
return (
|
|
this.db
|
|
.delete(documentBrandingAssets)
|
|
.where(eq(documentBrandingAssets.key, key))
|
|
.run().changes > 0
|
|
);
|
|
}
|
|
}
|