@unchainedshop/api 4.2.2 → 4.3.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/chatHandler.d.ts.map +1 -1
- package/lib/express/chatHandler.js +1 -3
- package/lib/express/chatHandler.js.map +1 -1
- package/lib/express/index.d.ts.map +1 -1
- package/lib/express/index.js +1 -1
- package/lib/express/index.js.map +1 -1
- package/lib/fastify/chatHandler.d.ts.map +1 -1
- package/lib/fastify/chatHandler.js +1 -3
- package/lib/fastify/chatHandler.js.map +1 -1
- package/lib/fastify/ercMetadataHandler.d.ts.map +1 -1
- package/lib/fastify/ercMetadataHandler.js +7 -4
- package/lib/fastify/ercMetadataHandler.js.map +1 -1
- package/lib/fastify/index.js +1 -1
- package/lib/fastify/index.js.map +1 -1
- package/lib/loaders/index.d.ts +27 -1
- package/lib/loaders/index.d.ts.map +1 -1
- package/lib/loaders/index.js +10 -2
- package/lib/loaders/index.js.map +1 -1
- package/lib/loaders/productBySKULoader.d.ts +10 -0
- package/lib/loaders/productBySKULoader.d.ts.map +1 -0
- package/lib/loaders/productBySKULoader.js +16 -0
- package/lib/loaders/productBySKULoader.js.map +1 -0
- package/lib/loaders/productVariationByKeyLoader.d.ts +12 -0
- package/lib/loaders/productVariationByKeyLoader.d.ts.map +1 -0
- package/lib/loaders/productVariationByKeyLoader.js +14 -0
- package/lib/loaders/productVariationByKeyLoader.js.map +1 -0
- package/lib/loaders/productVariationLoader.d.ts +10 -0
- package/lib/loaders/productVariationLoader.d.ts.map +1 -0
- package/lib/loaders/productVariationLoader.js +13 -0
- package/lib/loaders/productVariationLoader.js.map +1 -0
- package/lib/loaders/productVariationTextLoader.d.ts +14 -0
- package/lib/loaders/productVariationTextLoader.d.ts.map +1 -0
- package/lib/loaders/productVariationTextLoader.js +24 -0
- package/lib/loaders/productVariationTextLoader.js.map +1 -0
- package/lib/loaders/quotationLoader.d.ts +10 -0
- package/lib/loaders/quotationLoader.d.ts.map +1 -0
- package/lib/loaders/quotationLoader.js +13 -0
- package/lib/loaders/quotationLoader.js.map +1 -0
- package/lib/mcp/resources/localization.d.ts.map +1 -1
- package/lib/mcp/resources/localization.js +0 -15
- package/lib/mcp/resources/localization.js.map +1 -1
- package/lib/mongo-store.d.ts +94 -0
- package/lib/mongo-store.d.ts.map +1 -0
- package/lib/mongo-store.js +368 -0
- package/lib/mongo-store.js.map +1 -0
- package/lib/resolvers/type/delivery-provider-interface.d.ts +18 -0
- package/lib/resolvers/type/delivery-provider-interface.d.ts.map +1 -0
- package/lib/resolvers/type/delivery-provider-interface.js +48 -0
- package/lib/resolvers/type/delivery-provider-interface.js.map +1 -0
- package/lib/resolvers/type/delivery-provider-pickup-types.d.ts +20 -0
- package/lib/resolvers/type/delivery-provider-pickup-types.d.ts.map +1 -0
- package/lib/resolvers/type/delivery-provider-pickup-types.js +10 -0
- package/lib/resolvers/type/delivery-provider-pickup-types.js.map +1 -0
- package/lib/resolvers/type/delivery-provider-shipping-types.d.ts +17 -0
- package/lib/resolvers/type/delivery-provider-shipping-types.d.ts.map +1 -0
- package/lib/resolvers/type/delivery-provider-shipping-types.js +5 -0
- package/lib/resolvers/type/delivery-provider-shipping-types.js.map +1 -0
- package/lib/resolvers/type/delivery-provider-types.d.ts +7 -11
- package/lib/resolvers/type/delivery-provider-types.d.ts.map +1 -1
- package/lib/resolvers/type/delivery-provider-types.js +17 -43
- package/lib/resolvers/type/delivery-provider-types.js.map +1 -1
- package/lib/resolvers/type/index.d.ts +40 -11
- package/lib/resolvers/type/index.d.ts.map +1 -1
- package/lib/resolvers/type/index.js +4 -0
- package/lib/resolvers/type/index.js.map +1 -1
- package/lib/resolvers/type/order/order-item-types.d.ts +1 -1
- package/lib/resolvers/type/order/order-item-types.d.ts.map +1 -1
- package/lib/resolvers/type/order/order-item-types.js +2 -3
- package/lib/resolvers/type/order/order-item-types.js.map +1 -1
- package/lib/resolvers/type/price-types.d.ts.map +1 -1
- package/lib/resolvers/type/price-types.js +19 -5
- package/lib/resolvers/type/price-types.js.map +1 -1
- package/lib/resolvers/type/product/product-variation-assignment-vector.d.ts.map +1 -1
- package/lib/resolvers/type/product/product-variation-assignment-vector.js +4 -6
- package/lib/resolvers/type/product/product-variation-assignment-vector.js.map +1 -1
- package/lib/resolvers/type/product/product-variation-option-types.d.ts.map +1 -1
- package/lib/resolvers/type/product/product-variation-option-types.js +2 -3
- package/lib/resolvers/type/product/product-variation-option-types.js.map +1 -1
- package/lib/resolvers/type/product/product-variation-types.d.ts.map +1 -1
- package/lib/resolvers/type/product/product-variation-types.js +2 -3
- package/lib/resolvers/type/product/product-variation-types.js.map +1 -1
- package/lib/schema/types/delivery.d.ts.map +1 -1
- package/lib/schema/types/delivery.js +38 -1
- package/lib/schema/types/delivery.js.map +1 -1
- package/lib/schema/types/order/delivery.d.ts.map +1 -1
- package/lib/schema/types/order/delivery.js +3 -2
- package/lib/schema/types/order/delivery.js.map +1 -1
- package/lib/schema/types/order/pick-up-location.d.ts.map +1 -1
- package/lib/schema/types/order/pick-up-location.js +1 -2
- package/lib/schema/types/order/pick-up-location.js.map +1 -1
- package/package.json +11 -14
- package/src/express/chatHandler.ts +3 -8
- package/src/express/index.ts +3 -2
- package/src/fastify/chatHandler.ts +3 -8
- package/src/fastify/ercMetadataHandler.ts +9 -4
- package/src/fastify/index.ts +1 -1
- package/src/loaders/index.ts +11 -2
- package/src/loaders/productVariationByKeyLoader.ts +20 -0
- package/src/loaders/productVariationLoader.ts +19 -0
- package/src/loaders/productVariationTextLoader.ts +37 -0
- package/src/loaders/quotationLoader.ts +19 -0
- package/src/mcp/resources/localization.ts +0 -15
- package/src/mongo-store.ts +500 -0
- package/src/resolvers/type/delivery-provider-interface.ts +55 -0
- package/src/resolvers/type/delivery-provider-pickup-types.ts +12 -0
- package/src/resolvers/type/delivery-provider-shipping-types.ts +5 -0
- package/src/resolvers/type/delivery-provider-types.ts +22 -68
- package/src/resolvers/type/index.ts +4 -0
- package/src/resolvers/type/order/order-item-types.ts +2 -3
- package/src/resolvers/type/price-types.ts +19 -5
- package/src/resolvers/type/product/product-variation-assignment-vector.ts +4 -6
- package/src/resolvers/type/product/product-variation-option-types.ts +2 -3
- package/src/resolvers/type/product/product-variation-types.ts +2 -3
- package/src/schema/types/delivery.ts +38 -1
- package/src/schema/types/order/delivery.ts +3 -2
- package/src/schema/types/order/pick-up-location.ts +1 -2
- /package/src/loaders/{productLoaderBySKU.ts → productBySKULoader.ts} +0 -0
|
@@ -2,11 +2,6 @@ export const registerLocalizationResources = (server, context) => {
|
|
|
2
2
|
server.resource('shop-languages', 'unchained://shop/languages', {
|
|
3
3
|
description: 'Available languages configured in the shop. Use these ISO codes when creating or updating products, filters, and assortments. Includes valid language-country dialect combinations.',
|
|
4
4
|
mimeType: 'application/json',
|
|
5
|
-
annotations: {
|
|
6
|
-
audience: ['assistant'],
|
|
7
|
-
priority: 1,
|
|
8
|
-
lastModified: '2025-09-30T15:00:58Z',
|
|
9
|
-
},
|
|
10
5
|
}, async () => {
|
|
11
6
|
const [languages, countries] = await Promise.all([
|
|
12
7
|
context.modules.languages.findLanguages({ includeInactive: false }),
|
|
@@ -37,11 +32,6 @@ export const registerLocalizationResources = (server, context) => {
|
|
|
37
32
|
server.resource('shop-currencies', 'unchained://shop/currencies', {
|
|
38
33
|
description: 'Available currencies configured in the shop. Check decimal points for price conversions. All prices are stored as integers.',
|
|
39
34
|
mimeType: 'application/json',
|
|
40
|
-
annotations: {
|
|
41
|
-
audience: ['assistant'],
|
|
42
|
-
priority: 1,
|
|
43
|
-
lastModified: '2025-09-30T15:00:58Z',
|
|
44
|
-
},
|
|
45
35
|
}, async () => {
|
|
46
36
|
const currencies = await context.modules.currencies.findCurrencies({ includeInactive: false });
|
|
47
37
|
return {
|
|
@@ -65,11 +55,6 @@ export const registerLocalizationResources = (server, context) => {
|
|
|
65
55
|
server.resource('shop-countries', 'unchained://shop/countries', {
|
|
66
56
|
description: 'Available countries configured in the shop. Use these ISO codes for geographic operations.',
|
|
67
57
|
mimeType: 'application/json',
|
|
68
|
-
annotations: {
|
|
69
|
-
audience: ['assistant'],
|
|
70
|
-
priority: 1,
|
|
71
|
-
lastModified: '2025-09-30T15:00:58Z',
|
|
72
|
-
},
|
|
73
58
|
}, async () => {
|
|
74
59
|
const countries = await context.modules.countries.findCountries({ includeInactive: false });
|
|
75
60
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localization.js","sourceRoot":"","sources":["../../../src/mcp/resources/localization.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,MAAiB,EAAE,OAAgB,EAAE,EAAE;IACnF,MAAM,CAAC,QAAQ,CACb,gBAAgB,EAChB,4BAA4B,EAC5B;QACE,WAAW,EACT,qLAAqL;QACvL,QAAQ,EAAE,kBAAkB;
|
|
1
|
+
{"version":3,"file":"localization.js","sourceRoot":"","sources":["../../../src/mcp/resources/localization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as session from 'express-session';
|
|
2
|
+
import { Collection, MongoClient, MongoClientOptions, WriteConcernSettings } from 'mongodb';
|
|
3
|
+
export interface CryptoOptions {
|
|
4
|
+
secret: false | string;
|
|
5
|
+
algorithm?: string;
|
|
6
|
+
hashing?: string;
|
|
7
|
+
encodeas?: string;
|
|
8
|
+
key_size?: number;
|
|
9
|
+
iv_size?: number;
|
|
10
|
+
at_size?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ConnectMongoOptions {
|
|
13
|
+
mongoUrl?: string;
|
|
14
|
+
clientPromise?: Promise<MongoClient>;
|
|
15
|
+
client?: MongoClient;
|
|
16
|
+
collectionName?: string;
|
|
17
|
+
mongoOptions?: MongoClientOptions;
|
|
18
|
+
dbName?: string;
|
|
19
|
+
ttl?: number;
|
|
20
|
+
touchAfter?: number;
|
|
21
|
+
stringify?: boolean;
|
|
22
|
+
createAutoRemoveIdx?: boolean;
|
|
23
|
+
autoRemove?: 'native' | 'interval' | 'disabled';
|
|
24
|
+
autoRemoveInterval?: number;
|
|
25
|
+
serialize?: (a: any) => any;
|
|
26
|
+
unserialize?: (a: any) => any;
|
|
27
|
+
writeOperationOptions?: WriteConcernSettings;
|
|
28
|
+
transformId?: (a: any) => any;
|
|
29
|
+
}
|
|
30
|
+
interface InternalSessionType {
|
|
31
|
+
_id: string;
|
|
32
|
+
session: any;
|
|
33
|
+
expires?: Date;
|
|
34
|
+
lastModified?: Date;
|
|
35
|
+
}
|
|
36
|
+
export default class MongoStore extends session.Store {
|
|
37
|
+
private clientP;
|
|
38
|
+
private crypto;
|
|
39
|
+
private timer?;
|
|
40
|
+
collectionP: Promise<Collection<InternalSessionType>>;
|
|
41
|
+
private options;
|
|
42
|
+
private transformFunctions;
|
|
43
|
+
constructor({ collectionName, ttl, mongoOptions, autoRemove, autoRemoveInterval, touchAfter, stringify, ...required }: ConnectMongoOptions);
|
|
44
|
+
static create(options: ConnectMongoOptions): MongoStore;
|
|
45
|
+
private setAutoRemove;
|
|
46
|
+
private computeStorageId;
|
|
47
|
+
/**
|
|
48
|
+
* promisify and bind the `this.crypto.get` function.
|
|
49
|
+
* Please check !!this.crypto === true before using this getter!
|
|
50
|
+
*/
|
|
51
|
+
private get cryptoGet();
|
|
52
|
+
/**
|
|
53
|
+
* Decrypt given session data
|
|
54
|
+
* @param session session data to be decrypt. Mutate the input session.
|
|
55
|
+
*/
|
|
56
|
+
private decryptSession;
|
|
57
|
+
/**
|
|
58
|
+
* Get a session from the store given a session ID (sid)
|
|
59
|
+
* @param sid session ID
|
|
60
|
+
*/
|
|
61
|
+
get(sid: string, callback: (err: any, session?: session.SessionData | null) => void): void;
|
|
62
|
+
/**
|
|
63
|
+
* Upsert a session into the store given a session ID (sid) and session (session) object.
|
|
64
|
+
* @param sid session ID
|
|
65
|
+
* @param session session object
|
|
66
|
+
*/
|
|
67
|
+
set(sid: string, session: session.SessionData, callback?: (err: any) => void): void;
|
|
68
|
+
touch(sid: string, session: session.SessionData & {
|
|
69
|
+
lastModified?: Date;
|
|
70
|
+
}, callback?: (err: any) => void): void;
|
|
71
|
+
/**
|
|
72
|
+
* Get all sessions in the store as an array
|
|
73
|
+
*/
|
|
74
|
+
all(callback: (err: any, obj?: session.SessionData[] | Record<string, session.SessionData> | null) => void): void;
|
|
75
|
+
/**
|
|
76
|
+
* Destroy/delete a session from the store given a session ID (sid)
|
|
77
|
+
* @param sid session ID
|
|
78
|
+
*/
|
|
79
|
+
destroy(sid: string, callback?: (err: any) => void): void;
|
|
80
|
+
/**
|
|
81
|
+
* Get the count of all sessions in the store
|
|
82
|
+
*/
|
|
83
|
+
length(callback: (err: any, length: number) => void): void;
|
|
84
|
+
/**
|
|
85
|
+
* Delete all sessions from the store.
|
|
86
|
+
*/
|
|
87
|
+
clear(callback?: (err: any) => void): void;
|
|
88
|
+
/**
|
|
89
|
+
* Close database connection
|
|
90
|
+
*/
|
|
91
|
+
close(): Promise<void>;
|
|
92
|
+
}
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=mongo-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongo-store.d.ts","sourceRoot":"","sources":["../src/mongo-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License
|
|
3
|
+
Fork of https://github.com/jdesboeufs/connect-mongo#readme Connect Mongo
|
|
4
|
+
Thanks to Casey Banner, Jerome Desboeufs, MC Or
|
|
5
|
+
*/
|
|
6
|
+
import { assert } from 'node:console';
|
|
7
|
+
import util from 'node:util';
|
|
8
|
+
import * as session from 'express-session';
|
|
9
|
+
import { MongoClient } from 'mongodb';
|
|
10
|
+
import { createLogger } from '@unchainedshop/logger';
|
|
11
|
+
const logger = createLogger('unchained:api');
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
13
|
+
const noop = () => { };
|
|
14
|
+
const unit = (a) => a;
|
|
15
|
+
function defaultSerializeFunction(session) {
|
|
16
|
+
// Copy each property of the session to a new object
|
|
17
|
+
const obj = {};
|
|
18
|
+
let prop;
|
|
19
|
+
for (prop in session) {
|
|
20
|
+
if (prop === 'cookie') {
|
|
21
|
+
// Convert the cookie instance to an object, if possible
|
|
22
|
+
// This gets rid of the duplicate object under session.cookie.data property
|
|
23
|
+
// @ts-expect-error FIXME:
|
|
24
|
+
obj.cookie = session.cookie.toJSON ? session.cookie.toJSON() : session.cookie;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
obj[prop] = session[prop];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return obj;
|
|
31
|
+
}
|
|
32
|
+
function computeTransformFunctions(options) {
|
|
33
|
+
if (options.serialize || options.unserialize) {
|
|
34
|
+
return {
|
|
35
|
+
serialize: options.serialize || defaultSerializeFunction,
|
|
36
|
+
unserialize: options.unserialize || unit,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (options.stringify === false) {
|
|
40
|
+
return {
|
|
41
|
+
serialize: defaultSerializeFunction,
|
|
42
|
+
unserialize: unit,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Default case
|
|
46
|
+
return {
|
|
47
|
+
serialize: JSON.stringify,
|
|
48
|
+
unserialize: JSON.parse,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export default class MongoStore extends session.Store {
|
|
52
|
+
clientP;
|
|
53
|
+
crypto = null;
|
|
54
|
+
timer;
|
|
55
|
+
collectionP;
|
|
56
|
+
options;
|
|
57
|
+
// FIXME: remvoe any
|
|
58
|
+
transformFunctions;
|
|
59
|
+
constructor({ collectionName = 'sessions', ttl = 1209600, mongoOptions = {}, autoRemove = 'native', autoRemoveInterval = 10, touchAfter = 0, stringify = true, ...required }) {
|
|
60
|
+
super();
|
|
61
|
+
logger.debug('create MongoStore instance');
|
|
62
|
+
const options = {
|
|
63
|
+
collectionName,
|
|
64
|
+
ttl,
|
|
65
|
+
mongoOptions,
|
|
66
|
+
autoRemove,
|
|
67
|
+
autoRemoveInterval,
|
|
68
|
+
touchAfter,
|
|
69
|
+
stringify,
|
|
70
|
+
crypto: {
|
|
71
|
+
secret: false,
|
|
72
|
+
algorithm: 'aes-256-gcm',
|
|
73
|
+
hashing: 'sha512',
|
|
74
|
+
encodeas: 'base64',
|
|
75
|
+
key_size: 32,
|
|
76
|
+
iv_size: 16,
|
|
77
|
+
at_size: 16,
|
|
78
|
+
},
|
|
79
|
+
...required,
|
|
80
|
+
};
|
|
81
|
+
// Check params
|
|
82
|
+
assert(options.mongoUrl || options.clientPromise || options.client, 'You must provide either mongoUrl|clientPromise|client in options');
|
|
83
|
+
assert(options.createAutoRemoveIdx === null || options.createAutoRemoveIdx === undefined, 'options.createAutoRemoveIdx has been reverted to autoRemove and autoRemoveInterval');
|
|
84
|
+
assert(!options.autoRemoveInterval || options.autoRemoveInterval <= 71582,
|
|
85
|
+
/* (Math.pow(2, 32) - 1) / (1000 * 60) */ 'autoRemoveInterval is too large. options.autoRemoveInterval is in minutes but not seconds nor mills');
|
|
86
|
+
this.transformFunctions = computeTransformFunctions(options);
|
|
87
|
+
let _clientP;
|
|
88
|
+
if (options.mongoUrl) {
|
|
89
|
+
_clientP = MongoClient.connect(options.mongoUrl, options.mongoOptions);
|
|
90
|
+
}
|
|
91
|
+
else if (options.clientPromise) {
|
|
92
|
+
_clientP = options.clientPromise;
|
|
93
|
+
}
|
|
94
|
+
else if (options.client) {
|
|
95
|
+
_clientP = Promise.resolve(options.client);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
throw new Error('Cannot init client. Please provide correct options');
|
|
99
|
+
}
|
|
100
|
+
assert(!!_clientP, 'Client is null|undefined');
|
|
101
|
+
this.clientP = _clientP;
|
|
102
|
+
this.options = options;
|
|
103
|
+
this.collectionP = _clientP.then(async (con) => {
|
|
104
|
+
const collection = con.db(options.dbName).collection(options.collectionName);
|
|
105
|
+
await this.setAutoRemove(collection);
|
|
106
|
+
return collection;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
static create(options) {
|
|
110
|
+
return new MongoStore(options);
|
|
111
|
+
}
|
|
112
|
+
setAutoRemove(collection) {
|
|
113
|
+
const removeQuery = () => ({
|
|
114
|
+
expires: {
|
|
115
|
+
$lt: new Date(),
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
switch (this.options.autoRemove) {
|
|
119
|
+
case 'native':
|
|
120
|
+
logger.debug('Creating MongoDB TTL index');
|
|
121
|
+
return collection.createIndex({ expires: 1 }, {
|
|
122
|
+
background: true,
|
|
123
|
+
expireAfterSeconds: 0,
|
|
124
|
+
});
|
|
125
|
+
case 'interval':
|
|
126
|
+
logger.debug('create Timer to remove expired sessions');
|
|
127
|
+
this.timer = setInterval(() => collection.deleteMany(removeQuery(), {
|
|
128
|
+
writeConcern: {
|
|
129
|
+
w: 0,
|
|
130
|
+
j: false,
|
|
131
|
+
},
|
|
132
|
+
}), this.options.autoRemoveInterval * 1000 * 60);
|
|
133
|
+
this.timer.unref();
|
|
134
|
+
return Promise.resolve();
|
|
135
|
+
case 'disabled':
|
|
136
|
+
default:
|
|
137
|
+
return Promise.resolve();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
computeStorageId(sessionId) {
|
|
141
|
+
if (this.options.transformId && typeof this.options.transformId === 'function') {
|
|
142
|
+
return this.options.transformId(sessionId);
|
|
143
|
+
}
|
|
144
|
+
return sessionId;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* promisify and bind the `this.crypto.get` function.
|
|
148
|
+
* Please check !!this.crypto === true before using this getter!
|
|
149
|
+
*/
|
|
150
|
+
get cryptoGet() {
|
|
151
|
+
if (!this.crypto) {
|
|
152
|
+
throw new Error('Check this.crypto before calling this.cryptoGet!');
|
|
153
|
+
}
|
|
154
|
+
return util.promisify(this.crypto.get).bind(this.crypto);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Decrypt given session data
|
|
158
|
+
* @param session session data to be decrypt. Mutate the input session.
|
|
159
|
+
*/
|
|
160
|
+
async decryptSession(session) {
|
|
161
|
+
if (this.crypto && session) {
|
|
162
|
+
const plaintext = await this.cryptoGet(this.options.crypto.secret, session.session).catch((err) => {
|
|
163
|
+
throw new Error(err);
|
|
164
|
+
});
|
|
165
|
+
session.session = JSON.parse(plaintext);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get a session from the store given a session ID (sid)
|
|
170
|
+
* @param sid session ID
|
|
171
|
+
*/
|
|
172
|
+
get(sid, callback) {
|
|
173
|
+
(async () => {
|
|
174
|
+
try {
|
|
175
|
+
logger.debug(`MongoStore#get=${sid}`);
|
|
176
|
+
const collection = await this.collectionP;
|
|
177
|
+
const session = await collection.findOne({
|
|
178
|
+
_id: this.computeStorageId(sid),
|
|
179
|
+
$or: [{ expires: { $exists: false } }, { expires: { $gt: new Date() } }],
|
|
180
|
+
});
|
|
181
|
+
if (this.crypto && session) {
|
|
182
|
+
await this.decryptSession(session).catch((err) => callback(err));
|
|
183
|
+
}
|
|
184
|
+
const s = session && this.transformFunctions.unserialize(session.session);
|
|
185
|
+
if (this.options.touchAfter > 0 && session?.lastModified) {
|
|
186
|
+
s.lastModified = session.lastModified;
|
|
187
|
+
}
|
|
188
|
+
this.emit('get', sid);
|
|
189
|
+
callback(null, s === undefined ? null : s);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
callback(error);
|
|
193
|
+
}
|
|
194
|
+
})();
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Upsert a session into the store given a session ID (sid) and session (session) object.
|
|
198
|
+
* @param sid session ID
|
|
199
|
+
* @param session session object
|
|
200
|
+
*/
|
|
201
|
+
set(sid, session, callback = noop) {
|
|
202
|
+
(async () => {
|
|
203
|
+
try {
|
|
204
|
+
logger.debug(`MongoStore#set=${sid}`);
|
|
205
|
+
// Removing the lastModified prop from the session object before update
|
|
206
|
+
// @ts-expect-error Session not typed
|
|
207
|
+
if (this.options.touchAfter > 0 && session?.lastModified) {
|
|
208
|
+
// @ts-expect-error Session not typed
|
|
209
|
+
delete session.lastModified;
|
|
210
|
+
}
|
|
211
|
+
const s = {
|
|
212
|
+
_id: this.computeStorageId(sid),
|
|
213
|
+
session: this.transformFunctions.serialize(session),
|
|
214
|
+
};
|
|
215
|
+
// Expire handling
|
|
216
|
+
if (session?.cookie?.expires) {
|
|
217
|
+
s.expires = new Date(session.cookie.expires);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
// If there's no expiration date specified, it is
|
|
221
|
+
// browser-session cookie or there is no cookie at all,
|
|
222
|
+
// as per the connect docs.
|
|
223
|
+
//
|
|
224
|
+
// So we set the expiration to two-weeks from now
|
|
225
|
+
// - as is common practice in the industry (e.g Django) -
|
|
226
|
+
// or the default specified in the options.
|
|
227
|
+
s.expires = new Date(Date.now() + this.options.ttl * 1000);
|
|
228
|
+
}
|
|
229
|
+
// Last modify handling
|
|
230
|
+
if (this.options.touchAfter > 0) {
|
|
231
|
+
s.lastModified = new Date();
|
|
232
|
+
}
|
|
233
|
+
if (this.crypto) {
|
|
234
|
+
const cryptoSet = util.promisify(this.crypto.set).bind(this.crypto);
|
|
235
|
+
const data = await cryptoSet(this.options.crypto.secret, s.session).catch((err) => {
|
|
236
|
+
throw new Error(err);
|
|
237
|
+
});
|
|
238
|
+
s.session = data;
|
|
239
|
+
}
|
|
240
|
+
const collection = await this.collectionP;
|
|
241
|
+
const rawResp = await collection.updateOne({ _id: s._id }, { $set: s }, {
|
|
242
|
+
upsert: true,
|
|
243
|
+
writeConcern: this.options.writeOperationOptions,
|
|
244
|
+
});
|
|
245
|
+
if (rawResp.upsertedCount > 0) {
|
|
246
|
+
this.emit('create', sid);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
this.emit('update', sid);
|
|
250
|
+
}
|
|
251
|
+
this.emit('set', sid);
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
return callback(error);
|
|
255
|
+
}
|
|
256
|
+
return callback(null);
|
|
257
|
+
})();
|
|
258
|
+
}
|
|
259
|
+
touch(sid, session, callback = noop) {
|
|
260
|
+
(async () => {
|
|
261
|
+
try {
|
|
262
|
+
logger.debug(`MongoStore#touch=${sid}`);
|
|
263
|
+
const updateFields = {};
|
|
264
|
+
const touchAfter = this.options.touchAfter * 1000;
|
|
265
|
+
const lastModified = session.lastModified ? session.lastModified.getTime() : 0;
|
|
266
|
+
const currentDate = new Date();
|
|
267
|
+
// If the given options has a touchAfter property, check if the
|
|
268
|
+
// current timestamp - lastModified timestamp is bigger than
|
|
269
|
+
// the specified, if it's not, don't touch the session
|
|
270
|
+
if (touchAfter > 0 && lastModified > 0) {
|
|
271
|
+
const timeElapsed = currentDate.getTime() - lastModified;
|
|
272
|
+
if (timeElapsed < touchAfter) {
|
|
273
|
+
logger.debug(`Skip touching session=${sid}`);
|
|
274
|
+
return callback(null);
|
|
275
|
+
}
|
|
276
|
+
updateFields.lastModified = currentDate;
|
|
277
|
+
}
|
|
278
|
+
if (session?.cookie?.expires) {
|
|
279
|
+
updateFields.expires = new Date(session.cookie.expires);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
updateFields.expires = new Date(Date.now() + this.options.ttl * 1000);
|
|
283
|
+
}
|
|
284
|
+
const collection = await this.collectionP;
|
|
285
|
+
const rawResp = await collection.updateOne({ _id: this.computeStorageId(sid) }, { $set: updateFields }, { writeConcern: this.options.writeOperationOptions });
|
|
286
|
+
if (rawResp.matchedCount === 0) {
|
|
287
|
+
return callback(new Error('Unable to find the session to touch'));
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
this.emit('touch', sid, session);
|
|
291
|
+
return callback(null);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
return callback(error);
|
|
296
|
+
}
|
|
297
|
+
})();
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Get all sessions in the store as an array
|
|
301
|
+
*/
|
|
302
|
+
all(callback) {
|
|
303
|
+
(async () => {
|
|
304
|
+
try {
|
|
305
|
+
logger.debug('MongoStore#all()');
|
|
306
|
+
const collection = await this.collectionP;
|
|
307
|
+
const sessions = collection.find({
|
|
308
|
+
$or: [{ expires: { $exists: false } }, { expires: { $gt: new Date() } }],
|
|
309
|
+
});
|
|
310
|
+
const results = [];
|
|
311
|
+
for await (const session of sessions) {
|
|
312
|
+
if (this.crypto && session) {
|
|
313
|
+
await this.decryptSession(session);
|
|
314
|
+
}
|
|
315
|
+
results.push(this.transformFunctions.unserialize(session.session));
|
|
316
|
+
}
|
|
317
|
+
this.emit('all', results);
|
|
318
|
+
callback(null, results);
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
callback(error);
|
|
322
|
+
}
|
|
323
|
+
})();
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Destroy/delete a session from the store given a session ID (sid)
|
|
327
|
+
* @param sid session ID
|
|
328
|
+
*/
|
|
329
|
+
destroy(sid, callback = noop) {
|
|
330
|
+
logger.debug(`MongoStore#destroy=${sid}`);
|
|
331
|
+
this.collectionP
|
|
332
|
+
.then((colleciton) => colleciton.deleteOne({ _id: this.computeStorageId(sid) }, { writeConcern: this.options.writeOperationOptions }))
|
|
333
|
+
.then(() => {
|
|
334
|
+
this.emit('destroy', sid);
|
|
335
|
+
callback(null);
|
|
336
|
+
})
|
|
337
|
+
.catch((err) => callback(err));
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Get the count of all sessions in the store
|
|
341
|
+
*/
|
|
342
|
+
length(callback) {
|
|
343
|
+
logger.debug('MongoStore#length()');
|
|
344
|
+
this.collectionP
|
|
345
|
+
.then((collection) => collection.countDocuments())
|
|
346
|
+
.then((c) => callback(null, c))
|
|
347
|
+
// @ts-expect-error Callback wrong type
|
|
348
|
+
.catch((err) => callback(err));
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Delete all sessions from the store.
|
|
352
|
+
*/
|
|
353
|
+
clear(callback = noop) {
|
|
354
|
+
logger.debug('MongoStore#clear()');
|
|
355
|
+
this.collectionP
|
|
356
|
+
.then((collection) => collection.drop())
|
|
357
|
+
.then(() => callback(null))
|
|
358
|
+
.catch((err) => callback(err));
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Close database connection
|
|
362
|
+
*/
|
|
363
|
+
close() {
|
|
364
|
+
logger.debug('MongoStore#close()');
|
|
365
|
+
return this.clientP.then((c) => c.close());
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=mongo-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongo-store.js","sourceRoot":"","sources":["../src/mongo-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Context } from '../../context.js';
|
|
2
|
+
export declare const DeliveryProviderInterface: {
|
|
3
|
+
isActive(deliveryProvider: any, _: any, context: Context): Promise<boolean>;
|
|
4
|
+
configurationError(deliveryProvider: any, _: any, context: Context): Promise<import("@unchainedshop/core").DeliveryError | null>;
|
|
5
|
+
interface(deliveryProvider: any): {
|
|
6
|
+
_id: string;
|
|
7
|
+
label: string;
|
|
8
|
+
version: string;
|
|
9
|
+
} | null;
|
|
10
|
+
simulatedPrice(deliveryProvider: any, args: any, context: Context): Promise<{
|
|
11
|
+
amount: number;
|
|
12
|
+
currencyCode: string;
|
|
13
|
+
countryCode: string;
|
|
14
|
+
isTaxable: boolean;
|
|
15
|
+
isNetPrice: any;
|
|
16
|
+
} | null>;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=delivery-provider-interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-provider-interface.d.ts","sourceRoot":"","sources":["../../../src/resolvers/type/delivery-provider-interface.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,eAAO,MAAM,yBAAyB;qDACS,OAAO;+DAKG,OAAO;;;;;;8DAeR,OAAO;;;;;;;CA8B9D,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { DeliveryDirector, DeliveryPricingDirector } from '@unchainedshop/core';
|
|
2
|
+
export const DeliveryProviderInterface = {
|
|
3
|
+
async isActive(deliveryProvider, _, context) {
|
|
4
|
+
const director = await DeliveryDirector.actions(deliveryProvider, {}, context);
|
|
5
|
+
return Boolean(director.isActive());
|
|
6
|
+
},
|
|
7
|
+
async configurationError(deliveryProvider, _, context) {
|
|
8
|
+
const director = await DeliveryDirector.actions(deliveryProvider, {}, context);
|
|
9
|
+
return director.configurationError();
|
|
10
|
+
},
|
|
11
|
+
interface(deliveryProvider) {
|
|
12
|
+
const Adapter = DeliveryDirector.getAdapter(deliveryProvider.adapterKey);
|
|
13
|
+
if (!Adapter)
|
|
14
|
+
return null;
|
|
15
|
+
return {
|
|
16
|
+
_id: Adapter.key,
|
|
17
|
+
label: Adapter.label,
|
|
18
|
+
version: Adapter.version,
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
async simulatedPrice(deliveryProvider, args, context) {
|
|
22
|
+
const { loaders, countryCode, user } = context;
|
|
23
|
+
const { currencyCode: forcedCurrencyCode, orderId, useNetPrice, context: providerContext } = args;
|
|
24
|
+
const order = await loaders.orderLoader.load({ orderId });
|
|
25
|
+
const currencyCode = forcedCurrencyCode || order?.currencyCode || context.currencyCode;
|
|
26
|
+
const pricingContext = {
|
|
27
|
+
countryCode,
|
|
28
|
+
currencyCode,
|
|
29
|
+
provider: deliveryProvider,
|
|
30
|
+
order,
|
|
31
|
+
providerContext,
|
|
32
|
+
user: user,
|
|
33
|
+
};
|
|
34
|
+
const calculated = await DeliveryPricingDirector.rebuildCalculation(pricingContext, context);
|
|
35
|
+
if (!calculated?.length)
|
|
36
|
+
return null;
|
|
37
|
+
const pricing = DeliveryPricingDirector.calculationSheet(pricingContext, calculated);
|
|
38
|
+
const orderPrice = pricing.total({ useNetPrice });
|
|
39
|
+
return {
|
|
40
|
+
amount: orderPrice.amount,
|
|
41
|
+
currencyCode: orderPrice.currencyCode,
|
|
42
|
+
countryCode,
|
|
43
|
+
isTaxable: pricing.taxSum() > 0,
|
|
44
|
+
isNetPrice: useNetPrice,
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=delivery-provider-interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-provider-interface.js","sourceRoot":"","sources":["../../../src/resolvers/type/delivery-provider-interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAGhF,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,OAAgB;QAClD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/E,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,CAAC,EAAE,OAAgB;QAC5D,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/E,OAAO,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IACvC,CAAC;IAED,SAAS,CAAC,gBAAgB;QACxB,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAgB;QAC3D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAC/C,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;QAElG,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,kBAAkB,IAAI,KAAK,EAAE,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;QAEvF,MAAM,cAAc,GAAG;YACrB,WAAW;YACX,YAAY;YACZ,QAAQ,EAAE,gBAAgB;YAC1B,KAAK;YACL,eAAe;YACf,IAAI,EAAE,IAAK;SACZ,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC7F,IAAI,CAAC,UAAU,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC;QAErC,MAAM,OAAO,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QACrF,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAElD,OAAO;YACL,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,WAAW;YACX,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;YAC/B,UAAU,EAAE,WAAW;SACxB,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Context } from '../../context.js';
|
|
2
|
+
import { DeliveryProvider } from '@unchainedshop/core-delivery';
|
|
3
|
+
export declare const DeliveryProviderPickUp: {
|
|
4
|
+
pickUpLocations(provider: DeliveryProvider, _: never, context: Context): Promise<import("@unchainedshop/core-delivery").DeliveryLocation[]>;
|
|
5
|
+
isActive(deliveryProvider: any, _: any, context: Context): Promise<boolean>;
|
|
6
|
+
configurationError(deliveryProvider: any, _: any, context: Context): Promise<import("@unchainedshop/core").DeliveryError | null>;
|
|
7
|
+
interface(deliveryProvider: any): {
|
|
8
|
+
_id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
version: string;
|
|
11
|
+
} | null;
|
|
12
|
+
simulatedPrice(deliveryProvider: any, args: any, context: Context): Promise<{
|
|
13
|
+
amount: number;
|
|
14
|
+
currencyCode: string;
|
|
15
|
+
countryCode: string;
|
|
16
|
+
isTaxable: boolean;
|
|
17
|
+
isNetPrice: any;
|
|
18
|
+
} | null>;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=delivery-provider-pickup-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-provider-pickup-types.d.ts","sourceRoot":"","sources":["../../../src/resolvers/type/delivery-provider-pickup-types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,eAAO,MAAM,sBAAsB;8BAED,gBAAgB,KAAK,KAAK,WAAW,OAAO;;;;;;;;;;;;;;;CAI7E,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DeliveryDirector } from '@unchainedshop/core';
|
|
2
|
+
import { DeliveryProviderInterface } from './delivery-provider-interface.js';
|
|
3
|
+
export const DeliveryProviderPickUp = {
|
|
4
|
+
...DeliveryProviderInterface,
|
|
5
|
+
async pickUpLocations(provider, _, context) {
|
|
6
|
+
const director = await DeliveryDirector.actions(provider, {}, context);
|
|
7
|
+
return director.pickUpLocations() || [];
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=delivery-provider-pickup-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-provider-pickup-types.js","sourceRoot":"","sources":["../../../src/resolvers/type/delivery-provider-pickup-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAE7E,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,GAAG,yBAAyB;IAC5B,KAAK,CAAC,eAAe,CAAC,QAA0B,EAAE,CAAQ,EAAE,OAAgB;QAC1E,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACvE,OAAO,QAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;CACF,CAAC"}
|