@unchainedshop/plugins 4.1.3 → 4.2.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/delivery/stores.js +9 -5
- package/lib/delivery/stores.js.map +1 -1
- package/lib/files/gridfs/adapter.d.ts.map +1 -1
- package/lib/files/gridfs/adapter.js +12 -8
- package/lib/files/gridfs/adapter.js.map +1 -1
- package/lib/files/gridfs/handler-express.d.ts.map +1 -1
- package/lib/files/gridfs/handler-express.js +6 -5
- package/lib/files/gridfs/handler-express.js.map +1 -1
- package/lib/files/gridfs/handler-fastify.d.ts.map +1 -1
- package/lib/files/gridfs/handler-fastify.js +9 -7
- package/lib/files/gridfs/handler-fastify.js.map +1 -1
- package/lib/payment/cryptopay/de.d.ts +2 -0
- package/lib/payment/cryptopay/de.d.ts.map +1 -0
- package/lib/payment/cryptopay/de.js +10 -0
- package/lib/payment/cryptopay/de.js.map +1 -0
- package/lib/payment/cryptopay/derive-btc-address.test copy.d.ts +2 -0
- package/lib/payment/cryptopay/derive-btc-address.test copy.d.ts.map +1 -0
- package/lib/payment/cryptopay/derive-btc-address.test copy.js +10 -0
- package/lib/payment/cryptopay/derive-btc-address.test copy.js.map +1 -0
- package/lib/payment/payrexx/index.js +1 -1
- package/lib/payment/payrexx/index.js.map +1 -1
- package/lib/presets/base-fastify.js +2 -2
- package/lib/presets/base-fastify.js.map +1 -1
- package/lib/worker/BaseWorker.d.ts +30 -0
- package/lib/worker/BaseWorker.d.ts.map +1 -0
- package/lib/worker/BaseWorker.js +79 -0
- package/lib/worker/BaseWorker.js.map +1 -0
- package/lib/worker/EventListenerWorker.d.ts +6 -0
- package/lib/worker/EventListenerWorker.d.ts.map +1 -0
- package/lib/worker/EventListenerWorker.js +46 -0
- package/lib/worker/EventListenerWorker.js.map +1 -0
- package/lib/worker/FailedRescheduler.d.ts +15 -0
- package/lib/worker/FailedRescheduler.d.ts.map +1 -0
- package/lib/worker/FailedRescheduler.js +45 -0
- package/lib/worker/FailedRescheduler.js.map +1 -0
- package/lib/worker/IntervalWorker.d.ts +10 -0
- package/lib/worker/IntervalWorker.d.ts.map +1 -0
- package/lib/worker/IntervalWorker.js +37 -0
- package/lib/worker/IntervalWorker.js.map +1 -0
- package/lib/worker/email.js +17 -17
- package/lib/worker/email.js.map +1 -1
- package/lib/worker/sms.js +17 -17
- package/lib/worker/sms.js.map +1 -1
- package/package.json +13 -13
- package/src/delivery/stores.ts +8 -4
- package/src/files/gridfs/adapter.ts +13 -8
- package/src/files/gridfs/handler-express.ts +11 -5
- package/src/files/gridfs/handler-fastify.ts +14 -7
- package/src/payment/payrexx/index.ts +1 -1
- package/src/presets/base-fastify.ts +2 -2
- package/src/worker/email.ts +21 -18
- package/lib/accounts/google-oauth.d.ts +0 -4
- package/lib/accounts/google-oauth.d.ts.map +0 -1
- package/lib/accounts/google-oauth.js +0 -145
- package/lib/accounts/google-oauth.js.map +0 -1
- package/lib/accounts/linkedin-oauth.d.ts +0 -4
- package/lib/accounts/linkedin-oauth.d.ts.map +0 -1
- package/lib/accounts/linkedin-oauth.js +0 -82
- package/lib/accounts/linkedin-oauth.js.map +0 -1
- package/lib/files/gridfs/gridfs-adapter.d.ts +0 -3
- package/lib/files/gridfs/gridfs-adapter.d.ts.map +0 -1
- package/lib/files/gridfs/gridfs-adapter.js +0 -97
- package/lib/files/gridfs/gridfs-adapter.js.map +0 -1
- package/lib/files/gridfs/gridfs-webhook.d.ts +0 -11
- package/lib/files/gridfs/gridfs-webhook.d.ts.map +0 -1
- package/lib/files/gridfs/gridfs-webhook.js +0 -84
- package/lib/files/gridfs/gridfs-webhook.js.map +0 -1
- package/lib/files/minio/minio-adapter.d.ts +0 -6
- package/lib/files/minio/minio-adapter.d.ts.map +0 -1
- package/lib/files/minio/minio-adapter.js +0 -181
- package/lib/files/minio/minio-adapter.js.map +0 -1
- package/lib/files/minio/minio-webhook.d.ts +0 -2
- package/lib/files/minio/minio-webhook.d.ts.map +0 -1
- package/lib/files/minio/minio-webhook.js +0 -33
- package/lib/files/minio/minio-webhook.js.map +0 -1
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.d.ts +0 -9
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.d.ts.map +0 -1
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.js +0 -17
- package/lib/payment/apple-iap/module/configureAppleTransactionsModule.js.map +0 -1
- package/lib/payment/cryptopay/middleware.d.ts +0 -2
- package/lib/payment/cryptopay/middleware.d.ts.map +0 -1
- package/lib/payment/cryptopay/middleware.js +0 -75
- package/lib/payment/cryptopay/middleware.js.map +0 -1
- package/lib/payment/cryptopay/module/configureCryptopayModule.d.ts +0 -25
- package/lib/payment/cryptopay/module/configureCryptopayModule.d.ts.map +0 -1
- package/lib/payment/cryptopay/module/configureCryptopayModule.js +0 -75
- package/lib/payment/cryptopay/module/configureCryptopayModule.js.map +0 -1
- package/lib/payment/datatrans-v2/middleware.d.ts +0 -2
- package/lib/payment/datatrans-v2/middleware.d.ts.map +0 -1
- package/lib/payment/datatrans-v2/middleware.js +0 -68
- package/lib/payment/datatrans-v2/middleware.js.map +0 -1
- package/lib/payment/payrexx/middleware.d.ts +0 -2
- package/lib/payment/payrexx/middleware.d.ts.map +0 -1
- package/lib/payment/payrexx/middleware.js +0 -86
- package/lib/payment/payrexx/middleware.js.map +0 -1
- package/lib/payment/postfinance-checkout/middleware.d.ts +0 -2
- package/lib/payment/postfinance-checkout/middleware.d.ts.map +0 -1
- package/lib/payment/postfinance-checkout/middleware.js +0 -38
- package/lib/payment/postfinance-checkout/middleware.js.map +0 -1
- package/lib/payment/saferpay/middleware.d.ts +0 -2
- package/lib/payment/saferpay/middleware.d.ts.map +0 -1
- package/lib/payment/saferpay/middleware.js +0 -57
- package/lib/payment/saferpay/middleware.js.map +0 -1
- package/lib/payment/saferpay/module/configureSaferpayTransactionsModule.d.ts +0 -10
- package/lib/payment/saferpay/module/configureSaferpayTransactionsModule.d.ts.map +0 -1
- package/lib/payment/saferpay/module/configureSaferpayTransactionsModule.js +0 -24
- package/lib/payment/saferpay/module/configureSaferpayTransactionsModule.js.map +0 -1
- package/lib/payment/stripe/middleware.d.ts +0 -6
- package/lib/payment/stripe/middleware.d.ts.map +0 -1
- package/lib/payment/stripe/middleware.js +0 -114
- package/lib/payment/stripe/middleware.js.map +0 -1
- package/lib/plugins-index.d.ts +0 -48
- package/lib/plugins-index.d.ts.map +0 -1
- package/lib/plugins-index.js +0 -107
- package/lib/plugins-index.js.map +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { WorkData } from '@unchainedshop/core-worker';
|
|
2
|
+
export interface FailedReschedulerParams {
|
|
3
|
+
retryInput?: (workData: WorkData, priorInput: Record<string, any>) => Promise<Record<string, any> | null>;
|
|
4
|
+
}
|
|
5
|
+
export type IScheduler<P> = {
|
|
6
|
+
key: string;
|
|
7
|
+
label: string;
|
|
8
|
+
version: string;
|
|
9
|
+
actions: (params: P, unchainedAPI: any) => {
|
|
10
|
+
start: () => void;
|
|
11
|
+
stop: () => void;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export declare const FailedRescheduler: IScheduler<FailedReschedulerParams>;
|
|
15
|
+
//# sourceMappingURL=FailedRescheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FailedRescheduler.d.ts","sourceRoot":"","sources":["../../src/worker/FailedRescheduler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,QAAQ,EAAoB,MAAM,4BAA4B,CAAC;AAE9E,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,CACX,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAEhB,OAAO,EAAE,CACP,MAAM,EAAE,CAAC,EACT,YAAY,KAAA,KACT;QACH,KAAK,EAAE,MAAM,IAAI,CAAC;QAClB,IAAI,EAAE,MAAM,IAAI,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAAU,CAAC,uBAAuB,CAsDjE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { defaultLogger } from '@unchainedshop/logger';
|
|
2
|
+
import { subscribe } from '@unchainedshop/events';
|
|
3
|
+
import { WorkerEventTypes } from '@unchainedshop/core-worker';
|
|
4
|
+
export const FailedRescheduler = {
|
|
5
|
+
key: 'shop.unchained.scheduler.failed',
|
|
6
|
+
label: 'Reschedule failed works',
|
|
7
|
+
version: '1.0.0',
|
|
8
|
+
actions: ({ retryInput }, unchainedAPI) => {
|
|
9
|
+
const handleFinishedWork = async ({ payload: work }) => {
|
|
10
|
+
if (!work.success && work.retries > 0) {
|
|
11
|
+
const now = new Date();
|
|
12
|
+
const workDelayMs = work.scheduled.getTime() - work.created.getTime();
|
|
13
|
+
// In short: Double the delay of the old work or delay for 5 seconds
|
|
14
|
+
const scheduled = workDelayMs > 1000
|
|
15
|
+
? new Date(now.getTime() + workDelayMs * 2)
|
|
16
|
+
: new Date(now.setSeconds(now.getSeconds() + 5));
|
|
17
|
+
defaultLogger.error(`${FailedRescheduler.key} -> Reschedule failed work ${work._id} ${work.type} for ${scheduled.toISOString()} (in ${Math.round(workDelayMs / 1000)}). Remaining retries: ${work.retries}`);
|
|
18
|
+
const workData = {
|
|
19
|
+
type: work.type,
|
|
20
|
+
priority: work.priority,
|
|
21
|
+
originalWorkId: work.originalWorkId || work._id,
|
|
22
|
+
retries: work.retries - 1,
|
|
23
|
+
timeout: work.timeout,
|
|
24
|
+
scheduled,
|
|
25
|
+
};
|
|
26
|
+
if (retryInput) {
|
|
27
|
+
workData.input = await retryInput(workData, work.input);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
workData.input = work.input;
|
|
31
|
+
}
|
|
32
|
+
unchainedAPI.modules.worker.addWork(workData);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
start() {
|
|
37
|
+
subscribe(WorkerEventTypes.FINISHED, handleFinishedWork);
|
|
38
|
+
},
|
|
39
|
+
stop() {
|
|
40
|
+
/* */
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=FailedRescheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FailedRescheduler.js","sourceRoot":"","sources":["../../src/worker/FailedRescheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAkB,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAuB9E,MAAM,CAAC,MAAM,iBAAiB,GAAwC;IACpE,GAAG,EAAE,iCAAiC;IACtC,KAAK,EAAE,yBAAyB;IAChC,OAAO,EAAE,OAAO;IAEhB,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE;QACxC,MAAM,kBAAkB,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAqB,EAAE,EAAE;YACxE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtE,oEAAoE;gBACpE,MAAM,SAAS,GACb,WAAW,GAAG,IAAI;oBAChB,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,GAAG,CAAC,CAAC;oBAC3C,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;gBAErD,aAAa,CAAC,KAAK,CACjB,GAAG,iBAAiB,CAAC,GAAG,8BAA8B,IAAI,CAAC,GAAG,IAC5D,IAAI,CAAC,IACP,QAAQ,SAAS,CAAC,WAAW,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,yBACnE,IAAI,CAAC,OACP,EAAE,CACH,CAAC;gBAEF,MAAM,QAAQ,GAAa;oBACzB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,GAAG;oBAC/C,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC;oBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,SAAS;iBACV,CAAC;gBAEF,IAAI,UAAU,EAAE,CAAC;oBACf,QAAQ,CAAC,KAAK,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1D,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC9B,CAAC;gBAED,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC;QAEF,OAAO;YACL,KAAK;gBACH,SAAS,CAAO,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;YACjE,CAAC;YAED,IAAI;gBACF,KAAK;YACP,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ScheduleData } from '@breejs/later';
|
|
2
|
+
import { IWorker } from './BaseWorker.js';
|
|
3
|
+
export interface IntervalWorkerParams {
|
|
4
|
+
workerId?: string;
|
|
5
|
+
batchCount?: number;
|
|
6
|
+
schedule?: ScheduleData;
|
|
7
|
+
}
|
|
8
|
+
export declare const scheduleToInterval: (schedule: ScheduleData) => number;
|
|
9
|
+
export declare const IntervalWorker: IWorker<IntervalWorkerParams>;
|
|
10
|
+
//# sourceMappingURL=IntervalWorker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntervalWorker.d.ts","sourceRoot":"","sources":["../../src/worker/IntervalWorker.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAc,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAItD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAMD,eAAO,MAAM,kBAAkB,GAAI,UAAU,YAAY,WAKxD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,oBAAoB,CA+BxD,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import later from '@breejs/later';
|
|
2
|
+
import { BaseWorker } from './BaseWorker.js';
|
|
3
|
+
const { NODE_ENV } = process.env;
|
|
4
|
+
const defaultSchedule = later.parse.text(NODE_ENV !== 'production' ? 'every 2 seconds' : 'every 30 seconds');
|
|
5
|
+
export const scheduleToInterval = (schedule) => {
|
|
6
|
+
const referenceDate = new Date(1000);
|
|
7
|
+
const [one, two] = later.schedule(schedule).next(2, referenceDate);
|
|
8
|
+
const diff = new Date(two).getTime() - new Date(one).getTime();
|
|
9
|
+
return Math.min(1000 * 60 * 60, diff); // at least once every hour!
|
|
10
|
+
};
|
|
11
|
+
export const IntervalWorker = {
|
|
12
|
+
...BaseWorker,
|
|
13
|
+
key: 'shop.unchained.worker.cron',
|
|
14
|
+
label: 'Allocates work on fixed intervals with native node setInterval',
|
|
15
|
+
version: '1.0.0',
|
|
16
|
+
type: 'CRON',
|
|
17
|
+
actions: ({ workerId, batchCount = 0, schedule = defaultSchedule }, unchainedAPI) => {
|
|
18
|
+
const baseWorkerActions = BaseWorker.actions({ workerId, worker: IntervalWorker }, unchainedAPI);
|
|
19
|
+
const intervalDelay = scheduleToInterval(schedule);
|
|
20
|
+
let intervalHandle;
|
|
21
|
+
return {
|
|
22
|
+
...baseWorkerActions,
|
|
23
|
+
start() {
|
|
24
|
+
intervalHandle = setInterval(() => {
|
|
25
|
+
baseWorkerActions.process({
|
|
26
|
+
maxWorkItemCount: batchCount,
|
|
27
|
+
referenceDate: IntervalWorker.getFloorDate(),
|
|
28
|
+
});
|
|
29
|
+
}, intervalDelay);
|
|
30
|
+
},
|
|
31
|
+
stop() {
|
|
32
|
+
clearInterval(intervalHandle);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=IntervalWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntervalWorker.js","sourceRoot":"","sources":["../../src/worker/IntervalWorker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAuB,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,UAAU,EAAW,MAAM,iBAAiB,CAAC;AAEtD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAQjC,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CACtC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CACnE,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAsB,EAAE,EAAE;IAC3D,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAW,CAAC;IAC7E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,4BAA4B;AACrE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAkC;IAC3D,GAAG,UAAU;IAEb,GAAG,EAAE,4BAA4B;IACjC,KAAK,EAAE,gEAAgE;IACvE,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,MAAM;IAEZ,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,GAAG,eAAe,EAAE,EAAE,YAAY,EAAE,EAAE;QAClF,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,YAAY,CAAC,CAAC;QAEjG,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,cAA8B,CAAC;QAEnC,OAAO;YACL,GAAG,iBAAiB;YAEpB,KAAK;gBACH,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;oBAChC,iBAAiB,CAAC,OAAO,CAAC;wBACxB,gBAAgB,EAAE,UAAU;wBAC5B,aAAa,EAAE,cAAc,CAAC,YAAY,EAAE;qBAC7C,CAAC,CAAC;gBACL,CAAC,EAAE,aAAa,CAAC,CAAC;YACpB,CAAC;YAED,IAAI;gBACF,aAAa,CAAC,cAAc,CAAC,CAAC;YAChC,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/lib/worker/email.js
CHANGED
|
@@ -79,23 +79,6 @@ const EmailWorkerPlugin = {
|
|
|
79
79
|
},
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
|
-
let nodemailer;
|
|
83
|
-
try {
|
|
84
|
-
const nodemailerModule = await import('nodemailer');
|
|
85
|
-
nodemailer = nodemailerModule.default;
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
/* */
|
|
89
|
-
}
|
|
90
|
-
if (!nodemailer) {
|
|
91
|
-
return {
|
|
92
|
-
success: false,
|
|
93
|
-
error: {
|
|
94
|
-
name: 'NODEMAILER_NOT_INSTALLED',
|
|
95
|
-
message: 'npm dependency nodemailer is not installed, please install it to use email features',
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
82
|
try {
|
|
100
83
|
const sendMailOptions = {
|
|
101
84
|
from,
|
|
@@ -117,6 +100,23 @@ const EmailWorkerPlugin = {
|
|
|
117
100
|
error: { name: 'NO_MAIL_URL_SET', message: 'MAIL_URL is not set' },
|
|
118
101
|
};
|
|
119
102
|
}
|
|
103
|
+
let nodemailer;
|
|
104
|
+
try {
|
|
105
|
+
const nodemailerModule = await import('nodemailer');
|
|
106
|
+
nodemailer = nodemailerModule.default;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
/* */
|
|
110
|
+
}
|
|
111
|
+
if (!nodemailer) {
|
|
112
|
+
return {
|
|
113
|
+
success: false,
|
|
114
|
+
error: {
|
|
115
|
+
name: 'NODEMAILER_NOT_INSTALLED',
|
|
116
|
+
message: 'npm dependency nodemailer is not installed, please install it to use email features',
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
120
|
const transporter = nodemailer.createTransport(process.env.MAIL_URL);
|
|
121
121
|
const result = await transporter.sendMail(sendMailOptions);
|
|
122
122
|
return { success: true, result };
|
package/lib/worker/email.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/worker/email.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/worker/email.ts"],"names":[],"mappings":"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"}
|
package/lib/worker/sms.js
CHANGED
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import Twilio from 'twilio';
|
|
1
|
+
import { WorkerAdapter, WorkerDirector } from '@unchainedshop/core';
|
|
3
2
|
const { TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_SMS_FROM } = process.env;
|
|
4
|
-
/* Potential: no need for twilio npm
|
|
5
|
-
curl -X POST "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages.json" \
|
|
6
|
-
--data-urlencode "From=+15017122661" \
|
|
7
|
-
--data-urlencode "Body=Hi there" \
|
|
8
|
-
--data-urlencode "To=+15558675310" \
|
|
9
|
-
-u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN
|
|
10
|
-
*/
|
|
11
3
|
const SmsWorkerPlugin = {
|
|
12
4
|
...WorkerAdapter,
|
|
13
5
|
key: 'shop.unchained.worker-plugin.sms',
|
|
@@ -34,25 +26,33 @@ const SmsWorkerPlugin = {
|
|
|
34
26
|
};
|
|
35
27
|
}
|
|
36
28
|
try {
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
29
|
+
const url = `https://api.twilio.com/2010-04-01/Accounts/${TWILIO_ACCOUNT_SID}/Messages.json`;
|
|
30
|
+
const response = await fetch(url, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: {
|
|
33
|
+
Authorization: `Basic ${Buffer.from(`${TWILIO_ACCOUNT_SID}:${TWILIO_AUTH_TOKEN}`).toString('base64')}`,
|
|
34
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
35
|
+
},
|
|
36
|
+
body: new URLSearchParams({
|
|
37
|
+
Body: text || '',
|
|
38
|
+
From: from || TWILIO_SMS_FROM,
|
|
39
|
+
To: to,
|
|
40
|
+
}),
|
|
42
41
|
});
|
|
43
|
-
|
|
42
|
+
const data = await response.json();
|
|
43
|
+
if (!response.ok) {
|
|
44
44
|
return {
|
|
45
45
|
success: false,
|
|
46
46
|
error: {
|
|
47
47
|
name: 'TWILIO_ERROR',
|
|
48
|
-
message:
|
|
48
|
+
message: data.message || 'Failed to send SMS',
|
|
49
49
|
},
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
return {
|
|
53
53
|
success: true,
|
|
54
54
|
result: {
|
|
55
|
-
sid,
|
|
55
|
+
sid: data.sid,
|
|
56
56
|
},
|
|
57
57
|
error: null,
|
|
58
58
|
};
|
package/lib/worker/sms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sms.js","sourceRoot":"","sources":["../../src/worker/sms.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"sms.js","sourceRoot":"","sources":["../../src/worker/sms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAE/E,MAAM,eAAe,GAOjB;IACF,GAAG,aAAa;IAEhB,GAAG,EAAE,kCAAkC;IACvC,KAAK,EAAE,2BAA2B;IAClC,OAAO,EAAE,OAAO;IAEhB,IAAI,EAAE,KAAK;IAEX,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACnC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,8CAA8C;iBACxD;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,oBAAoB;oBAC1B,OAAO,EAAE,mBAAmB;iBAC7B;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,8CAA8C,kBAAkB,gBAAgB,CAAC;YAC7F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,IAAI,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBACtG,cAAc,EAAE,mCAAmC;iBACpD;gBACD,IAAI,EAAE,IAAI,eAAe,CAAC;oBACxB,IAAI,EAAE,IAAI,IAAI,EAAE;oBAChB,IAAI,EAAE,IAAI,IAAI,eAAe;oBAC7B,EAAE,EAAE,EAAE;iBACP,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,oBAAoB;qBAC9C;iBACF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE;oBACN,GAAG,EAAE,IAAI,CAAC,GAAG;iBACd;gBACD,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,KAAK,EAAE,GAAG,CAAC,KAAK;iBACjB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC;AAEF,cAAc,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unchainedshop/plugins",
|
|
3
|
-
"version": "4.1
|
|
3
|
+
"version": "4.2.1",
|
|
4
4
|
"main": "lib/plugins-index.js",
|
|
5
5
|
"types": "lib/plugins-index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -34,18 +34,18 @@
|
|
|
34
34
|
},
|
|
35
35
|
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@unchainedshop/api": "^4.
|
|
38
|
-
"@unchainedshop/core-delivery": "^4.
|
|
39
|
-
"@unchainedshop/core-enrollments": "^4.
|
|
40
|
-
"@unchainedshop/core-orders": "^4.
|
|
41
|
-
"@unchainedshop/core-payment": "^4.
|
|
42
|
-
"@unchainedshop/core-products": "^4.
|
|
43
|
-
"@unchainedshop/core-warehousing": "^4.
|
|
44
|
-
"@unchainedshop/core-worker": "^4.
|
|
45
|
-
"@unchainedshop/events": "^4.
|
|
46
|
-
"@unchainedshop/file-upload": "^4.
|
|
47
|
-
"@unchainedshop/logger": "^4.
|
|
48
|
-
"@unchainedshop/utils": "^4.
|
|
37
|
+
"@unchainedshop/api": "^4.2.0",
|
|
38
|
+
"@unchainedshop/core-delivery": "^4.2.0",
|
|
39
|
+
"@unchainedshop/core-enrollments": "^4.2.0",
|
|
40
|
+
"@unchainedshop/core-orders": "^4.2.0",
|
|
41
|
+
"@unchainedshop/core-payment": "^4.2.0",
|
|
42
|
+
"@unchainedshop/core-products": "^4.2.0",
|
|
43
|
+
"@unchainedshop/core-warehousing": "^4.2.0",
|
|
44
|
+
"@unchainedshop/core-worker": "^4.2.0",
|
|
45
|
+
"@unchainedshop/events": "^4.2.0",
|
|
46
|
+
"@unchainedshop/file-upload": "^4.2.0",
|
|
47
|
+
"@unchainedshop/logger": "^4.2.0",
|
|
48
|
+
"@unchainedshop/utils": "^4.2.0"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"@aws-sdk/client-eventbridge": ">= 3.714 < 4",
|
package/src/delivery/stores.ts
CHANGED
|
@@ -14,10 +14,14 @@ const PickMup: IDeliveryAdapter = {
|
|
|
14
14
|
|
|
15
15
|
actions: (config, context) => {
|
|
16
16
|
const getStores = () => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
const storesItem = config.find((item) => item.key === 'stores');
|
|
18
|
+
if (!storesItem) return [];
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
return typeof storesItem.value === 'string' ? JSON.parse(storesItem.value) : storesItem.value;
|
|
22
|
+
} catch {
|
|
23
|
+
return storesItem?.value ?? [];
|
|
24
|
+
}
|
|
21
25
|
};
|
|
22
26
|
|
|
23
27
|
return {
|
|
@@ -14,6 +14,8 @@ import { filesSettings } from '@unchainedshop/core-files';
|
|
|
14
14
|
import { UnchainedCore } from '@unchainedshop/core';
|
|
15
15
|
import { GridFSFileUploadsModule } from './index.js';
|
|
16
16
|
|
|
17
|
+
const { GRIDFS_PUT_SERVER_PATH = '/gridfs' } = process.env;
|
|
18
|
+
|
|
17
19
|
const { ROOT_URL } = process.env;
|
|
18
20
|
|
|
19
21
|
const bufferToStream = (buffer: any) => {
|
|
@@ -51,12 +53,12 @@ export const GridFSAdapter: IFileAdapter<
|
|
|
51
53
|
const signature = await sign(directoryName, hashedFilename, expiryDate.getTime());
|
|
52
54
|
|
|
53
55
|
const putURL = new URL(
|
|
54
|
-
|
|
56
|
+
`${GRIDFS_PUT_SERVER_PATH}/${directoryName}/${encodeURIComponent(
|
|
55
57
|
fileName,
|
|
56
58
|
)}?e=${expiryDate.getTime()}&s=${signature}`,
|
|
57
59
|
ROOT_URL,
|
|
58
60
|
).href;
|
|
59
|
-
const url =
|
|
61
|
+
const url = `${GRIDFS_PUT_SERVER_PATH}/${directoryName}/${hashedFilename}`;
|
|
60
62
|
|
|
61
63
|
return {
|
|
62
64
|
_id: hashedFilename,
|
|
@@ -72,13 +74,16 @@ export const GridFSAdapter: IFileAdapter<
|
|
|
72
74
|
async uploadFileFromStream(directoryName: string, rawFile: any, { modules }, options = {}) {
|
|
73
75
|
let stream: Readable;
|
|
74
76
|
let fileName;
|
|
77
|
+
let fileId;
|
|
75
78
|
if (rawFile instanceof Promise) {
|
|
76
|
-
const { filename: f, createReadStream } = await rawFile;
|
|
79
|
+
const { filename: f, createReadStream, fileId: forcedFileId } = await rawFile;
|
|
77
80
|
fileName = decodeURIComponent(f);
|
|
78
81
|
stream = createReadStream();
|
|
82
|
+
fileId = forcedFileId;
|
|
79
83
|
} else {
|
|
80
84
|
fileName = decodeURIComponent(rawFile.filename);
|
|
81
85
|
stream = bufferToStream(Buffer.from(rawFile.buffer, 'base64'));
|
|
86
|
+
fileId = rawFile.fileId;
|
|
82
87
|
}
|
|
83
88
|
|
|
84
89
|
const expiryDate = resolveExpirationDate();
|
|
@@ -87,7 +92,7 @@ export const GridFSAdapter: IFileAdapter<
|
|
|
87
92
|
|
|
88
93
|
const writeStream = await modules.gridfsFileUploads.createWriteStream(
|
|
89
94
|
directoryName,
|
|
90
|
-
hashedFilename,
|
|
95
|
+
fileId || hashedFilename,
|
|
91
96
|
fileName,
|
|
92
97
|
{
|
|
93
98
|
metadata: { 'content-type': type },
|
|
@@ -105,10 +110,10 @@ export const GridFSAdapter: IFileAdapter<
|
|
|
105
110
|
await finished(writeStream, { readable: false });
|
|
106
111
|
|
|
107
112
|
const { length } = writeStream;
|
|
108
|
-
const url =
|
|
113
|
+
const url = `${GRIDFS_PUT_SERVER_PATH}/${directoryName}/${encodeURIComponent(hashedFilename)}`;
|
|
109
114
|
|
|
110
115
|
return {
|
|
111
|
-
_id: hashedFilename,
|
|
116
|
+
_id: fileId || hashedFilename,
|
|
112
117
|
directoryName,
|
|
113
118
|
expiryDate: null,
|
|
114
119
|
fileName,
|
|
@@ -135,7 +140,7 @@ export const GridFSAdapter: IFileAdapter<
|
|
|
135
140
|
|
|
136
141
|
const writeStream = await modules.gridfsFileUploads.createWriteStream(
|
|
137
142
|
directoryName,
|
|
138
|
-
hashedFilename,
|
|
143
|
+
fileId || hashedFilename,
|
|
139
144
|
fileName,
|
|
140
145
|
{
|
|
141
146
|
metadata: { 'content-type': type },
|
|
@@ -143,7 +148,7 @@ export const GridFSAdapter: IFileAdapter<
|
|
|
143
148
|
);
|
|
144
149
|
await pipeline(response.body as unknown as Readable, new PassThrough(), writeStream);
|
|
145
150
|
const { length } = writeStream;
|
|
146
|
-
const url =
|
|
151
|
+
const url = `${GRIDFS_PUT_SERVER_PATH}/${directoryName}/${encodeURIComponent(hashedFilename)}`;
|
|
147
152
|
|
|
148
153
|
return {
|
|
149
154
|
_id: fileId || hashedFilename,
|
|
@@ -8,7 +8,7 @@ import { Context } from '@unchainedshop/api';
|
|
|
8
8
|
import { createLogger } from '@unchainedshop/logger';
|
|
9
9
|
import { getFileAdapter } from '@unchainedshop/core-files';
|
|
10
10
|
|
|
11
|
-
const { ROOT_URL } = process.env;
|
|
11
|
+
const { ROOT_URL, GRIDFS_PUT_SERVER_PATH = '/gridfs' } = process.env;
|
|
12
12
|
|
|
13
13
|
const logger = createLogger('unchained:gridfs');
|
|
14
14
|
|
|
@@ -89,10 +89,10 @@ const gridfsHandler = async (
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
if (req.method === 'GET') {
|
|
92
|
-
const fileId = fileName;
|
|
93
92
|
const { s: signature, e: expiryTimestamp } = req.query;
|
|
94
|
-
const
|
|
95
|
-
|
|
93
|
+
const fileDocument = await modules.files.findFile({
|
|
94
|
+
url: `${GRIDFS_PUT_SERVER_PATH}/${directoryName}/${fileName}`,
|
|
95
|
+
});
|
|
96
96
|
if (fileDocument?.meta?.isPrivate) {
|
|
97
97
|
const expiry = parseInt(expiryTimestamp as string, 10);
|
|
98
98
|
if (expiry <= Date.now()) {
|
|
@@ -111,6 +111,9 @@ const gridfsHandler = async (
|
|
|
111
111
|
res.status(404).end();
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
114
|
+
|
|
115
|
+
const file = await modules.gridfsFileUploads.getFileInfo(directoryName, fileDocument._id);
|
|
116
|
+
|
|
114
117
|
if (file?.metadata?.['content-type']) {
|
|
115
118
|
res.setHeader('Content-Type', file.metadata['content-type']);
|
|
116
119
|
}
|
|
@@ -118,7 +121,10 @@ const gridfsHandler = async (
|
|
|
118
121
|
res.setHeader('Content-Length', file?.length.toString());
|
|
119
122
|
}
|
|
120
123
|
|
|
121
|
-
const readStream = await modules.gridfsFileUploads.createReadStream(
|
|
124
|
+
const readStream = await modules.gridfsFileUploads.createReadStream(
|
|
125
|
+
directoryName,
|
|
126
|
+
fileDocument._id,
|
|
127
|
+
);
|
|
122
128
|
readStream.pipe(res, { end: false });
|
|
123
129
|
await finished(readStream);
|
|
124
130
|
res.status(200).end();
|
|
@@ -10,6 +10,8 @@ import { getFileAdapter } from '@unchainedshop/core-files';
|
|
|
10
10
|
|
|
11
11
|
const logger = createLogger('unchained:gridfs');
|
|
12
12
|
|
|
13
|
+
const { GRIDFS_PUT_SERVER_PATH = '/gridfs' } = process.env;
|
|
14
|
+
|
|
13
15
|
const gridfsHandler: RouteHandlerMethod = async (
|
|
14
16
|
req: FastifyRequest & {
|
|
15
17
|
unchainedContext: Context & {
|
|
@@ -105,14 +107,14 @@ const gridfsHandler: RouteHandlerMethod = async (
|
|
|
105
107
|
}
|
|
106
108
|
|
|
107
109
|
if (req.method === 'GET') {
|
|
108
|
-
const fileId = fileName;
|
|
109
110
|
const { s: signature, e: expiryTimestamp } = req.query as Record<string, string>;
|
|
110
|
-
const
|
|
111
|
-
|
|
111
|
+
const fileDocument = await modules.files.findFile({
|
|
112
|
+
url: `${GRIDFS_PUT_SERVER_PATH}/${directoryName}/${fileName}`,
|
|
113
|
+
});
|
|
112
114
|
if (fileDocument?.meta?.isPrivate) {
|
|
113
115
|
const expiry = parseInt(expiryTimestamp as string, 10);
|
|
114
116
|
if (expiry <= Date.now()) {
|
|
115
|
-
logger.error('URL Expired', {
|
|
117
|
+
logger.error('URL Expired', { fileName, expiry });
|
|
116
118
|
reply.status(403);
|
|
117
119
|
return reply.send({
|
|
118
120
|
success: false,
|
|
@@ -126,7 +128,7 @@ const gridfsHandler: RouteHandlerMethod = async (
|
|
|
126
128
|
|
|
127
129
|
if (!signedUrl || new URL(signedUrl, 'file://').searchParams.get('s') !== signature) {
|
|
128
130
|
reply.status(403);
|
|
129
|
-
logger.error('Invalid signature', {
|
|
131
|
+
logger.error('Invalid signature', { fileName, expiry });
|
|
130
132
|
return reply.send({
|
|
131
133
|
success: false,
|
|
132
134
|
message: 'Access restricted: Invalid signature.',
|
|
@@ -134,11 +136,13 @@ const gridfsHandler: RouteHandlerMethod = async (
|
|
|
134
136
|
});
|
|
135
137
|
}
|
|
136
138
|
} else if (!fileDocument) {
|
|
137
|
-
logger.error('File not found', {
|
|
139
|
+
logger.error('File not found', { fileName });
|
|
138
140
|
reply.status(404);
|
|
139
141
|
return reply.send();
|
|
140
142
|
}
|
|
141
143
|
|
|
144
|
+
const file = await modules.gridfsFileUploads.getFileInfo(directoryName, fileDocument._id);
|
|
145
|
+
|
|
142
146
|
if (file?.metadata?.['content-type']) {
|
|
143
147
|
reply.header('content-type', file.metadata['content-type']);
|
|
144
148
|
}
|
|
@@ -146,7 +150,10 @@ const gridfsHandler: RouteHandlerMethod = async (
|
|
|
146
150
|
reply.header('content-length', file?.length.toString());
|
|
147
151
|
}
|
|
148
152
|
|
|
149
|
-
const readStream = await modules.gridfsFileUploads.createReadStream(
|
|
153
|
+
const readStream = await modules.gridfsFileUploads.createReadStream(
|
|
154
|
+
directoryName,
|
|
155
|
+
fileDocument._id,
|
|
156
|
+
);
|
|
150
157
|
|
|
151
158
|
reply.status(200);
|
|
152
159
|
return reply.send(readStream);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { FastifyInstance } from 'fastify';
|
|
2
2
|
import handler from '../files/gridfs/handler-fastify.js';
|
|
3
3
|
|
|
4
|
-
const { GRIDFS_PUT_SERVER_PATH = '/gridfs
|
|
4
|
+
const { GRIDFS_PUT_SERVER_PATH = '/gridfs' } = process.env;
|
|
5
5
|
|
|
6
6
|
export default (fastify: FastifyInstance) => {
|
|
7
7
|
fastify.register((s, opts, registered) => {
|
|
@@ -11,7 +11,7 @@ export default (fastify: FastifyInstance) => {
|
|
|
11
11
|
done(null);
|
|
12
12
|
});
|
|
13
13
|
s.route({
|
|
14
|
-
url: GRIDFS_PUT_SERVER_PATH,
|
|
14
|
+
url: GRIDFS_PUT_SERVER_PATH + '/:directoryName/:fileName',
|
|
15
15
|
method: ['GET', 'PUT', 'OPTIONS'],
|
|
16
16
|
handler,
|
|
17
17
|
});
|
package/src/worker/email.ts
CHANGED
|
@@ -101,24 +101,6 @@ const EmailWorkerPlugin: IWorkerAdapter<
|
|
|
101
101
|
};
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
let nodemailer;
|
|
105
|
-
try {
|
|
106
|
-
const nodemailerModule = await import('nodemailer');
|
|
107
|
-
nodemailer = nodemailerModule.default;
|
|
108
|
-
} catch {
|
|
109
|
-
/* */
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (!nodemailer) {
|
|
113
|
-
return {
|
|
114
|
-
success: false,
|
|
115
|
-
error: {
|
|
116
|
-
name: 'NODEMAILER_NOT_INSTALLED',
|
|
117
|
-
message: 'npm dependency nodemailer is not installed, please install it to use email features',
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
104
|
try {
|
|
123
105
|
const sendMailOptions = {
|
|
124
106
|
from,
|
|
@@ -134,12 +116,33 @@ const EmailWorkerPlugin: IWorkerAdapter<
|
|
|
134
116
|
error: !opened ? { message: "Interception failed due to missing package 'open'" } : undefined,
|
|
135
117
|
};
|
|
136
118
|
}
|
|
119
|
+
|
|
137
120
|
if (!process.env.MAIL_URL) {
|
|
138
121
|
return {
|
|
139
122
|
success: false,
|
|
140
123
|
error: { name: 'NO_MAIL_URL_SET', message: 'MAIL_URL is not set' },
|
|
141
124
|
};
|
|
142
125
|
}
|
|
126
|
+
|
|
127
|
+
let nodemailer;
|
|
128
|
+
try {
|
|
129
|
+
const nodemailerModule = await import('nodemailer');
|
|
130
|
+
nodemailer = nodemailerModule.default;
|
|
131
|
+
} catch {
|
|
132
|
+
/* */
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!nodemailer) {
|
|
136
|
+
return {
|
|
137
|
+
success: false,
|
|
138
|
+
error: {
|
|
139
|
+
name: 'NODEMAILER_NOT_INSTALLED',
|
|
140
|
+
message:
|
|
141
|
+
'npm dependency nodemailer is not installed, please install it to use email features',
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
143
146
|
const transporter = nodemailer.createTransport(process.env.MAIL_URL);
|
|
144
147
|
const result = await transporter.sendMail(sendMailOptions);
|
|
145
148
|
return { success: true, result };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-oauth.d.ts","sourceRoot":"","sources":["../../src/accounts/google-oauth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAmFlE,QAAA,MAAM,mBAAmB,EAAE,cA4F1B,CAAC;AAIF,eAAe,mBAAmB,CAAC"}
|