@unchainedshop/ticketing 2.11.2 → 2.11.3

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/index.d.ts CHANGED
@@ -22,6 +22,13 @@ export declare const ticketingModules: {
22
22
  passTypeIdentifier?: string;
23
23
  }>;
24
24
  buildMagicKey: (orderId: string) => Promise<string>;
25
+ cancelTicket: (tokenId: string) => Promise<import("mongodb").WithId<import("@unchainedshop/types/warehousing.js").TokenSurrogate>>;
26
+ isTicketCancelled: (token: import("@unchainedshop/types/warehousing.js").TokenSurrogate) => Promise<boolean>;
27
+ getTicketsCreated: ({ productId, }: {
28
+ productId: string;
29
+ }, { skipCancelled }?: {
30
+ skipCancelled?: boolean;
31
+ }) => Promise<number>;
25
32
  }>;
26
33
  };
27
34
  };
package/lib/module.d.ts CHANGED
@@ -21,6 +21,13 @@ declare const ticketingModule: {
21
21
  passTypeIdentifier?: string;
22
22
  }>;
23
23
  buildMagicKey: (orderId: string) => Promise<string>;
24
+ cancelTicket: (tokenId: string) => Promise<import("mongodb").WithId<TokenSurrogate>>;
25
+ isTicketCancelled: (token: TokenSurrogate) => Promise<boolean>;
26
+ getTicketsCreated: ({ productId, }: {
27
+ productId: string;
28
+ }, { skipCancelled }?: {
29
+ skipCancelled?: boolean;
30
+ }) => Promise<number>;
24
31
  }>;
25
32
  };
26
33
  export type TicketingModule = Awaited<ReturnType<(typeof ticketingModule)['configure']>>;
package/lib/module.js CHANGED
@@ -1,12 +1,28 @@
1
- import { MediaObjectsCollection } from '@unchainedshop/core-files/db/MediaObjectsCollection.js';
2
1
  import { createLogger } from '@unchainedshop/logger';
2
+ import { buildDbIndexes } from '@unchainedshop/mongodb';
3
+ import { MediaObjectsCollection } from '@unchainedshop/core-files/db/MediaObjectsCollection.js';
4
+ import { TokenSurrogateCollection } from '@unchainedshop/core-warehousing/db/TokenSurrogateCollection.js';
3
5
  import { RendererTypes, getRenderer } from './template-registry.js';
4
6
  import { buildPassBinary, pushToApplePushNotificationService } from './mobile-tickets/apple-wallet.js';
5
7
  export const APPLE_WALLET_PASSES_FILE_DIRECTORY = 'apple-wallet-passes';
6
8
  const logger = createLogger('unchained:apple-wallet-webservice');
