From 829ab19f59c5d7f5e2eaedcefad97a8076fd4adf Mon Sep 17 00:00:00 2001 From: seb Date: Mon, 3 Aug 2026 06:32:25 +0200 Subject: [PATCH] Add name column to posterminal table - Added required name NVARCHAR(255) NOT NULL column to posterminal schema - Updated SQL queries (LIST_BY_COMPANY, GET_BY_ID, CREATE, UPDATE) to include name - Updated upsert store method to validate and persist name - Updated README with name in method signatures and return types --- README.md | 8 ++++---- src/schema.js | 1 + src/sql/posterminal.js | 10 ++++++---- src/store/posterminal/upsert.js | 9 ++++++++- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 142a817..869169a 100644 --- a/README.md +++ b/README.md @@ -188,8 +188,8 @@ Company-scoped POS terminals. Auth via `resolveCompanyAccess`. | Method | Signature | Returns | | --- | --- | --- | -| `list` | `(googleAuthId, companyId)` | `{ id, token, pairingpin }[]` | -| `upsert` | `(googleAuthId, companyId, { id?, token?, pairingpin })` | `{ id, token, pairingpin }` | +| `list` | `(googleAuthId, companyId)` | `{ id, name, token, pairingpin }[]` | +| `upsert` | `(googleAuthId, companyId, { id?, name, token?, pairingpin })` | `{ id, name, token, pairingpin }` | | `delete` | `(googleAuthId, companyId, id)` | `void` | | `setOn` | `(googleAuthId, companyId, posterminalId, categoryId)` | `{ id, categoryIds[] }` | | `setOff` | `(googleAuthId, companyId, posterminalId, categoryId)` | `{ id, categoryIds[] }` | @@ -197,7 +197,7 @@ Company-scoped POS terminals. Auth via `resolveCompanyAccess`. | `setOffAll` | `(googleAuthId, companyId, posterminalId)` | `{ id, categoryIds[] }` | | `getCategoryPosterminalIds` | `(companyId)` | `{ [categoryId]: posterminalId[] }` (internal, used by category tree) | -`posterminal.company_id` **NOT NULL**. `token` is nullable and unique (pairing code assigned during setup). `pairingpin` is required. +`posterminal.company_id` **NOT NULL**. `name` is required. `token` is nullable and unique (pairing code assigned during setup). `pairingpin` is required. `upsert`: if `id` is provided, updates the existing posterminal (must belong to company); otherwise creates a new one. Errors: `Company not found`, `Not authorized`, `Invalid posterminal`, `Posterminal not found`. @@ -367,7 +367,7 @@ res.set('Content-Type', thumb.contentType).send(thumb.buffer); | `PUT /api/brand` | `brand.upsert(googleAuthId, companyId, { name, gsprpinfo? })` | | `DELETE /api/brand/:id` | `brand.delete(googleAuthId, companyId, id)` | | `GET /api/posterminal` | `posterminal.list(googleAuthId, companyId)` | -| `PUT /api/posterminal` | `posterminal.upsert(googleAuthId, companyId, { id?, token?, pairingpin })` | +| `PUT /api/posterminal` | `posterminal.upsert(googleAuthId, companyId, { id?, name, token?, pairingpin })` | | `DELETE /api/posterminal/:id` | `posterminal.delete(googleAuthId, companyId, id)` | | `PUT /api/posterminal/:id/category/:categoryId` | `posterminal.setOn(googleAuthId, companyId, id, categoryId)` | | `DELETE /api/posterminal/:id/category/:categoryId` | `posterminal.setOff(googleAuthId, companyId, id, categoryId)` | diff --git a/src/schema.js b/src/schema.js index 36d7f4e..661722d 100644 --- a/src/schema.js +++ b/src/schema.js @@ -574,6 +574,7 @@ BEGIN CREATE TABLE posterminal ( id INT IDENTITY(1,1) PRIMARY KEY, company_id INT NOT NULL, + name NVARCHAR(255) NOT NULL, token NVARCHAR(255) NULL, pairingpin NVARCHAR(50) NOT NULL, CONSTRAINT FK_posterminal_company FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE, diff --git a/src/sql/posterminal.js b/src/sql/posterminal.js index 7545fa9..3432900 100644 --- a/src/sql/posterminal.js +++ b/src/sql/posterminal.js @@ -1,6 +1,7 @@ export const LIST_BY_COMPANY = ` SELECT id, + name, token, pairingpin FROM posterminal @@ -12,6 +13,7 @@ export const GET_BY_ID = ` SELECT id, company_id AS companyId, + name, token, pairingpin FROM posterminal @@ -19,14 +21,14 @@ WHERE id = @id `; export const CREATE = ` -INSERT INTO posterminal (company_id, token, pairingpin) -OUTPUT INSERTED.id, INSERTED.token, INSERTED.pairingpin -VALUES (@companyId, @token, @pairingpin) +INSERT INTO posterminal (company_id, name, token, pairingpin) +OUTPUT INSERTED.id, INSERTED.name, INSERTED.token, INSERTED.pairingpin +VALUES (@companyId, @name, @token, @pairingpin) `; export const UPDATE = ` UPDATE posterminal -SET token = @token, pairingpin = @pairingpin +SET name = @name, token = @token, pairingpin = @pairingpin WHERE id = @id AND company_id = @companyId `; diff --git a/src/store/posterminal/upsert.js b/src/store/posterminal/upsert.js index eed06de..3e0bf6a 100644 --- a/src/store/posterminal/upsert.js +++ b/src/store/posterminal/upsert.js @@ -5,6 +5,10 @@ export default function upsert(pool) { const access = resolveCompanyAccess(pool); return async (googleAuthId, companyId, input = {}) => { + const name = input.name?.trim(); + if (!name) { + throw new Error('Invalid posterminal'); + } const pairingpin = input.pairingpin?.trim(); if (!pairingpin) { throw new Error('Invalid posterminal'); @@ -28,22 +32,25 @@ export default function upsert(pool) { .request() .input('id', id) .input('companyId', companyId) + .input('name', name) .input('token', token) .input('pairingpin', pairingpin) .query(UPDATE); - return { id, token, pairingpin }; + return { id, name, token, pairingpin }; } const created = await pool .request() .input('companyId', companyId) + .input('name', name) .input('token', token) .input('pairingpin', pairingpin) .query(CREATE); return { id: created.recordset[0].id, + name: created.recordset[0].name, token: created.recordset[0].token, pairingpin: created.recordset[0].pairingpin, };