From d3209d73c10b77d9a80c76cb90f1a63f8643bf95 Mon Sep 17 00:00:00 2001 From: seb Date: Sun, 1 Nov 2026 21:24:28 +0100 Subject: [PATCH] u --- src/api/routes/company.js | 6 +++ src/services/defaultLabelTemplates.js | 72 +++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/services/defaultLabelTemplates.js diff --git a/src/api/routes/company.js b/src/api/routes/company.js index ce10f87..21fa4de 100644 --- a/src/api/routes/company.js +++ b/src/api/routes/company.js @@ -7,6 +7,7 @@ import * as googleAuth from '../../db/googleAuth.js'; import { clearCachedUser } from '../middleware/auth.js'; import { emit } from '../sse.js'; import { initCompanyVfs } from '../../tools/vfs.js'; +import { createDefaultLabelTemplates } from '../../services/defaultLabelTemplates.js'; import { executeCompanyImport } from '../../services/companyImport.js'; import { executeCompanyExport } from '../../services/companyExport.js'; import { clearCompanyPrinters } from '../../services/companyPrinterService.js'; @@ -217,6 +218,11 @@ export function register(app, basePath = '') { } catch (vfsErr) { console.error('Failed to initialize company VFS:', vfsErr); } + try { + await createDefaultLabelTemplates(req.user.id); + } catch (tplErr) { + console.error('Failed to create default label templates:', tplErr); + } const authRow = await googleAuth.getAllowedEmail(req.user.email); res.status(201).json({ company, user: userPayload(authRow) }); } catch (error) { diff --git a/src/services/defaultLabelTemplates.js b/src/services/defaultLabelTemplates.js new file mode 100644 index 0000000..826143d --- /dev/null +++ b/src/services/defaultLabelTemplates.js @@ -0,0 +1,72 @@ +import * as labeltemplateDb from '../db/labeltemplate.js'; +import { renderThumb } from './labelThumb.js'; + +const TEXTBOX_DEFAULTS = { + blackpoint: 128, + rotation: 0, + marginBottom: 0, +}; + +const DEFAULT_TEMPLATES = [ + { + name: 'FD057X032Z1', + width: 448, + height: 256, + dpi: 203, + type: 'zpl', + content: { + objects: [ + { + id: '4df08336-e936-40bf-b9d9-c7b08c5a1ad6', type: 'textbox', text: '{{name}}', font: 'outfit', + ...TEXTBOX_DEFAULTS, minFontSize: 14, maxFontSize: 120, halign: 'center', valign: 'top', + invert: false, cornerRadius: 0, marginLeft: 0, marginTop: 0, marginRight: 0, + x: 9, y: 9, w: 427, h: 133, + }, + { + id: 'a2037b05-8124-4a4d-85d1-270a7f9cdb8a', type: 'textbox', text: '{{baseprice}}', font: 'barlow-semi-condensed', + ...TEXTBOX_DEFAULTS, minFontSize: 1, maxFontSize: 18, halign: 'right', valign: 'top', + invert: false, cornerRadius: 0, marginLeft: 0, marginTop: 0, marginRight: 0, + x: 12, y: 138, w: 188, h: 20, + }, + { + id: '50e81524-04d3-4fa2-bca6-e5f346c27907', type: 'barcode', + x: 10, y: 162, h: 52, scale: 2, format: 'EAN13', code: '0', + }, + { + id: '16443d4f-8d86-4253-bfbf-e98c44e6552a', type: 'textbox', text: '{{price}}', font: 'barlow-semi-condensed', + ...TEXTBOX_DEFAULTS, minFontSize: 14, maxFontSize: 88, halign: 'center', valign: 'middle', + invert: true, cornerRadius: 30, marginLeft: 10, marginTop: 5, marginRight: 10, + x: 214, y: 146, w: 220, h: 83, + }, + ], + }, + }, + { + name: 'E025X013Z1', + width: 200, + height: 104, + dpi: 203, + type: 'zpl', + content: { + objects: [ + { + id: 'd666154d-6571-41fb-ad50-1650a6218deb', type: 'textbox', text: '{{price}}', font: 'barlow-semi-condensed', + ...TEXTBOX_DEFAULTS, minFontSize: 14, maxFontSize: 66, halign: 'center', valign: 'middle', + invert: true, cornerRadius: 24, marginLeft: 12, marginTop: 6, marginRight: 12, + x: 109, y: 2, w: 210, h: 91, + }, + ], + }, + }, +]; + +/** + * Creates the default label templates for the user's (newly selected) company. + * @param {number} googleAuthId + */ +export async function createDefaultLabelTemplates(googleAuthId) { + for (const tpl of DEFAULT_TEMPLATES) { + const thumb = await renderThumb({ width: tpl.width, height: tpl.height, objects: tpl.content.objects }); + await labeltemplateDb.create(googleAuthId, { ...tpl, thumb }); + } +}