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
This commit is contained in:
seb
2026-08-03 06:32:25 +02:00
parent e7c43ab4e7
commit 829ab19f59
4 changed files with 19 additions and 9 deletions

View File

@@ -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)` |

View File

@@ -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,

View File

@@ -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
`;

View File

@@ -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,
};