@unchainedshop/ticketing 4.0.0-rc.9 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/lib/express.js +1 -1
  2. package/lib/express.js.map +1 -1
  3. package/lib/fastify.js +3 -3
  4. package/lib/fastify.js.map +1 -1
  5. package/lib/magic-key.js +4 -4
  6. package/lib/magic-key.js.map +1 -1
  7. package/lib/mobile-tickets/apple-handler-express.js +63 -64
  8. package/lib/mobile-tickets/apple-handler-express.js.map +1 -1
  9. package/lib/mobile-tickets/apple-handler-fastify.d.ts.map +1 -1
  10. package/lib/mobile-tickets/apple-handler-fastify.js +93 -42
  11. package/lib/mobile-tickets/apple-handler-fastify.js.map +1 -1
  12. package/lib/mobile-tickets/apple-wallet.d.ts +3 -3
  13. package/lib/mobile-tickets/apple-wallet.d.ts.map +1 -1
  14. package/lib/mobile-tickets/apple-wallet.js +3 -3
  15. package/lib/mobile-tickets/apple-wallet.js.map +1 -1
  16. package/lib/mobile-tickets/apple-webservice.d.ts +7 -0
  17. package/lib/mobile-tickets/apple-webservice.d.ts.map +1 -0
  18. package/lib/mobile-tickets/apple-webservice.js +177 -0
  19. package/lib/mobile-tickets/apple-webservice.js.map +1 -0
  20. package/lib/mobile-tickets/google-handler-express.d.ts.map +1 -1
  21. package/lib/mobile-tickets/google-handler-express.js +13 -15
  22. package/lib/mobile-tickets/google-handler-express.js.map +1 -1
  23. package/lib/mobile-tickets/google-handler-fastify.d.ts.map +1 -1
  24. package/lib/mobile-tickets/google-handler-fastify.js +21 -8
  25. package/lib/mobile-tickets/google-handler-fastify.js.map +1 -1
  26. package/lib/mobile-tickets/google-webservice.d.ts +7 -0
  27. package/lib/mobile-tickets/google-webservice.d.ts.map +1 -0
  28. package/lib/mobile-tickets/google-webservice.js +52 -0
  29. package/lib/mobile-tickets/google-webservice.js.map +1 -0
  30. package/lib/module.d.ts +8 -8
  31. package/lib/module.d.ts.map +1 -1
  32. package/lib/module.js +6 -3
  33. package/lib/module.js.map +1 -1
  34. package/lib/pdf-tickets/print-handler-express.d.ts.map +1 -1
  35. package/lib/pdf-tickets/print-handler-express.js +4 -3
  36. package/lib/pdf-tickets/print-handler-express.js.map +1 -1
  37. package/lib/pdf-tickets/print-handler-fastify.d.ts.map +1 -1
  38. package/lib/pdf-tickets/print-handler-fastify.js +8 -2
  39. package/lib/pdf-tickets/print-handler-fastify.js.map +1 -1
  40. package/lib/pdf-tickets/print-webservice.d.ts +7 -0
  41. package/lib/pdf-tickets/print-webservice.d.ts.map +1 -0
  42. package/lib/pdf-tickets/print-webservice.js +31 -0
  43. package/lib/pdf-tickets/print-webservice.js.map +1 -0
  44. package/lib/template-registry.d.ts +2 -2
  45. package/lib/template-registry.d.ts.map +1 -1
  46. package/package.json +11 -11
  47. package/readme.md +1 -1
  48. package/src/express.ts +1 -1
  49. package/src/fastify.ts +3 -3
  50. package/src/magic-key.ts +4 -4
  51. package/src/mobile-tickets/apple-handler-express.ts +71 -71
  52. package/src/mobile-tickets/apple-handler-fastify.ts +103 -51
  53. package/src/mobile-tickets/apple-wallet.ts +3 -3
  54. package/src/mobile-tickets/google-handler-express.ts +14 -15
  55. package/src/mobile-tickets/google-handler-fastify.ts +23 -11
  56. package/src/module.ts +7 -4
  57. package/src/pdf-tickets/print-handler-express.ts +6 -3
  58. package/src/pdf-tickets/print-handler-fastify.ts +9 -2
  59. package/src/template-registry.ts +2 -2
  60. package/tsconfig.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"print-handler-fastify.js","sourceRoot":"","sources":["../../src/pdf-tickets/print-handler-fastify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAIrE,MAAM,mBAAmB,GAAuB,KAAK,EACnD,GAEC,EACD,KAAK,EACL,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAI,GAAG,CAAC,KAA6B,IAAI,EAAE,CAAC;IAE3E,IAAI,CAAC;QACH,IACE,OAAO,OAAO,KAAK,QAAQ;YAC3B,OAAO,GAAG,KAAK,QAAQ;YACvB,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC;YAExC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE7C,MAAM,WAAW,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAE1F,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAiB,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9F,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"print-handler-fastify.js","sourceRoot":"","sources":["../../src/pdf-tickets/print-handler-fastify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,GAAG,YAAY,CAAC,mCAAmC,CAAC,CAAC;AAEjE,MAAM,mBAAmB,GAAuB,KAAK,EACnD,GAEC,EACD,KAAK,EACL,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAI,GAAG,CAAC,KAA6B,IAAI,EAAE,CAAC;IAE3E,IAAI,CAAC;QACH,IACE,OAAO,OAAO,KAAK,QAAQ;YAC3B,OAAO,GAAG,KAAK,QAAQ;YACvB,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC;YAExC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE7C,MAAM,WAAW,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAE1F,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAiB,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9F,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC,IAAI,CAAC;YAChB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,sBAAsB;YAC/B,IAAI,EAAE,sBAAsB;SAC7B,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Request, Response } from 'express';
