@unchainedshop/plugins 2.0.0-beta5 → 2.0.0-beta7
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/pick-mup.d.ts +1 -0
- package/lib/delivery/pick-mup.js +1 -1
- package/lib/delivery/pick-mup.js.map +1 -1
- package/lib/files/gridfs/gridfs-adapter.d.ts +1 -0
- package/lib/files/gridfs/gridfs-adapter.js +0 -1
- package/lib/files/gridfs/gridfs-adapter.js.map +1 -1
- package/lib/files/gridfs/gridfs-webhook.d.ts +1 -2
- package/lib/files/gridfs/gridfs-webhook.js +2 -6
- package/lib/files/gridfs/gridfs-webhook.js.map +1 -1
- package/lib/files/minio/minio-adapter.d.ts +2 -1
- package/lib/files/minio/minio-adapter.js +13 -7
- package/lib/files/minio/minio-adapter.js.map +1 -1
- package/lib/files/minio/minio-webhook.d.ts +1 -2
- package/lib/files/minio/minio-webhook.js +24 -37
- package/lib/files/minio/minio-webhook.js.map +1 -1
- package/lib/payment/apple-iap/adapter.d.ts +2 -2
- package/lib/payment/apple-iap/adapter.js +89 -97
- package/lib/payment/apple-iap/adapter.js.map +1 -1
- package/lib/payment/apple-iap/index.d.ts +2 -3
- package/lib/payment/apple-iap/index.js +2 -3
- package/lib/payment/apple-iap/index.js.map +1 -1
- package/lib/payment/cryptopay/index.d.ts +2 -3
- package/lib/payment/cryptopay/index.js +2 -3
- package/lib/payment/cryptopay/index.js.map +1 -1
- package/lib/payment/cryptopay/middleware.d.ts +1 -2
- package/lib/payment/cryptopay/middleware.js +64 -69
- package/lib/payment/cryptopay/middleware.js.map +1 -1
- package/lib/payment/datatrans-v2/api/makeFetcher.d.ts +1 -1
- package/lib/payment/datatrans-v2/api/makeFetcher.js +1 -1
- package/lib/payment/datatrans-v2/api/makeFetcher.js.map +1 -1
- package/lib/payment/datatrans-v2/getPaths.d.ts +1 -1
- package/lib/payment/datatrans-v2/getPaths.js +7 -7
- package/lib/payment/datatrans-v2/getPaths.js.map +1 -1
- package/lib/payment/datatrans-v2/index.d.ts +1 -2
- package/lib/payment/datatrans-v2/index.js +1 -2
- package/lib/payment/datatrans-v2/index.js.map +1 -1
- package/lib/payment/datatrans-v2/middleware.d.ts +1 -2
- package/lib/payment/datatrans-v2/middleware.js +54 -102
- package/lib/payment/datatrans-v2/middleware.js.map +1 -1
- package/lib/payment/postfinance-checkout/index.d.ts +1 -2
- package/lib/payment/postfinance-checkout/index.js +1 -2
- package/lib/payment/postfinance-checkout/index.js.map +1 -1
- package/lib/payment/postfinance-checkout/middleware.d.ts +1 -2
- package/lib/payment/postfinance-checkout/middleware.js +31 -37
- package/lib/payment/postfinance-checkout/middleware.js.map +1 -1
- package/lib/payment/stripe.d.ts +1 -2
- package/lib/payment/stripe.js +55 -60
- package/lib/payment/stripe.js.map +1 -1
- package/lib/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayConnection.d.ts +1 -0
- package/lib/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayConnection.js +1 -1
- package/lib/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayConnection.js.map +1 -1
- package/lib/plugins-index.d.ts +61 -0
- package/lib/plugins-index.js +100 -0
- package/lib/plugins-index.js.map +1 -1
- package/lib/pricing/utils/cache.d.ts +1 -2
- package/lib/warehousing/eth-minter.js +30 -42
- package/lib/warehousing/eth-minter.js.map +1 -1
- package/lib/worker/http-request.d.ts +1 -0
- package/lib/worker/http-request.js +0 -1
- package/lib/worker/http-request.js.map +1 -1
- package/lib/worker/update-coinbase-rates.d.ts +1 -0
- package/lib/worker/update-coinbase-rates.js +0 -1
- package/lib/worker/update-coinbase-rates.js.map +1 -1
- package/lib/worker/update-ecb-rates.d.ts +1 -0
- package/lib/worker/update-ecb-rates.js +0 -1
- package/lib/worker/update-ecb-rates.js.map +1 -1
- package/lib/worker/zombie-killer.js +1 -1
- package/package.json +21 -23
- package/src/delivery/pick-mup.ts +1 -1
- package/src/files/gridfs/gridfs-adapter.ts +3 -2
- package/src/files/gridfs/gridfs-webhook.ts +40 -46
- package/src/files/minio/minio-adapter.ts +13 -8
- package/src/files/minio/minio-webhook.ts +35 -0
- package/src/payment/apple-iap/adapter.ts +104 -120
- package/src/payment/apple-iap/index.ts +2 -4
- package/src/payment/cryptopay/index.ts +2 -4
- package/src/payment/cryptopay/middleware.ts +65 -74
- package/src/payment/datatrans-v2/api/makeFetcher.ts +1 -1
- package/src/payment/datatrans-v2/getPaths.ts +12 -11
- package/src/payment/datatrans-v2/index.ts +2 -3
- package/src/payment/datatrans-v2/middleware.ts +66 -133
- package/src/payment/postfinance-checkout/index.ts +2 -3
- package/src/payment/postfinance-checkout/middleware.ts +37 -45
- package/src/payment/stripe.ts +68 -83
- package/src/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayConnection.ts +1 -2
- package/src/plugins-index.ts +147 -0
- package/src/warehousing/eth-minter.ts +36 -50
- package/src/worker/http-request.ts +1 -1
- package/src/worker/update-coinbase-rates.ts +1 -1
- package/src/worker/update-ecb-rates.ts +1 -1
- package/src/worker/zombie-killer.ts +1 -1
- package/lib/payment/bity/adapter.d.ts +0 -2
- package/lib/payment/bity/adapter.js +0 -320
- package/lib/payment/bity/adapter.js.map +0 -1
- package/lib/payment/bity/db/BityCredentialsCollection.d.ts +0 -11
- package/lib/payment/bity/db/BityCredentialsCollection.js +0 -5
- package/lib/payment/bity/db/BityCredentialsCollection.js.map +0 -1
- package/lib/payment/bity/index.d.ts +0 -3
- package/lib/payment/bity/index.js +0 -4
- package/lib/payment/bity/index.js.map +0 -1
- package/lib/payment/bity/module/configureBityModule.d.ts +0 -11
- package/lib/payment/bity/module/configureBityModule.js +0 -33
- package/lib/payment/bity/module/configureBityModule.js.map +0 -1
- package/src/files/minio/minio-webhook.js +0 -54
- package/src/payment/bity/adapter.ts +0 -421
- package/src/payment/bity/db/BityCredentialsCollection.ts +0 -17
- package/src/payment/bity/index.ts +0 -4
- package/src/payment/bity/module/configureBityModule.ts +0 -46
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-request.js","sourceRoot":"","sources":["../../src/worker/http-request.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-request.js","sourceRoot":"","sources":["../../src/worker/http-request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,SAAS,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;IACjD,OAAO,KAAK,CAAC,GAAG,EAAE;QAChB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE;KAC5D,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,EAAE,EAAE;IAC9D,OAAO,KAAK,CAAC,GAAG,EAAE;QAChB,MAAM;QACN,OAAO;KACR,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAGzB;IACF,GAAG,aAAa;IAEhB,GAAG,EAAE,2CAA2C;IAChD,KAAK,EAAE,oDAAoD;IAC3D,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,cAAc;IAEpB,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;QAC5E,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,eAAe,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,EAAE;YACrD,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,EAAE;YACR,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,8BAA8B;iBACxC;aACF,CAAC;SACH;QAED,IAAI;YACF,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;YACnF,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAElE,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAEtE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,EAAE,EAAE;gBAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aAClC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACnC;QAAC,OAAO,GAAG,EAAE;YACZ,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;SACH;IACH,CAAC;CACF,CAAC;AAEF,cAAc,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC;AAExD,eAAe,uBAAuB,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { WorkerAdapter, WorkerDirector } from '@unchainedshop/core-worker';
|
|
2
2
|
import later from '@breejs/later';
|
|
3
|
-
import fetch from 'node-fetch';
|
|
4
3
|
import { systemLocale } from '@unchainedshop/utils';
|
|
5
4
|
const getExchangeRates = async (base) => {
|
|
6
5
|
return fetch(`https://api.coinbase.com/v2/exchange-rates?currency=${base}`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-coinbase-rates.js","sourceRoot":"","sources":["../../src/worker/update-coinbase-rates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-coinbase-rates.js","sourceRoot":"","sources":["../../src/worker/update-coinbase-rates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { WorkerAdapter, WorkerDirector } from '@unchainedshop/core-worker';
|
|
2
2
|
import later from '@breejs/later';
|
|
3
3
|
import xmlJs from 'xml-js';
|
|
4
|
-
import fetch from 'node-fetch';
|
|
5
4
|
const getExchangeRates = async () => {
|
|
6
5
|
return fetch(`https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml`, {
|
|
7
6
|
method: 'GET',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-ecb-rates.js","sourceRoot":"","sources":["../../src/worker/update-ecb-rates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-ecb-rates.js","sourceRoot":"","sources":["../../src/worker/update-ecb-rates.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ export const ZombieKillerWorker = {
|
|
|
17
17
|
// Remove unreferenced product media objects
|
|
18
18
|
const products = await modules.products.findProducts({}, findId);
|
|
19
19
|
const deletedProductMediaCount = await modules.products.media.deleteMediaFiles({
|
|
20
|
-
|
|
20
|
+
excludedProductIds: products.map(mapId),
|
|
21
21
|
});
|
|
22
22
|
// Remove unreferenced assortment media objects
|
|
23
23
|
const assortments = await modules.assortments.findAssortments({}, findId);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unchainedshop/plugins",
|
|
3
|
-
"version": "2.0.0-
|
|
3
|
+
"version": "2.0.0-beta7",
|
|
4
4
|
"main": "lib/plugins-index.js",
|
|
5
5
|
"types": "lib/plugins-index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -71,42 +71,40 @@
|
|
|
71
71
|
},
|
|
72
72
|
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
73
73
|
"devDependencies": {
|
|
74
|
-
"@types/node": "^
|
|
75
|
-
"@unchainedshop/api": "^2.0.0-
|
|
74
|
+
"@types/node": "^18.11.9",
|
|
75
|
+
"@unchainedshop/api": "^2.0.0-beta7",
|
|
76
76
|
"@unchainedshop/client-oauth2": "^4.3.3",
|
|
77
|
-
"@unchainedshop/core-delivery": "^2.0.0-
|
|
78
|
-
"@unchainedshop/core-enrollments": "^2.0.0-
|
|
79
|
-
"@unchainedshop/core-filters": "^2.0.0-
|
|
80
|
-
"@unchainedshop/core-messaging": "^2.0.0-
|
|
81
|
-
"@unchainedshop/core-orders": "^2.0.0-
|
|
82
|
-
"@unchainedshop/core-payment": "^2.0.0-
|
|
83
|
-
"@unchainedshop/core-products": "^2.0.0-
|
|
84
|
-
"@unchainedshop/core-quotations": "^2.0.0-
|
|
85
|
-
"@unchainedshop/core-warehousing": "^2.0.0-
|
|
86
|
-
"@unchainedshop/core-worker": "^2.0.0-
|
|
87
|
-
"@unchainedshop/events": "^2.0.0-
|
|
88
|
-
"@unchainedshop/file-upload": "^2.0.0-
|
|
89
|
-
"@unchainedshop/logger": "^2.0.0-
|
|
90
|
-
"@unchainedshop/types": "^2.0.0-
|
|
91
|
-
"@unchainedshop/utils": "^2.0.0-
|
|
77
|
+
"@unchainedshop/core-delivery": "^2.0.0-beta7",
|
|
78
|
+
"@unchainedshop/core-enrollments": "^2.0.0-beta7",
|
|
79
|
+
"@unchainedshop/core-filters": "^2.0.0-beta7",
|
|
80
|
+
"@unchainedshop/core-messaging": "^2.0.0-beta7",
|
|
81
|
+
"@unchainedshop/core-orders": "^2.0.0-beta7",
|
|
82
|
+
"@unchainedshop/core-payment": "^2.0.0-beta7",
|
|
83
|
+
"@unchainedshop/core-products": "^2.0.0-beta7",
|
|
84
|
+
"@unchainedshop/core-quotations": "^2.0.0-beta7",
|
|
85
|
+
"@unchainedshop/core-warehousing": "^2.0.0-beta7",
|
|
86
|
+
"@unchainedshop/core-worker": "^2.0.0-beta7",
|
|
87
|
+
"@unchainedshop/events": "^2.0.0-beta7",
|
|
88
|
+
"@unchainedshop/file-upload": "^2.0.0-beta7",
|
|
89
|
+
"@unchainedshop/logger": "^2.0.0-beta7",
|
|
90
|
+
"@unchainedshop/types": "^2.0.0-beta7",
|
|
91
|
+
"@unchainedshop/utils": "^2.0.0-beta7",
|
|
92
92
|
"bluebird": "^3.7.2",
|
|
93
93
|
"body-parser": "^1.20.0",
|
|
94
94
|
"event-iterator": "^2.0.0",
|
|
95
|
-
"jest": "^29.
|
|
95
|
+
"jest": "^29.3.1",
|
|
96
96
|
"JSONStream": "^1.3.5",
|
|
97
97
|
"minio": "^7.0.32",
|
|
98
98
|
"mongodb": "^4.11.0",
|
|
99
99
|
"node-sheets": "^1.2.0",
|
|
100
100
|
"nodemailer": "^6.8.0",
|
|
101
101
|
"open": "^8.4.0",
|
|
102
|
-
"redis": "^4.
|
|
102
|
+
"redis": "^4.5.0",
|
|
103
103
|
"request": "^2.88.2",
|
|
104
|
+
"stripe": "^10.17.0",
|
|
104
105
|
"ts-jest": "^29.0.3",
|
|
105
106
|
"typescript": "^4.8.4",
|
|
106
107
|
"xml-js": "^1.6.11",
|
|
107
108
|
"xml2js": "0.4.23"
|
|
108
|
-
},
|
|
109
|
-
"peerDependencies": {
|
|
110
|
-
"node-fetch": "^2.6.7"
|
|
111
109
|
}
|
|
112
110
|
}
|
package/src/delivery/pick-mup.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
1
2
|
import { DeliveryProviderType, IDeliveryAdapter } from '@unchainedshop/types/delivery';
|
|
2
|
-
import fetch from 'node-fetch';
|
|
3
3
|
import { DeliveryAdapter, DeliveryDirector, DeliveryError } from '@unchainedshop/core-delivery';
|
|
4
4
|
|
|
5
5
|
const fetchPickMupLocations = async (key: string, idsFilter?: string) => {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
1
2
|
import { IFileAdapter, UploadFileData } from '@unchainedshop/types/files';
|
|
2
3
|
import { FileAdapter, FileDirector, buildHashedFilename } from '@unchainedshop/file-upload';
|
|
3
4
|
import mimeType from 'mime-types';
|
|
4
5
|
import { URL } from 'url';
|
|
5
6
|
import { Readable, pipeline as rawPipeline } from 'stream';
|
|
6
7
|
import { promisify } from 'util';
|
|
7
|
-
import
|
|
8
|
+
import { ReadableStream } from 'node:stream/web';
|
|
8
9
|
import sign from './sign';
|
|
9
10
|
|
|
10
11
|
const pipeline = promisify(rawPipeline);
|
|
@@ -98,7 +99,7 @@ export const GridFSAdapter: IFileAdapter = {
|
|
|
98
99
|
const writeStream = await modules.gridfsFileUploads.createWriteStream(directoryName, _id, fileName);
|
|
99
100
|
const response = await fetch(href, { headers });
|
|
100
101
|
if (!response.ok) throw new Error(`Unexpected response for ${href}: ${response.statusText}`);
|
|
101
|
-
await pipeline(response.body, writeStream);
|
|
102
|
+
await pipeline(response.body as ReadableStream, writeStream);
|
|
102
103
|
const { length } = writeStream;
|
|
103
104
|
const url = `/gridfs/${directoryName}/${_id}`;
|
|
104
105
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { useMiddlewareWithCurrentContext } from '@unchainedshop/api';
|
|
2
1
|
import { log, LogLevel } from '@unchainedshop/logger';
|
|
3
2
|
import { buildHashedFilename } from '@unchainedshop/file-upload';
|
|
4
3
|
import { pipeline as rawPipeline } from 'stream';
|
|
@@ -9,58 +8,53 @@ const pipeline = promisify(rawPipeline);
|
|
|
9
8
|
|
|
10
9
|
const { ROOT_URL } = process.env;
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
export const gridfsHandler = async (req, res) => {
|
|
12
|
+
try {
|
|
13
|
+
const { services, modules } = req.unchainedContext;
|
|
14
|
+
const url = new URL(req.url, ROOT_URL);
|
|
15
|
+
const [, directoryName, fileName] = url.pathname.split('/');
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const expiryDate = new Date(parseInt(expiryTimestamp, 10));
|
|
26
|
-
const fileId = buildHashedFilename(directoryName, fileName, expiryDate);
|
|
27
|
-
if (sign(directoryName, fileId, expiryDate.getTime()) === signature) {
|
|
28
|
-
const file = await modules.files.findFile({ fileId });
|
|
29
|
-
if (file.expires === null) {
|
|
30
|
-
res.writeHead(503);
|
|
31
|
-
res.end('File already linked');
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const writeStream = await modules.gridfsFileUploads.createWriteStream(
|
|
35
|
-
directoryName,
|
|
36
|
-
fileId,
|
|
37
|
-
fileName,
|
|
38
|
-
);
|
|
39
|
-
res.writeHead(200);
|
|
40
|
-
await pipeline(req, writeStream);
|
|
41
|
-
const { length } = writeStream;
|
|
42
|
-
await services.files.linkFile({ fileId, size: length }, req.unchainedContext);
|
|
43
|
-
res.end();
|
|
17
|
+
if (req.method === 'PUT') {
|
|
18
|
+
const { s: signature, e: expiryTimestamp } = req.query;
|
|
19
|
+
const expiryDate = new Date(parseInt(expiryTimestamp, 10));
|
|
20
|
+
const fileId = buildHashedFilename(directoryName, fileName, expiryDate);
|
|
21
|
+
if (sign(directoryName, fileId, expiryDate.getTime()) === signature) {
|
|
22
|
+
const file = await modules.files.findFile({ fileId });
|
|
23
|
+
if (file.expires === null) {
|
|
24
|
+
res.writeHead(503);
|
|
25
|
+
res.end('File already linked');
|
|
44
26
|
return;
|
|
45
27
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const fileId = fileName;
|
|
52
|
-
const readStream = await modules.gridfsFileUploads.createReadStream(directoryName, fileId);
|
|
28
|
+
const writeStream = await modules.gridfsFileUploads.createWriteStream(
|
|
29
|
+
directoryName,
|
|
30
|
+
fileId,
|
|
31
|
+
fileName,
|
|
32
|
+
);
|
|
53
33
|
res.writeHead(200);
|
|
54
|
-
await pipeline(
|
|
34
|
+
await pipeline(req, writeStream);
|
|
35
|
+
const { length } = writeStream;
|
|
36
|
+
await services.files.linkFile({ fileId, size: length }, req.unchainedContext);
|
|
55
37
|
res.end();
|
|
56
38
|
return;
|
|
57
39
|
}
|
|
58
|
-
res.writeHead(
|
|
40
|
+
res.writeHead(403);
|
|
41
|
+
res.end();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (req.method === 'GET') {
|
|
45
|
+
const fileId = fileName;
|
|
46
|
+
const readStream = await modules.gridfsFileUploads.createReadStream(directoryName, fileId);
|
|
47
|
+
res.writeHead(200);
|
|
48
|
+
await pipeline(readStream, res);
|
|
59
49
|
res.end();
|
|
60
50
|
return;
|
|
61
|
-
} catch (e) {
|
|
62
|
-
log(e.message, { level: LogLevel.Error });
|
|
63
|
-
res.writeHead(503);
|
|
64
|
-
res.end(JSON.stringify({ name: e.name, code: e.code, message: e.message }));
|
|
65
51
|
}
|
|
66
|
-
|
|
52
|
+
res.writeHead(404);
|
|
53
|
+
res.end();
|
|
54
|
+
return;
|
|
55
|
+
} catch (e) {
|
|
56
|
+
log(e.message, { level: LogLevel.Error });
|
|
57
|
+
res.writeHead(503);
|
|
58
|
+
res.end(JSON.stringify({ name: e.name, code: e.code, message: e.message }));
|
|
59
|
+
}
|
|
60
|
+
};
|
|
@@ -6,12 +6,14 @@ import http, { OutgoingHttpHeaders } from 'http';
|
|
|
6
6
|
import { log, LogLevel } from '@unchainedshop/logger';
|
|
7
7
|
import mimeType from 'mime-types';
|
|
8
8
|
import Minio from 'minio';
|
|
9
|
+
import AssumeRoleProvider from 'minio/dist/main/AssumeRoleProvider';
|
|
9
10
|
import { Readable } from 'stream';
|
|
10
11
|
import { URL } from 'url';
|
|
11
12
|
|
|
12
13
|
const {
|
|
13
14
|
MINIO_ACCESS_KEY,
|
|
14
15
|
MINIO_REGION,
|
|
16
|
+
MINIO_STS_ENDPOINT,
|
|
15
17
|
MINIO_SECRET_KEY,
|
|
16
18
|
MINIO_ENDPOINT,
|
|
17
19
|
MINIO_BUCKET_NAME,
|
|
@@ -46,12 +48,15 @@ export async function connectToMinio() {
|
|
|
46
48
|
// eslint-disable-next-line
|
|
47
49
|
// @ts-ignore
|
|
48
50
|
if (NODE_ENV === 'development') minioClient?.traceOn(process.stdout);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
if (MINIO_STS_ENDPOINT) {
|
|
52
|
+
const ap = new AssumeRoleProvider({
|
|
53
|
+
stsEndpoint: MINIO_STS_ENDPOINT,
|
|
54
|
+
});
|
|
55
|
+
// eslint-disable-next-line
|
|
56
|
+
// @ts-ignore
|
|
57
|
+
await minioClient.setCredentialsProvider(ap);
|
|
58
|
+
}
|
|
59
|
+
return minioClient;
|
|
55
60
|
} catch (error) {
|
|
56
61
|
log(`Exception while creating Minio client: ${error.message}`, {
|
|
57
62
|
level: LogLevel.Error,
|
|
@@ -68,7 +73,7 @@ const getMimeType = (extension) => {
|
|
|
68
73
|
return mimeType.lookup(extension);
|
|
69
74
|
};
|
|
70
75
|
|
|
71
|
-
connectToMinio().then((c)
|
|
76
|
+
connectToMinio().then(function setClient(c) {
|
|
72
77
|
client = c;
|
|
73
78
|
});
|
|
74
79
|
|
|
@@ -109,7 +114,7 @@ const getExpiryDate = () => new Date(new Date().getTime() + PUT_URL_EXPIRY);
|
|
|
109
114
|
export const MinioAdapter: IFileAdapter = {
|
|
110
115
|
key: 'shop.unchained.file-upload-plugin.minio',
|
|
111
116
|
label: 'Uploads files into an S3 bucket using minio',
|
|
112
|
-
version: '1.
|
|
117
|
+
version: '1.1.0',
|
|
113
118
|
|
|
114
119
|
...FileAdapter,
|
|
115
120
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { log, LogLevel } from '@unchainedshop/logger';
|
|
2
|
+
|
|
3
|
+
const { MINIO_WEBHOOK_AUTH_TOKEN } = process.env;
|
|
4
|
+
|
|
5
|
+
const isAuthorized = ({ authorization = '' }) => {
|
|
6
|
+
const [type, token] = authorization.split(' ');
|
|
7
|
+
return type === 'Bearer' && token === MINIO_WEBHOOK_AUTH_TOKEN;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const minioHandler = async (req, res) => {
|
|
11
|
+
try {
|
|
12
|
+
if (req.method === 'POST' && req.body) {
|
|
13
|
+
const { headers } = req;
|
|
14
|
+
const { Records = [], EventName } = req.body;
|
|
15
|
+
if (EventName === 's3:ObjectCreated:Put' && isAuthorized(headers)) {
|
|
16
|
+
const [{ s3 }] = Records;
|
|
17
|
+
const { object } = s3;
|
|
18
|
+
const { size, contentType: type } = object;
|
|
19
|
+
const [fileId] = object.key.split('.');
|
|
20
|
+
const { services } = req.unchainedContext;
|
|
21
|
+
await services.files.linkFile({ fileId, type, size }, req.unchainedContext);
|
|
22
|
+
res.writeHead(200);
|
|
23
|
+
res.end();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
res.writeHead(404);
|
|
28
|
+
res.end();
|
|
29
|
+
return;
|
|
30
|
+
} catch (e) {
|
|
31
|
+
log(e.message, { level: LogLevel.Error });
|
|
32
|
+
res.writeHead(503);
|
|
33
|
+
res.end(JSON.stringify({ name: e.name, code: e.code, message: e.message }));
|
|
34
|
+
}
|
|
35
|
+
};
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
1
2
|
import { Context } from '@unchainedshop/types/api';
|
|
2
3
|
import { IPaymentAdapter } from '@unchainedshop/types/payments';
|
|
3
|
-
import bodyParser from 'body-parser';
|
|
4
|
-
import fetch from 'node-fetch';
|
|
5
|
-
import { useMiddlewareWithCurrentContext } from '@unchainedshop/api';
|
|
6
4
|
import { EnrollmentStatus } from '@unchainedshop/core-enrollments';
|
|
7
5
|
import { PaymentAdapter, PaymentDirector, PaymentError } from '@unchainedshop/core-payment';
|
|
8
6
|
import { createLogger } from '@unchainedshop/logger';
|
|
@@ -10,11 +8,7 @@ import { AppleTransactionsModule } from './module/configureAppleTransactionsModu
|
|
|
10
8
|
|
|
11
9
|
const logger = createLogger('unchained:core-payment:iap');
|
|
12
10
|
|
|
13
|
-
const {
|
|
14
|
-
APPLE_IAP_SHARED_SECRET,
|
|
15
|
-
APPLE_IAP_ENVIRONMENT = 'sandbox',
|
|
16
|
-
APPLE_IAP_WEBHOOK_PATH = '/payment/apple-iap',
|
|
17
|
-
} = process.env;
|
|
11
|
+
const { APPLE_IAP_SHARED_SECRET, APPLE_IAP_ENVIRONMENT = 'sandbox' } = process.env;
|
|
18
12
|
|
|
19
13
|
// https://developer.apple.com/documentation/storekit/in-app_purchase/validating_receipts_with_the_app_store
|
|
20
14
|
const environments = {
|
|
@@ -88,144 +82,134 @@ const fixPeriods = async (
|
|
|
88
82
|
);
|
|
89
83
|
};
|
|
90
84
|
|
|
91
|
-
export
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
useMiddlewareWithCurrentContext(app, APPLE_IAP_WEBHOOK_PATH, async (req, res) => {
|
|
101
|
-
if (req.method === 'POST') {
|
|
102
|
-
try {
|
|
103
|
-
const resolvedContext = req.unchainedContext as Context;
|
|
104
|
-
const { modules, services } = resolvedContext;
|
|
105
|
-
const responseBody = req.body || {};
|
|
106
|
-
if (responseBody.password !== APPLE_IAP_SHARED_SECRET) {
|
|
107
|
-
throw new Error('shared secret not valid');
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const transactions = responseBody?.unified_receipt?.latest_receipt_info; // eslint-disable-line
|
|
111
|
-
const latestTransaction = transactions[0];
|
|
112
|
-
|
|
113
|
-
if (responseBody.notification_type === AppleNotificationTypes.INITIAL_BUY) {
|
|
114
|
-
// Find the cart to checkout
|
|
115
|
-
const orderPayment = await modules.orders.payments.findOrderPaymentByContextData({
|
|
116
|
-
context: {
|
|
117
|
-
'meta.transactionIdentifier': latestTransaction.transaction_id,
|
|
118
|
-
},
|
|
119
|
-
});
|
|
85
|
+
export const appleIAPHandler = async (req, res) => {
|
|
86
|
+
if (req.method === 'POST') {
|
|
87
|
+
try {
|
|
88
|
+
const resolvedContext = req.unchainedContext as Context;
|
|
89
|
+
const { modules, services } = resolvedContext;
|
|
90
|
+
const responseBody = req.body || {};
|
|
91
|
+
if (responseBody.password !== APPLE_IAP_SHARED_SECRET) {
|
|
92
|
+
throw new Error('shared secret not valid');
|
|
93
|
+
}
|
|
120
94
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
orderId: orderPayment.orderId,
|
|
124
|
-
});
|
|
95
|
+
const transactions = responseBody?.unified_receipt?.latest_receipt_info; // eslint-disable-line
|
|
96
|
+
const latestTransaction = transactions[0];
|
|
125
97
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
receiptData: responseBody?.unified_receipt?.latest_receipt, // eslint-disable-line
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
resolvedContext,
|
|
137
|
-
);
|
|
138
|
-
const orderId = checkedOut._id;
|
|
139
|
-
const enrollment = await modules.enrollments.findEnrollment({
|
|
140
|
-
orderId,
|
|
141
|
-
});
|
|
142
|
-
await fixPeriods(
|
|
143
|
-
{
|
|
144
|
-
transactionId: latestTransaction.original_transaction_id,
|
|
145
|
-
transactions,
|
|
146
|
-
enrollmentId: enrollment._id,
|
|
147
|
-
orderId,
|
|
148
|
-
},
|
|
149
|
-
resolvedContext,
|
|
150
|
-
);
|
|
98
|
+
if (responseBody.notification_type === AppleNotificationTypes.INITIAL_BUY) {
|
|
99
|
+
// Find the cart to checkout
|
|
100
|
+
const orderPayment = await modules.orders.payments.findOrderPaymentByContextData({
|
|
101
|
+
context: {
|
|
102
|
+
'meta.transactionIdentifier': latestTransaction.transaction_id,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
151
105
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
} else {
|
|
157
|
-
// Just store payment credentials, use the enrollments paymentProvider reference and
|
|
158
|
-
// let the job do the rest
|
|
159
|
-
const originalOrderPayment = await modules.orders.payments.findOrderPaymentByContextData({
|
|
160
|
-
context: {
|
|
161
|
-
'meta.transactionIdentifier': latestTransaction.original_transaction_id,
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
if (!originalOrderPayment) throw new Error('Could not find any matching order payment');
|
|
165
|
-
const originalOrder = await modules.orders.findOrder({
|
|
166
|
-
orderId: originalOrderPayment.orderId,
|
|
167
|
-
});
|
|
168
|
-
const enrollment = await modules.enrollments.findEnrollment({
|
|
169
|
-
orderId: originalOrder._id,
|
|
170
|
-
});
|
|
106
|
+
if (!orderPayment) throw new Error('Could not find any matching order payment');
|
|
107
|
+
const order = await modules.orders.findOrder({
|
|
108
|
+
orderId: orderPayment.orderId,
|
|
109
|
+
});
|
|
171
110
|
|
|
172
|
-
|
|
173
|
-
|
|
111
|
+
if (modules.orders.isCart(order)) {
|
|
112
|
+
// checkout if is cart, else just ignore because the cart is already checked out
|
|
113
|
+
// through submission of the receipt with GraphQL
|
|
114
|
+
const checkedOut = await modules.orders.checkout(
|
|
115
|
+
order._id,
|
|
174
116
|
{
|
|
175
|
-
|
|
117
|
+
paymentContext: {
|
|
176
118
|
receiptData: responseBody?.unified_receipt?.latest_receipt, // eslint-disable-line
|
|
177
119
|
},
|
|
178
120
|
},
|
|
179
121
|
resolvedContext,
|
|
180
122
|
);
|
|
181
|
-
|
|
123
|
+
const orderId = checkedOut._id;
|
|
124
|
+
const enrollment = await modules.enrollments.findEnrollment({
|
|
125
|
+
orderId,
|
|
126
|
+
});
|
|
182
127
|
await fixPeriods(
|
|
183
128
|
{
|
|
184
129
|
transactionId: latestTransaction.original_transaction_id,
|
|
185
130
|
transactions,
|
|
186
131
|
enrollmentId: enrollment._id,
|
|
187
|
-
orderId
|
|
132
|
+
orderId,
|
|
188
133
|
},
|
|
189
134
|
resolvedContext,
|
|
190
135
|
);
|
|
191
136
|
|
|
192
|
-
logger.info(
|
|
193
|
-
|
|
194
|
-
);
|
|
137
|
+
logger.info(`Apple IAP Webhook: Confirmed checkout for order ${checkedOut.orderNumber}`, {
|
|
138
|
+
orderId: checkedOut._id,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
} else {
|
|
142
|
+
// Just store payment credentials, use the enrollments paymentProvider reference and
|
|
143
|
+
// let the job do the rest
|
|
144
|
+
const originalOrderPayment = await modules.orders.payments.findOrderPaymentByContextData({
|
|
145
|
+
context: {
|
|
146
|
+
'meta.transactionIdentifier': latestTransaction.original_transaction_id,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
if (!originalOrderPayment) throw new Error('Could not find any matching order payment');
|
|
150
|
+
const originalOrder = await modules.orders.findOrder({
|
|
151
|
+
orderId: originalOrderPayment.orderId,
|
|
152
|
+
});
|
|
153
|
+
const enrollment = await modules.enrollments.findEnrollment({
|
|
154
|
+
orderId: originalOrder._id,
|
|
155
|
+
});
|
|
195
156
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
157
|
+
await services.payment.registerPaymentCredentials(
|
|
158
|
+
enrollment.payment.paymentProviderId,
|
|
159
|
+
{
|
|
160
|
+
transactionContext: {
|
|
161
|
+
receiptData: responseBody?.unified_receipt?.latest_receipt, // eslint-disable-line
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
resolvedContext,
|
|
165
|
+
);
|
|
204
166
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
167
|
+
await fixPeriods(
|
|
168
|
+
{
|
|
169
|
+
transactionId: latestTransaction.original_transaction_id,
|
|
170
|
+
transactions,
|
|
171
|
+
enrollmentId: enrollment._id,
|
|
172
|
+
orderId: originalOrder._id,
|
|
173
|
+
},
|
|
174
|
+
resolvedContext,
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
logger.info(
|
|
178
|
+
`Apple IAP Webhook: Processed notification for ${latestTransaction.original_transaction_id} and type ${responseBody.notification_type}`,
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
if (responseBody.notification_type === AppleNotificationTypes.DID_RECOVER) {
|
|
182
|
+
if (
|
|
183
|
+
enrollment.status !== EnrollmentStatus.TERMINATED &&
|
|
184
|
+
responseBody.auto_renew_status === 'false'
|
|
185
|
+
) {
|
|
186
|
+
await modules.enrollments.terminateEnrollment(enrollment, {}, resolvedContext);
|
|
212
187
|
}
|
|
213
|
-
logger.info(`Apple IAP Webhook: Updated enrollment from Apple`);
|
|
214
188
|
}
|
|
215
189
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
190
|
+
if (responseBody.notification_type === AppleNotificationTypes.DID_CHANGE_RENEWAL_STATUS) {
|
|
191
|
+
if (
|
|
192
|
+
enrollment.status !== EnrollmentStatus.TERMINATED &&
|
|
193
|
+
responseBody.auto_renew_status === 'false'
|
|
194
|
+
) {
|
|
195
|
+
await modules.enrollments.terminateEnrollment(enrollment, {}, resolvedContext);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
logger.info(`Apple IAP Webhook: Updated enrollment from Apple`);
|
|
224
199
|
}
|
|
200
|
+
|
|
201
|
+
res.writeHead(200);
|
|
202
|
+
res.end();
|
|
203
|
+
return;
|
|
204
|
+
} catch (e) {
|
|
205
|
+
logger.warn(`Apple IAP Webhook: ${e.message}`, e);
|
|
206
|
+
res.writeHead(503);
|
|
207
|
+
res.end(JSON.stringify({ name: e.name, code: e.code, message: e.message }));
|
|
208
|
+
return;
|
|
225
209
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
210
|
+
}
|
|
211
|
+
res.writeHead(404);
|
|
212
|
+
res.end();
|
|
229
213
|
};
|
|
230
214
|
|
|
231
215
|
const AppleIAP: IPaymentAdapter = {
|