@unchainedshop/ticketing 2.11.2 → 2.11.4
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 +7 -0
- package/lib/module.d.ts +7 -0
- package/lib/module.js +39 -3
- package/lib/module.js.map +1 -1
- package/lib/services.d.ts +8 -0
- package/lib/services.js +20 -0
- package/lib/services.js.map +1 -0
- package/lib/types.d.ts +2 -0
- package/package.json +2 -7
- package/src/module.ts +57 -6
- package/src/services.ts +27 -0
- package/src/types.ts +2 -0
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 =
|
|
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
|
|
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":"
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TicketingAPI } from './types.js';
|
|
2
|
+
declare const ticketingServices: {
|
|
3
|
+
ticketing: {
|
|
4
|
+
cancelTicketsForProduct: (productId: string, context: TicketingAPI) => Promise<number>;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
export type TicketingServices = typeof ticketingServices;
|
|
8
|
+
export default ticketingServices;
|
package/lib/services.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const ticketingServices = {
|
|
2
|
+
ticketing: {
|
|
3
|
+
cancelTicketsForProduct: async (productId, context) => {
|
|
4
|
+
const tokensToCancel = await context.modules.warehousing.findTokens({
|
|
5
|
+
productId,
|
|
6
|
+
'meta.cancelled': null,
|
|
7
|
+
});
|
|
8
|
+
for (const token of tokensToCancel) {
|
|
9
|
+
await context.modules.warehousing.invalidateToken(token._id);
|
|
10
|
+
await context.modules.passes.cancelTicket(token._id);
|
|
11
|
+
}
|
|
12
|
+
await context.modules.products.update(productId, {
|
|
13
|
+
$set: { 'meta.cancelled': true },
|
|
14
|
+
});
|
|
15
|
+
return tokensToCancel.length;
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
export default ticketingServices;
|
|
20
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG;IACxB,SAAS,EAAE;QACT,uBAAuB,EAAE,KAAK,EAAE,SAAiB,EAAE,OAAqB,EAAmB,EAAE;YAC3F,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC;gBAClE,SAAS;gBACT,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAC;YAEH,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACnC,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE;gBAC/C,IAAI,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;aACjC,CAAC,CAAC;YAEH,OAAO,cAAc,CAAC,MAAM,CAAC;QAC/B,CAAC;KACF;CACF,CAAC;AAIF,eAAe,iBAAiB,CAAC"}
|
package/lib/types.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { UnchainedCore } from '@unchainedshop/types/core.js';
|
|
2
2
|
import type { TicketingModule } from './module.js';
|
|
3
|
+
import { TicketingServices } from './services.js';
|
|
3
4
|
export type TicketingAPI = UnchainedCore & {
|
|
4
5
|
modules: {
|
|
5
6
|
passes: TicketingModule;
|
|
6
7
|
};
|
|
8
|
+
services: TicketingServices;
|
|
7
9
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unchainedshop/ticketing",
|
|
3
|
-
"version": "2.11.
|
|
3
|
+
"version": "2.11.4",
|
|
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 =
|
|
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
|
|
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
|
};
|
package/src/services.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { TicketingAPI } from './types.js';
|
|
2
|
+
|
|
3
|
+
const ticketingServices = {
|
|
4
|
+
ticketing: {
|
|
5
|
+
cancelTicketsForProduct: async (productId: string, context: TicketingAPI): Promise<number> => {
|
|
6
|
+
const tokensToCancel = await context.modules.warehousing.findTokens({
|
|
7
|
+
productId,
|
|
8
|
+
'meta.cancelled': null,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
for (const token of tokensToCancel) {
|
|
12
|
+
await context.modules.warehousing.invalidateToken(token._id);
|
|
13
|
+
await context.modules.passes.cancelTicket(token._id);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
await context.modules.products.update(productId, {
|
|
17
|
+
$set: { 'meta.cancelled': true },
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
return tokensToCancel.length;
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type TicketingServices = typeof ticketingServices;
|
|
26
|
+
|
|
27
|
+
export default ticketingServices;
|
package/src/types.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { UnchainedCore } from '@unchainedshop/types/core.js';
|
|
2
2
|
import type { TicketingModule } from './module.js';
|
|
3
|
+
import { TicketingServices } from './services.js';
|
|
3
4
|
|
|
4
5
|
export type TicketingAPI = UnchainedCore & {
|
|
5
6
|
modules: { passes: TicketingModule };
|
|
7
|
+
services: TicketingServices;
|
|
6
8
|
};
|