2
+ import { Context } from '@unchainedshop/types/api.js';
3
+ export declare function printTicketsHandler(req: Request & {
4
+ unchainedContext: Context;
5
+ }, res: Response): Promise<void>;
6
+ export default function connectPrintWebservice(app: any): void;
7
+ //# sourceMappingURL=print-webservice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-webservice.d.ts","sourceRoot":"","sources":["../../src/pdf-tickets/print-webservice.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAKtD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,gBAAgB,EAAE,OAAO,CAAA;CAAE,EAAE,GAAG,EAAE,QAAQ,iBAsBpG;AAED,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,GAAG,KAAA,QASjD"}
@@ -0,0 +1,31 @@
1
+ import { useMiddlewareWithCurrentContext } from '@unchainedshop/api/express/index.js';
2
+ import { checkAction } from '@unchainedshop/api/acl.js';
3
+ import { actions } from '@unchainedshop/api/roles/index.js';
4
+ import express from 'express';
5
+ import { RendererTypes, getRenderer } from '../template-registry.js';
6
+ const { UNCHAINED_PDF_PRINT_HANDLER_PATH = '/rest/print_tickets' } = process.env;
7
+ export async function printTicketsHandler(req, res) {
8
+ const { variant, orderId, otp } = req.query || {};
9
+ try {
10
+ if (typeof orderId !== 'string' ||
11
+ typeof otp !== 'string' ||
12
+ (variant && typeof variant !== 'string'))
13
+ throw new Error('Invalid query parameter');
14
+ await checkAction(req.unchainedContext, actions.viewOrder, [undefined, { orderId, otp }]);
15
+ const render = getRenderer(RendererTypes.ORDER_PDF);
16
+ const pdfStream = await render({ orderId, variant: variant }, req.unchainedContext);
17
+ res.setHeader('Content-Type', 'application/pdf');
18
+ pdfStream.pipe(res);
19
+ }
20
+ catch (error) {
21
+ console.error(error);
22
+ res.status(403);
23
+ res.end();
24
+ }
25
+ }
26
+ export default function connectPrintWebservice(app) {
27
+ useMiddlewareWithCurrentContext(app, UNCHAINED_PDF_PRINT_HANDLER_PATH, express.json({
28
+ type: 'application/json',
29
+ }), printTicketsHandler);
30
+ }
31
+ //# sourceMappingURL=print-webservice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-webservice.js","sourceRoot":"","sources":["../../src/pdf-tickets/print-webservice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC5D,OAAO,OAA8B,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,EAAE,gCAAgC,GAAG,qBAAqB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAA4C,EAAE,GAAa;IACnG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAElD,IAAI,CAAC;QACH,IACE,OAAO,OAAO,KAAK,QAAQ;YAC3B,OAAO,GAAG,KAAK,QAAQ;YACvB,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC;YAExC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE7C,MAAM,WAAW,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAE1F,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAiB,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9F,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QACjD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,GAAG;IAChD,+BAA+B,CAC7B,GAAG,EACH,gCAAgC,EAChC,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,kBAAkB;KACzB,CAAC,EACF,mBAAmB,CACpB,CAAC;AACJ,CAAC"}
@@ -5,8 +5,8 @@ export type PDFRenderer = ({ orderId, variant, }: {
5
5
  variant?: string;
6
6
  }, context: UnchainedCore) => Promise<NodeJS.ReadableStream>;
