@unchainedshop/ticketing 4.0.0-rc.9 → 4.0.1
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.
- package/lib/express.js +1 -1
- package/lib/express.js.map +1 -1
- package/lib/fastify.js +3 -3
- package/lib/fastify.js.map +1 -1
- package/lib/magic-key.js +4 -4
- package/lib/magic-key.js.map +1 -1
- package/lib/mobile-tickets/apple-handler-express.js +63 -64
- package/lib/mobile-tickets/apple-handler-express.js.map +1 -1
- package/lib/mobile-tickets/apple-handler-fastify.d.ts.map +1 -1
- package/lib/mobile-tickets/apple-handler-fastify.js +93 -42
- package/lib/mobile-tickets/apple-handler-fastify.js.map +1 -1
- package/lib/mobile-tickets/apple-wallet.d.ts +3 -3
- package/lib/mobile-tickets/apple-wallet.d.ts.map +1 -1
- package/lib/mobile-tickets/apple-wallet.js +3 -3
- package/lib/mobile-tickets/apple-wallet.js.map +1 -1
- package/lib/mobile-tickets/apple-webservice.d.ts +7 -0
- package/lib/mobile-tickets/apple-webservice.d.ts.map +1 -0
- package/lib/mobile-tickets/apple-webservice.js +177 -0
- package/lib/mobile-tickets/apple-webservice.js.map +1 -0
- package/lib/mobile-tickets/google-handler-express.d.ts.map +1 -1
- package/lib/mobile-tickets/google-handler-express.js +13 -15
- package/lib/mobile-tickets/google-handler-express.js.map +1 -1
- package/lib/mobile-tickets/google-handler-fastify.d.ts.map +1 -1
- package/lib/mobile-tickets/google-handler-fastify.js +21 -8
- package/lib/mobile-tickets/google-handler-fastify.js.map +1 -1
- package/lib/mobile-tickets/google-webservice.d.ts +7 -0
- package/lib/mobile-tickets/google-webservice.d.ts.map +1 -0
- package/lib/mobile-tickets/google-webservice.js +52 -0
- package/lib/mobile-tickets/google-webservice.js.map +1 -0
- package/lib/module.d.ts +8 -8
- package/lib/module.d.ts.map +1 -1
- package/lib/module.js +6 -3
- package/lib/module.js.map +1 -1
- package/lib/pdf-tickets/print-handler-express.d.ts.map +1 -1
- package/lib/pdf-tickets/print-handler-express.js +4 -3
- package/lib/pdf-tickets/print-handler-express.js.map +1 -1
- package/lib/pdf-tickets/print-handler-fastify.d.ts.map +1 -1
- package/lib/pdf-tickets/print-handler-fastify.js +8 -2
- package/lib/pdf-tickets/print-handler-fastify.js.map +1 -1
- package/lib/pdf-tickets/print-webservice.d.ts +7 -0
- package/lib/pdf-tickets/print-webservice.d.ts.map +1 -0
- package/lib/pdf-tickets/print-webservice.js +31 -0
- package/lib/pdf-tickets/print-webservice.js.map +1 -0
- package/lib/template-registry.d.ts +2 -2
- package/lib/template-registry.d.ts.map +1 -1
- package/package.json +11 -11
- package/readme.md +1 -1
- package/src/express.ts +1 -1
- package/src/fastify.ts +3 -3
- package/src/magic-key.ts +4 -4
- package/src/mobile-tickets/apple-handler-express.ts +71 -71
- package/src/mobile-tickets/apple-handler-fastify.ts +103 -51
- package/src/mobile-tickets/apple-wallet.ts +3 -3
- package/src/mobile-tickets/google-handler-express.ts +14 -15
- package/src/mobile-tickets/google-handler-fastify.ts +23 -11
- package/src/module.ts +7 -4
- package/src/pdf-tickets/print-handler-express.ts +6 -3
- package/src/pdf-tickets/print-handler-fastify.ts +9 -2
- package/src/template-registry.ts +2 -2
- 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;
|
|
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
|
|
9
|
-
asBuffer
|
|
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,
|
|
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.
|
|
3
|
+
"version": "4.0.1",
|
|
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
|
|
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
|
|
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
|
-
"@
|
|
44
|
+
"@parse/node-apn": "^6.5.0",
|
|
45
45
|
"express": "5.x",
|
|
46
46
|
"fastify": ">= 5.2 < 6"
|
|
47
47
|
},
|
|
48
48
|
"peerDependenciesMeta": {
|
|
49
|
-
"@
|
|
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.
|
|
108
|
+
createJwtNewObjects(issuerId, product._id, token.tokenSerialNumber);
|
|
109
109
|
|
|
110
110
|
return { asURL };
|
|
111
111
|
};
|
package/src/express.ts
CHANGED
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: '
|
|
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: '
|
|
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 && '
|
|
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
|
|
41
|
-
roles.allRoles
|
|
42
|
-
roles.allRoles
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
67
|
+
res.send(uint8View);
|
|
61
68
|
return;
|
|
62
69
|
} catch (e) {
|
|
63
|
-
|
|
70
|
+
logger.error(e);
|
|
64
71
|
}
|
|
65
|
-
res.
|
|
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
|
|
89
|
+
(pass.meta?.rawData as any)?._id || (pass.meta?.rawData as any)?.tokenId,
|
|
84
90
|
)
|
|
85
91
|
) {
|
|
86
|
-
res.
|
|
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.
|
|
102
|
-
res.end();
|
|
106
|
+
res.status(200).end();
|
|
103
107
|
return;
|
|
104
108
|
}
|
|
105
109
|
|
|
106
|
-
res.
|
|
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
|
|
125
|
+
const serialNumbers = passes.map((t) => t.meta?.serialNumber).filter(Boolean) as string[];
|
|
123
126
|
|
|
124
127
|
if (serialNumbers?.length) {
|
|
125
|
-
res.
|
|
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.
|
|
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
|
|
144
|
+
(pass.meta?.rawData as any)?._id || (pass.meta?.rawData as any)?.tokenId,
|
|
152
145
|
)
|
|
153
146
|
) {
|
|
154
|
-
res.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
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
|
-
|
|
204
|
-
lastModifiedDate.setMilliseconds(0);
|
|
194
|
+
const { updated, created } = pass;
|
|
205
195
|
|
|
206
|
-
|
|
207
|
-
|
|
196
|
+
const lastModifiedDate = new Date(updated || created);
|
|
197
|
+
lastModifiedDate.setMilliseconds(0);
|
|
208
198
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
res.end();
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
199
|
+
const ifModifiedSinceDate = new Date(req.header('if-modified-since')!);
|
|
200
|
+
ifModifiedSinceDate.setMilliseconds(0);
|
|
214
201
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
202
|
+
if (ifModifiedSinceDate.getTime() >= lastModifiedDate.getTime()) {
|
|
203
|
+
res.status(304).end();
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
218
206
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
207
|
+
const fileUploadAdapter = getFileAdapter();
|
|
208
|
+
const signedUrl = await fileUploadAdapter.createDownloadURL(pass);
|
|
209
|
+
const url = signedUrl && (await modules.files.normalizeUrl(signedUrl, {}));
|
|
222
210
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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.
|
|
234
|
-
res.end();
|
|
234
|
+
res.status(404).end();
|
|
235
235
|
};
|
|
236
236
|
|
|
237
237
|
export default appleWalletHandler;
|