From 74ea2dc7b58add956fbd08aaaa9c42306b7868c7 Mon Sep 17 00:00:00 2001 From: Siim Raud Date: Fri, 3 Jan 2025 11:50:39 +0200 Subject: [PATCH 1/5] feat: validating if ticket creation succeeded --- .../src/lib/services/ticket/ticket.service.spec.ts | 13 +++++++++++++ .../src/lib/services/ticket/ticket.ts | 9 +++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts b/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts index 5bd61e7c..f38bf79b 100644 --- a/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts +++ b/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts @@ -796,6 +796,19 @@ describe('Ticket service', function () { }); expect(res).toEqual(SUCCESSFUL_RESPONSE); }); + + it('should throw when response does not contain ID', async () => { + requestStub.mockResolvedValue({}); + const request: TicketCreationRequest = { + lineId: '41299290', + firstName: 'James', + lastName: 'Baxter', + email: 'foo@bar.com', + }; + await expect(async () => { + await TicketService.create(request); + }).rejects.toThrow(new Error('Failed to create a ticket')); + }); }); describe('details()', function () { diff --git a/packages/javascript-api/src/lib/services/ticket/ticket.ts b/packages/javascript-api/src/lib/services/ticket/ticket.ts index 4fc72d51..e776712f 100644 --- a/packages/javascript-api/src/lib/services/ticket/ticket.ts +++ b/packages/javascript-api/src/lib/services/ticket/ticket.ts @@ -319,18 +319,23 @@ export function count(search: TicketCountCriteria): Promise { ); } -export function create( +export async function create( request: TicketCreationRequest, ): Promise { const body = JSON.stringify(request); - return ApiBase.request('tickets', { + const result: TicketCreatedResponse = await ApiBase.request('tickets', { method: 'POST', body, headers: { 'X-Qminder-API-Version': '2020-09-01', }, }); + if (!result.id) { + throw new Error('Failed to create a ticket'); + } + + return result; } export function details(ticket: IdOrObject): Promise { From 4673a28d17b97b74eb44e9d74a2d0129818e0d30 Mon Sep 17 00:00:00 2001 From: Siim Raud Date: Fri, 3 Jan 2025 12:10:23 +0200 Subject: [PATCH 2/5] Created ticket always has ID of String --- .../src/lib/model/ticket/ticket-created-response.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/javascript-api/src/lib/model/ticket/ticket-created-response.ts b/packages/javascript-api/src/lib/model/ticket/ticket-created-response.ts index f755a1bd..3ace97d5 100644 --- a/packages/javascript-api/src/lib/model/ticket/ticket-created-response.ts +++ b/packages/javascript-api/src/lib/model/ticket/ticket-created-response.ts @@ -1,5 +1,3 @@ -import { ID } from '../../util/id-or-object'; - export interface TicketCreatedResponse { - id: ID; + id: string; } From 2cc5b624facce7d4075a5452cfff2fb806a81946 Mon Sep 17 00:00:00 2001 From: Siim Raud Date: Fri, 3 Jan 2025 12:12:50 +0200 Subject: [PATCH 3/5] Bump version to 14 --- packages/javascript-api/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/javascript-api/package.json b/packages/javascript-api/package.json index fb96d3bf..dff069c7 100644 --- a/packages/javascript-api/package.json +++ b/packages/javascript-api/package.json @@ -1,6 +1,6 @@ { "name": "qminder-api", - "version": "13.4.2", + "version": "14.0.0", "description": "Qminder Javascript API. Makes it easy to leverage Qminder capabilities in your system.", "scripts": { "test": "jest", From 7148c9dbe288c4bb10e638e220524f6ff59aee9d Mon Sep 17 00:00:00 2001 From: Siim Raud Date: Fri, 3 Jan 2025 14:24:53 +0200 Subject: [PATCH 4/5] Typed error --- .../src/lib/model/errors/response-validation-error.ts | 5 +++++ .../src/lib/services/ticket/ticket.service.spec.ts | 3 ++- packages/javascript-api/src/lib/services/ticket/ticket.ts | 3 ++- packages/javascript-api/src/public-api/model.ts | 1 + 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 packages/javascript-api/src/lib/model/errors/response-validation-error.ts diff --git a/packages/javascript-api/src/lib/model/errors/response-validation-error.ts b/packages/javascript-api/src/lib/model/errors/response-validation-error.ts new file mode 100644 index 00000000..6e7120fe --- /dev/null +++ b/packages/javascript-api/src/lib/model/errors/response-validation-error.ts @@ -0,0 +1,5 @@ +export class ResponseValidationError extends Error { + constructor(message: string) { + super(message); + } +} diff --git a/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts b/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts index f38bf79b..f591dff3 100644 --- a/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts +++ b/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts @@ -4,6 +4,7 @@ import { TicketCreatedResponse } from '../../model/ticket/ticket-created-respons import { TicketCreationRequest } from '../../model/ticket/ticket-creation-request'; import { Qminder } from '../../qminder'; import { TicketService } from './ticket.service'; +import { ResponseValidationError } from '../../model/errors/response-validation-error'; describe('Ticket service', function () { const JON_SNOW = { @@ -807,7 +808,7 @@ describe('Ticket service', function () { }; await expect(async () => { await TicketService.create(request); - }).rejects.toThrow(new Error('Failed to create a ticket')); + }).rejects.toThrow(new ResponseValidationError('Response does not contain "id"')); }); }); diff --git a/packages/javascript-api/src/lib/services/ticket/ticket.ts b/packages/javascript-api/src/lib/services/ticket/ticket.ts index e776712f..28e7fe70 100644 --- a/packages/javascript-api/src/lib/services/ticket/ticket.ts +++ b/packages/javascript-api/src/lib/services/ticket/ticket.ts @@ -10,6 +10,7 @@ import { extractIdToNumber, } from '../../util/id-or-object.js'; import { ApiBase } from '../api-base/api-base.js'; +import { ResponseValidationError } from '../../model/errors/response-validation-error.js'; /** * Represents a collection of search criteria for TicketService.count(). @@ -332,7 +333,7 @@ export async function create( }, }); if (!result.id) { - throw new Error('Failed to create a ticket'); + throw new ResponseValidationError('Response does not contain "id"'); } return result; diff --git a/packages/javascript-api/src/public-api/model.ts b/packages/javascript-api/src/public-api/model.ts index f6599ab8..282b2f95 100644 --- a/packages/javascript-api/src/public-api/model.ts +++ b/packages/javascript-api/src/public-api/model.ts @@ -17,6 +17,7 @@ export { User } from '../lib/model/user.js'; export { Webhook } from '../lib/model/webhook.js'; export { SimpleError } from '../lib/model/errors/simple-error.js'; export { ComplexError } from '../lib/model/errors/complex-error.js'; +export { ResponseValidationError } from '../lib/model/errors/response-validation-error.js'; export { UnknownError } from '../lib/model/errors/unknown-error.js'; export { TicketCreationRequest } from '../lib/model/ticket/ticket-creation-request.js'; export { TicketCreatedResponse } from '../lib/model/ticket/ticket-created-response.js'; From 9dc45ab04a52c5195813ef59e804dcff54b605d3 Mon Sep 17 00:00:00 2001 From: Siim Raud Date: Fri, 3 Jan 2025 14:28:16 +0200 Subject: [PATCH 5/5] Prettier --- .../src/lib/services/ticket/ticket.service.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts b/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts index f591dff3..250c714e 100644 --- a/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts +++ b/packages/javascript-api/src/lib/services/ticket/ticket.service.spec.ts @@ -808,7 +808,9 @@ describe('Ticket service', function () { }; await expect(async () => { await TicketService.create(request); - }).rejects.toThrow(new ResponseValidationError('Response does not contain "id"')); + }).rejects.toThrow( + new ResponseValidationError('Response does not contain "id"'), + ); }); });