7
7
  export type PassRenderer = (token: TokenSurrogate, context: UnchainedCore) => Promise<{
8
- asURL?: () => Promise<string>;
9
- asBuffer?: () => Promise<Buffer>;
8
+ asURL: () => Promise<string>;
9
+ asBuffer: () => Promise<Buffer>;
10
10
  serialNumber?: string;
11
11
  passTypeIdentifier?: string;
12
12
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"template-registry.d.ts","sourceRoot":"","sources":["../src/template-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,MAAM,WAAW,GAAG,CACxB,EACE,OAAO,EACP,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,EACD,OAAO,EAAE,aAAa,KACnB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAEpC,MAAM,MAAM,YAAY,GAAG,CACzB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,aAAa,KACnB,OAAO,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC,CAAC;AAEH,oBAAY,aAAa;IACvB,aAAa,kBAAkB;IAC/B,YAAY,iBAAiB;IAC7B,SAAS,UAAU;CACpB;AAED,eAAO,MAAM,SAAS,yCAAgD,CAAC;AAEvE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC,GAC/F,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC;AAErG,eAAO,MAAM,gBAAgB,EAAE,kBAK9B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,KAAK,WAAW,CAAC,GAC1E,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC;AAErF,eAAO,MAAM,WAAW,EAAE,aAEzB,CAAC"}
1
+ {"version":3,"file":"template-registry.d.ts","sourceRoot":"","sources":["../src/template-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,MAAM,WAAW,GAAG,CACxB,EACE,OAAO,EACP,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,EACD,OAAO,EAAE,aAAa,KACnB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAEpC,MAAM,MAAM,YAAY,GAAG,CACzB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,aAAa,KACnB,OAAO,CAAC;IACX,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC,CAAC;AAEH,oBAAY,aAAa;IACvB,aAAa,kBAAkB;IAC/B,YAAY,iBAAiB;IAC7B,SAAS,UAAU;CACpB;AAED,eAAO,MAAM,SAAS,yCAAgD,CAAC;AAEvE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC,GAC/F,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC;AAErG,eAAO,MAAM,gBAAgB,EAAE,kBAK9B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,KAAK,WAAW,CAAC,GAC1E,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC;AAErF,eAAO,MAAM,WAAW,EAAE,aAEzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unchainedshop/ticketing",
3
- "version": "4.0.0-rc.9",
3
+ "version": "4.0.0",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "type": "module",
@@ -31,22 +31,22 @@
31
31
  },
32
32
  "homepage": "https://github.com/unchainedshop/unchained#readme",
33
33
  "dependencies": {
34
- "@unchainedshop/api": "^4.0.0-rc.4",
35
- "@unchainedshop/core": "^4.0.0-rc.4",
36
- "@unchainedshop/core-files": "^4.0.0-rc.4",
37
- "@unchainedshop/core-warehousing": "^4.0.0-rc.4",
38
- "@unchainedshop/core-worker": "^4.0.0-rc.4",
39
- "@unchainedshop/events": "^4.0.0-rc.4",
40
- "@unchainedshop/logger": "^4.0.0-rc.4",
41
- "@unchainedshop/mongodb": "^4.0.0-rc.4"
34
+ "@unchainedshop/api": "^4.0.0",
35
+ "@unchainedshop/core": "^4.0.0",
36
+ "@unchainedshop/core-files": "^4.0.0",
37
+ "@unchainedshop/core-warehousing": "^4.0.0",
38
+ "@unchainedshop/core-worker": "^4.0.0",
39
+ "@unchainedshop/events": "^4.0.0",
40
+ "@unchainedshop/logger": "^4.0.0",
41
+ "@unchainedshop/mongodb": "^4.0.0"
42
42
  },
43
43
  "peerDependencies": {
44
- "@hyperlink/node-apn": "^5.1.4",
44
+ "@parse/node-apn": "^6.5.0",
45
45
  "express": "5.x",
46
46
  "fastify": ">= 5.2 < 6"
47
47
  },
48
48
  "peerDependenciesMeta": {
49
- "@hyperlink/node-apn": {
49
+ "@parse/node-apn": {
50
50
  "optional": false
51
51
  },
52
52
  "express": {
package/readme.md CHANGED
@@ -105,7 +105,7 @@ export default async (token, unchainedAPI: UnchainedCore) => {
105
105
  // upsert object
106
106
 
107
107
  const asURL = async () =>
108
- createJwtNewObjects(issuerId, product._id, token.chainTokenId);
108
+ createJwtNewObjects(issuerId, product._id, token.tokenSerialNumber);
109
109
 
110
110
  return { asURL };
111
111
  };
package/src/express.ts CHANGED
@@ -26,7 +26,7 @@ export default (app: express.Express) => {
26
26
  );
27
27
 
28
28
  app.use(
29
- GOOGLE_WALLET_WEBSERVICE_PATH,
29
+ `${GOOGLE_WALLET_WEBSERVICE_PATH}/download/:tokenId`,
30
30
  express.json({
31
31
  type: 'application/json',
32
32
  }),
package/src/fastify.ts CHANGED
@@ -17,14 +17,14 @@ export default (app: FastifyInstance) => {
17
17
  });
18
18
 
19
19
  app.route({
20
- url: `${GOOGLE_WALLET_WEBSERVICE_PATH}/*`,
21
- method: 'POST',
20
+ url: `${GOOGLE_WALLET_WEBSERVICE_PATH}/download/:tokenId`,
21
+ method: 'GET',
22
22
  handler: googleWalletHandler,
23
23
  });
24
24
 
25
25
  app.route({
26
26
  url: `${UNCHAINED_PDF_PRINT_HANDLER_PATH}/*`,
27
- method: 'POST',
27
+ method: 'GET',
28
28
  handler: printTicketsHandler,
29
29
  });
30
30
  };
package/src/magic-key.ts CHANGED
@@ -20,7 +20,7 @@ const isMagicKeyValidForToken = async (
20
20
  params: { tokenId: string } | null,
21
21
  { modules, getHeader }: Context & TicketingAPI,
22
22
  ) => {
23
- const tokenId = params?.tokenId || (root && 'chainTokenId' in root && root._id) || null;
23
+ const tokenId = params?.tokenId || (root && 'tokenSerialNumber' in root && root._id) || null;
24
24
 
25
25
  const token = await modules.warehousing.findToken({ tokenId });
26
26
  // always return true if tokenId leads to nothing to show potentially allowed actions
@@ -37,7 +37,7 @@ const isMagicKeyValidForToken = async (
37
37
  };
38
38
 
39
39
  export default () => {
40
- roles.allRoles.ALL.allow(roles.actions.viewOrder, isMagicKeyValidForOrder);
41
- roles.allRoles.ALL.allow(roles.actions.viewToken, isMagicKeyValidForToken);
42
- roles.allRoles.ALL.allow(roles.actions.updateToken, isMagicKeyValidForToken);
40
+ roles.allRoles?.ALL?.allow(roles.actions.viewOrder, isMagicKeyValidForOrder);
41
+ roles.allRoles?.ALL?.allow(roles.actions.viewToken, isMagicKeyValidForToken);
42
+ roles.allRoles?.ALL?.allow(roles.actions.updateToken, isMagicKeyValidForToken);
43
43
  };
@@ -21,8 +21,7 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
21
21
  const [tokenId] = passFileName.split('.pkpass');
22
22
 
23
23
  if (!tokenId) {
24
- res.writeHead(404);
25
- res.end();
24
+ res.status(404).end();
26
25
  return;
27
26
  }
28
27
 
@@ -31,16 +30,14 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
31
30
  });
32
31
 
33
32
  if (!token) {
34
- res.writeHead(404);
35
- res.end('Token not found');
33
+ res.status(404).send('Token not found');
36
34
  return;
37
35
  }
38
36
 
39
37
  const { hash } = req.query;
40
38
  const correctHash = await modules.warehousing.buildAccessKeyForToken(tokenId);
41
- if (hash !== correctHash) {
42
- res.writeHead(403);
43
- res.end('Token hash invalid for current owner');
39
+ if (!hash || hash !== correctHash) {
40
+ res.status(403).send('Token hash invalid for current owner');
44
41
  return;
45
42
  }
46
43
 
@@ -50,6 +47,16 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
50
47
  const signedUrl = await fileUploadAdapter.createDownloadURL(passFile);
51
48
  const url = signedUrl && (await modules.files.normalizeUrl(signedUrl, {}));
52
49
 
50
+ if (!url) {
51
+ res.status(500);
52
+ res.send({
53
+ success: false,
54
+ message: 'Could not create download URL',
55
+ name: 'URL_SIGNING_FAILED',
56
+ });
57
+ return;
58
+ }
59
+
53
60
  const response = await fetch(url);
54
61
  const data = await response.arrayBuffer();
55
62
  const uint8View = new Uint8Array(data);
@@ -57,13 +64,12 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
57
64
  res.status(200);
58
65
  res.setHeader('Content-Type', 'application/vnd.apple.pkpass');
59
66
  res.setHeader('Content-Disposition', `attachment; filename=${tokenId}.pkpass`);
60
- res.end(uint8View);
67
+ res.send(uint8View);
61
68
  return;
62
69
  } catch (e) {
63
- console.error(e);
70
+ logger.error(e);
64
71
  }
65
- res.writeHead(500);
66
- res.end();
72
+ res.status(500).end();
67
73
  return;
68
74
  }
69
75
 
@@ -80,11 +86,10 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
80
86
  if (
81
87
  !isAuthenticationTokenCorrect(
82
88
  req,
83
- (pass.meta.rawData as any)._id || (pass.meta.rawData as any).tokenId,
89
+ (pass.meta?.rawData as any)?._id || (pass.meta?.rawData as any)?.tokenId,
84
90
  )
85
91
  ) {
86
- res.writeHead(401);
87
- res.end();
92
+ res.status(401).end();
88
93
  return;
89
94
  }
90
95
 
@@ -98,13 +103,11 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
98
103
  );
99
104
 
100
105
  if (!newRegistration) {
101
- res.writeHead(200);
102
- res.end();
106
+ res.status(200).end();
103
107
  return;
104
108
  }
105
109
 
106
- res.writeHead(201);
107
- res.end();
110
+ res.status(201).end();
108
111
  return;
109
112
  }