7
9
  const ticketingModule = {
8
10
  configure: async ({ db }) => {
9
- const MediaObjects = (await MediaObjectsCollection(db));
11
+ const MediaObjects = await MediaObjectsCollection(db);
12
+ const TokenSurrogates = await TokenSurrogateCollection(db);
13
+ await buildDbIndexes(TokenSurrogates, [
14
+ { index: { 'meta.cancelled': 1 }, options: { sparse: true } },
15
+ ]);
16
+ await buildDbIndexes(MediaObjects, [
17
+ { index: { path: 1, 'meta.passTypeIdentifier': 1, 'meta.serialNumber': 1 } },
18
+ {
19
+ index: {
20
+ path: 1,
21
+ 'meta.passTypeIdentifier': 1,
22
+ 'meta.registrations.deviceLibraryIdentifier': 1,
23
+ },
24
+ },
25
+ ]);
10
26
  const upsertAppleWalletPass = async (token, unchainedAPI) => {
11
27
  const createAppleWalletPass = getRenderer(RendererTypes.APPLE_WALLET);
12
28
  const pass = await createAppleWalletPass(token, unchainedAPI);
@@ -114,7 +130,7 @@ const ticketingModule = {
114
130
  const allPasses = await MediaObjects.find({
115
131
  path: APPLE_WALLET_PASSES_FILE_DIRECTORY,
116
132
  }).toArray();
117
- const allTokens = await unchainedAPI.modules.warehousing.findTokens({});
133
+ const allTokens = await TokenSurrogates.find({}).toArray();
118
134
  for (const pass of allPasses) {
119
135
  // Check if binary is already invalidated, if so, skip
120
136
  const rawData = pass.meta.rawData;
@@ -133,6 +149,23 @@ const ticketingModule = {
133
149
  const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);
134
150
  return Buffer.from(hashBuffer).toString('hex');
135
151
  };
152
+ const cancelTicket = async (tokenId) => {
153
+ return TokenSurrogates.findOneAndUpdate({ _id: tokenId }, { $set: { 'meta.cancelled': true } }, {
154
+ returnDocument: 'after',
155
+ });
156
+ };
157
+ const isTicketCancelled = async (token) => {
158
+ return Boolean(token.meta?.cancelled);
159
+ };
160
+ const getTicketsCreated = async ({ productId, }, { skipCancelled } = {}) => {
161
+ const selector = {
162
+ productId,
163
+ };
164
+ if (skipCancelled) {
165
+ selector['meta.cancelled'] = null;
166
+ }
167
+ return TokenSurrogates.countDocuments(selector);
168
+ };
136
169
  return {
137
170
  upsertAppleWalletPass,
138
171
  findAppleWalletPass,
@@ -142,6 +175,9 @@ const ticketingModule = {
142
175
  invalidateAppleWalletPasses,
143
176
  upsertGoogleWalletPass,
144
177
  buildMagicKey,
178
+ cancelTicket,
179
+ isTicketCancelled,
180
+ getTicketsCreated,
145
181
  };
146
182
  },
147
183
  };
package/lib/module.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unchainedshop/ticketing",
3
- "version": "2.11.2",
3
+ "version": "2.11.3",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "exports": {
@@ -43,6 +43,7 @@
43
43
  "dependencies": {
44
44
  "@unchainedshop/api": "^2.11.2",
45
45
  "@unchainedshop/core-files": "^2.11.2",
46
+ "@unchainedshop/core-warehousing": "^2.11.2",
46
47
  "@unchainedshop/core-worker": "^2.11.2",
47
48
  "@unchainedshop/events": "^2.11.2",
48
49
  "@unchainedshop/logger": "^2.11.2",
@@ -54,12 +55,6 @@
54
55
  },
55
56
  "devDependencies": {
56
57
  "@types/node": "^20.14.8",
57
- "@unchainedshop/api": "^2.11.2",
58
- "@unchainedshop/core-files": "^2.11.2",
59
- "@unchainedshop/core-worker": "^2.11.2",
60
- "@unchainedshop/events": "^2.11.2",
61
- "@unchainedshop/logger": "^2.11.2",
62
- "@unchainedshop/mongodb": "^2.11.2",
63
58
  "@unchainedshop/types": "^2.11.2"
64
59
  }
65
60
  }
package/src/module.ts CHANGED
@@ -1,11 +1,12 @@
1
- import { ModuleInput, UnchainedCore } from '@unchainedshop/types/core.js';
2
- import { MediaObjectsCollection } from '@unchainedshop/core-files/db/MediaObjectsCollection.js';
3
1
  import { createLogger } from '@unchainedshop/logger';
2
+ import { buildDbIndexes } from '@unchainedshop/mongodb';
3
+ import { MediaObjectsCollection } from '@unchainedshop/core-files/db/MediaObjectsCollection.js';
4
+ import { TokenSurrogateCollection } from '@unchainedshop/core-warehousing/db/TokenSurrogateCollection.js';
5
+ import { ModuleInput, UnchainedCore } from '@unchainedshop/types/core.js';
4
6
  import { TokenSurrogate } from '@unchainedshop/types/warehousing.js';
5
- import { mongodb } from '@unchainedshop/mongodb';
6
7
  import { File } from '@unchainedshop/types/files.js';
7
- import { RendererTypes, getRenderer } from './template-registry.js';
8
8
 
9
+ import { RendererTypes, getRenderer } from './template-registry.js';
9
10
  import { buildPassBinary, pushToApplePushNotificationService } from './mobile-tickets/apple-wallet.js';
10
11
 
11
12
  export const APPLE_WALLET_PASSES_FILE_DIRECTORY = 'apple-wallet-passes';
@@ -14,7 +15,23 @@ const logger = createLogger('unchained:apple-wallet-webservice');
14
15
 
15
16
  const ticketingModule = {
16
17
  configure: async ({ db }: ModuleInput<Record<string, never>>) => {
17
- const MediaObjects = (await MediaObjectsCollection(db)) as mongodb.Collection<File>;
18
+ const MediaObjects = await MediaObjectsCollection(db);
19
+ const TokenSurrogates = await TokenSurrogateCollection(db);
20
+
21
+ await buildDbIndexes(TokenSurrogates as any, [
22
+ { index: { 'meta.cancelled': 1 }, options: { sparse: true } },
23
+ ]);
24
+
25
+ await buildDbIndexes(MediaObjects as any, [
26
+ { index: { path: 1, 'meta.passTypeIdentifier': 1, 'meta.serialNumber': 1 } },
27
+ {
28
+ index: {
29
+ path: 1,
30
+ 'meta.passTypeIdentifier': 1,
31
+ 'meta.registrations.deviceLibraryIdentifier': 1,
32
+ },
33
+ } as any,
34
+ ]);
18
35
 
19
36
  const upsertAppleWalletPass = async (token: TokenSurrogate, unchainedAPI: UnchainedCore) => {
20
37
  const createAppleWalletPass = getRenderer(RendererTypes.APPLE_WALLET);
@@ -158,7 +175,7 @@ const ticketingModule = {
158
175
  const allPasses = await MediaObjects.find({
159
176
  path: APPLE_WALLET_PASSES_FILE_DIRECTORY,
160
177
  }).toArray();
161
- const allTokens = await unchainedAPI.modules.warehousing.findTokens({});
178
+ const allTokens = await TokenSurrogates.find({}).toArray();
162
179
 
163
180
  for (const pass of allPasses) {
164
181
  // Check if binary is already invalidated, if so, skip
@@ -181,6 +198,37 @@ const ticketingModule = {
181
198
  return Buffer.from(hashBuffer).toString('hex');
182
199
  };
183
200
 
201
+ const cancelTicket = async (tokenId: string) => {
202
+ return TokenSurrogates.findOneAndUpdate(
203
+ { _id: tokenId },
204
+ { $set: { 'meta.cancelled': true } },
205
+ {
206
+ returnDocument: 'after',
207
+ },
208
+ );
209
+ };
210
+
211
+ const isTicketCancelled = async (token: TokenSurrogate) => {
212
+ return Boolean(token.meta?.cancelled);
213
+ };
214
+
215
+ const getTicketsCreated = async (
216
+ {
217
+ productId,
218
+ }: {
219
+ productId: string;
220
+ },
221
+ { skipCancelled }: { skipCancelled?: boolean } = {},
222
+ ): Promise<number> => {
223
+ const selector: any = {
224
+ productId,
225
+ };
226
+ if (skipCancelled) {
227
+ selector['meta.cancelled'] = null;
228
+ }
229
+ return TokenSurrogates.countDocuments(selector);
230
+ };
231
+
184
232
  return {
185
233
  upsertAppleWalletPass,
186
234
  findAppleWalletPass,
@@ -190,6 +238,9 @@ const ticketingModule = {
190
238
  invalidateAppleWalletPasses,
191
239
  upsertGoogleWalletPass,
192
240
  buildMagicKey,
241
+ cancelTicket,
242
+ isTicketCancelled,
243
+ getTicketsCreated,
193
244
  };
194
245
  },
195
246
  };