110
113
  } else if (req.method === 'GET') {
@@ -119,24 +122,14 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
119
122
  deviceLibraryIdentifier,
120
123
  passesUpdatedSince,
121
124
  );
122
- const serialNumbers = passes.map((t) => t.meta.serialNumber);
125
+ const serialNumbers = passes.map((t) => t.meta?.serialNumber).filter(Boolean) as string[];
123
126
 
124
127
  if (serialNumbers?.length) {
125
- res.writeHead(200, {
126
- 'Content-Type': 'application/json',
127
- });
128
- res.write(
129
- JSON.stringify({
130
- serialNumbers,
131
- lastUpdated,
132
- }),
133
- );
134
- res.end();
128
+ res.status(200).send({ serialNumbers, lastUpdated });
135
129
  return;
136
130
  }
137
131
 
138
- res.writeHead(204);
139
- res.end();
132
+ res.status(204).end();
140
133
  return;
141
134
  } else if (req.method === 'DELETE') {
142
135
  // Unregister Device
@@ -148,11 +141,10 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
148
141
  if (
149
142
  !isAuthenticationTokenCorrect(
150
143
  req,
151
- (pass.meta.rawData as any)._id || (pass.meta.rawData as any).tokenId,
144
+ (pass.meta?.rawData as any)?._id || (pass.meta?.rawData as any)?.tokenId,
152
145
  )
153
146
  ) {
154
- res.writeHead(401);
155
- res.end();
147
+ res.status(401).end();
156
148
  return;
157
149
  }
158
150
 
@@ -163,8 +155,7 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
163
155
  );
164
156
 
165
157
  // Unregistered
166
- res.writeHead(200);
167
- res.end();
158
+ res.status(200).end();
168
159
  return;
169
160
  }
170
161
  }
@@ -176,8 +167,7 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
176
167
  logger.info(log);
177
168
  }
178
169
  });
179
- res.writeHead(200);
180
- res.end();
170
+ res.status(200).end();
181
171
  return;
182
172
  } else if (endpoint === 'passes') {
183
173
  if (req.method === 'GET') {
@@ -186,52 +176,62 @@ const appleWalletHandler = async (req: Request & { unchainedContext: TicketingAP
186
176
 
187
177
  const pass = await modules.passes.findAppleWalletPass(passTypeIdentifier, serialNumber);
188
178
 
189
- if (pass) {
190
- if (
191
- !isAuthenticationTokenCorrect(
192
- req,
193
- (pass.meta.rawData as any)._id || (pass.meta.rawData as any).tokenId,
194
- )
195
- ) {
196
- res.writeHead(401);
197
- res.end();
198
- return;
199
- }
179
+ if (!pass) {
180
+ res.status(404).end();
181
+ return;
182
+ }
200
183
 
201
- const { updated, created } = pass;
184
+ if (
185
+ !isAuthenticationTokenCorrect(
186
+ req,
187
+ (pass.meta?.rawData as any)?._id || (pass.meta?.rawData as any)?.tokenId,
188
+ )
189
+ ) {
190
+ res.status(401).end();
191
+ return;
192
+ }
202
193
 
203
- const lastModifiedDate = new Date(updated || created);
204
- lastModifiedDate.setMilliseconds(0);
194
+ const { updated, created } = pass;
205
195
 
206
- const ifModifiedSinceDate = new Date(req.header('if-modified-since'));
207
- ifModifiedSinceDate.setMilliseconds(0);
196
+ const lastModifiedDate = new Date(updated || created);
197
+ lastModifiedDate.setMilliseconds(0);
208
198
 
209
- if (ifModifiedSinceDate.getTime() >= lastModifiedDate.getTime()) {
210
- res.writeHead(304);
211
- res.end();
212
- return;
213
- }
199
+ const ifModifiedSinceDate = new Date(req.header('if-modified-since')!);
200
+ ifModifiedSinceDate.setMilliseconds(0);
214
201
 
215
- const fileUploadAdapter = getFileAdapter();
216
- const signedUrl = await fileUploadAdapter.createDownloadURL(pass);
217
- const url = signedUrl && (await modules.files.normalizeUrl(signedUrl, {}));
202
+ if (ifModifiedSinceDate.getTime() >= lastModifiedDate.getTime()) {
203
+ res.status(304).end();
204
+ return;
205
+ }
218
206
 
219
- const result = await fetch(url);
220
- const data = await result.arrayBuffer();
221
- const uint8View = new Uint8Array(data);
207
+ const fileUploadAdapter = getFileAdapter();
208
+ const signedUrl = await fileUploadAdapter.createDownloadURL(pass);
209
+ const url = signedUrl && (await modules.files.normalizeUrl(signedUrl, {}));
222
210
 
223
- res.writeHead(200, {
224
- 'Content-Type': 'application/vnd.apple.pkpass',
225
- 'Last-Modified': lastModifiedDate.toUTCString(),
211
+ if (!url) {
212
+ res.status(500);
213
+ res.send({
214
+ success: false,
215
+ message: 'Could not create download URL',
216
+ name: 'URL_SIGNING_FAILED',
226
217
  });
227
- res.end(uint8View);
228
218
  return;
229
219
  }
220
+
221
+ const result = await fetch(url);
222
+ const data = await result.arrayBuffer();
223
+ const uint8View = new Uint8Array(data);
224
+
225
+ res.writeHead(200, {
226
+ 'Content-Type': 'application/vnd.apple.pkpass',
227
+ 'Last-Modified': lastModifiedDate.toUTCString(),
228
+ });
229
+ res.send(uint8View);
230
+ return;
230
231
  }
231
232
  }
232
233
 
233
- res.writeHead(404);
234
- res.end();
234
+ res.status(404).end();
235
235
  };
236
236
 
237
237
  export default appleWalletHandler;