@unchainedshop/api 2.10.4 → 2.10.6
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/createApolloMiddleware.d.ts +1 -1
- package/lib/express/createApolloMiddleware.js +3 -1
- package/lib/express/createApolloMiddleware.js.map +1 -1
- package/lib/express/createBulkImportMiddleware.d.ts +1 -2
- package/lib/express/createBulkImportMiddleware.js +35 -35
- package/lib/express/createBulkImportMiddleware.js.map +1 -1
- package/lib/express/createERCMetadataMiddleware.d.ts +1 -2
- package/lib/express/createERCMetadataMiddleware.js +38 -38
- package/lib/express/createERCMetadataMiddleware.js.map +1 -1
- package/lib/express/createSingleSignOnMiddleware.d.ts +2 -3
- package/lib/express/createSingleSignOnMiddleware.js +19 -19
- package/lib/express/createSingleSignOnMiddleware.js.map +1 -1
- package/lib/express/index.js +17 -15
- package/lib/express/index.js.map +1 -1
- package/package.json +12 -12
- package/src/express/createApolloMiddleware.ts +4 -5
- package/src/express/createBulkImportMiddleware.ts +38 -41
- package/src/express/createERCMetadataMiddleware.ts +41 -42
- package/src/express/createSingleSignOnMiddleware.ts +18 -18
- package/src/express/index.ts +21 -25
- package/tsconfig.json +3 -5
|
@@ -2,7 +2,9 @@ import cors from 'cors';
|
|
|
2
2
|
import { expressMiddleware } from '@apollo/server/express4';
|
|
3
3
|
import graphqlUploadExpress from 'graphql-upload/graphqlUploadExpress.mjs';
|
|
4
4
|
import e from 'express';
|
|
5
|
-
|
|
5
|
+
import { getCurrentContextResolver } from '../context.js';
|
|
6
|
+
export default function createApolloMiddleware(apolloGraphQLServer, { corsOrigins = undefined } = {}) {
|
|
7
|
+
const contextResolver = getCurrentContextResolver();
|
|
6
8
|
const originFn = corsOrigins && Array.isArray(corsOrigins)
|
|
7
9
|
? (origin, callback) => {
|
|
8
10
|
if (corsOrigins.length === 0 || !origin) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createApolloMiddleware.js","sourceRoot":"","sources":["../../src/express/createApolloMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,oBAAoB,MAAM,yCAAyC,CAAC;AAC3E,OAAO,CAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"createApolloMiddleware.js","sourceRoot":"","sources":["../../src/express/createApolloMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,oBAAoB,MAAM,yCAAyC,CAAC;AAC3E,OAAO,CAAC,MAAM,SAAS,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,mBAAmB,EAAE,EAAE,WAAW,GAAG,SAAS,EAAE,GAAG,EAAE;IAClG,MAAM,eAAe,GAAG,yBAAyB,EAAE,CAAC;IAEpD,MAAM,QAAQ,GACZ,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QACvC,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACnB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACH,CAAC,CAAC,WAAW,CAAC;IAElB,OAAO;QACL,IAAI,CACF,CAAC,QAAQ;YACP,CAAC,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,IAAI;aAClB,CACN;QACD,CAAC,CAAC,IAAI,EAAE;QACR,oBAAoB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC7D,iBAAiB,CAAC,mBAAmB,EAAE;YACrC,OAAO,EAAE,eAAe;SACzB,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export default function bulkImportMiddleware(contextResolver: UnchainedContextResolver): (req: any, res: any) => Promise<void>;
|
|
1
|
+
export default function bulkImportMiddleware(req: any, res: any): Promise<void>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createLogger } from '@unchainedshop/logger';
|
|
2
2
|
import { checkAction } from '../acl.js';
|
|
3
3
|
import { actions } from '../roles/index.js';
|
|
4
|
+
import { getCurrentContextResolver } from '../context.js';
|
|
4
5
|
const logger = createLogger('unchained:bulk-import');
|
|
5
6
|
const errorHandler = (res) => (e) => {
|
|
6
7
|
logger.error(e.message);
|
|
@@ -12,41 +13,40 @@ const methodWrongHandler = (res) => () => {
|
|
|
12
13
|
res.writeHead(404);
|
|
13
14
|
res.end();
|
|
14
15
|
};
|
|
15
|
-
export default function bulkImportMiddleware(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
const context = await contextResolver({ req, res });
|
|
23
|
-
await checkAction(context, actions.bulkImport);
|
|
24
|
-
const input = {
|
|
25
|
-
createShouldUpsertIfIDExists: !!req.query?.createShouldUpsertIfIDExists,
|
|
26
|
-
skipCacheInvalidation: !!req.query?.skipCacheInvalidation,
|
|
27
|
-
remoteAddress: context.remoteAddress,
|
|
28
|
-
};
|
|
29
|
-
const date = new Date().toISOString();
|
|
30
|
-
const file = await context.services.files.uploadFileFromStream({
|
|
31
|
-
directoryName: 'bulk-import-streams',
|
|
32
|
-
rawFile: Promise.resolve({ filename: `${date}.json`, createReadStream: () => req }),
|
|
33
|
-
meta: {},
|
|
34
|
-
}, context);
|
|
35
|
-
input.payloadId = file._id;
|
|
36
|
-
input.payloadSize = file.size;
|
|
37
|
-
const purgedInput = Object.fromEntries(Object.entries(input).filter(([, value]) => Boolean(value)));
|
|
38
|
-
const work = await context.modules.worker.addWork({
|
|
39
|
-
type: 'BULK_IMPORT',
|
|
40
|
-
input: purgedInput,
|
|
41
|
-
retries: 0,
|
|
42
|
-
priority: 10,
|
|
43
|
-
});
|
|
44
|
-
res.writeHead(200);
|
|
45
|
-
res.end(JSON.stringify(work));
|
|
16
|
+
export default async function bulkImportMiddleware(req, res) {
|
|
17
|
+
try {
|
|
18
|
+
if (req.method !== 'POST') {
|
|
19
|
+
methodWrongHandler(res)();
|
|
20
|
+
return;
|
|
46
21
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
22
|
+
const contextResolver = getCurrentContextResolver();
|
|
23
|
+
const context = await contextResolver({ req, res });
|
|
24
|
+
await checkAction(context, actions.bulkImport);
|
|
25
|
+
const input = {
|
|
26
|
+
createShouldUpsertIfIDExists: !!req.query?.createShouldUpsertIfIDExists,
|
|
27
|
+
skipCacheInvalidation: !!req.query?.skipCacheInvalidation,
|
|
28
|
+
remoteAddress: context.remoteAddress,
|
|
29
|
+
};
|
|
30
|
+
const date = new Date().toISOString();
|
|
31
|
+
const file = await context.services.files.uploadFileFromStream({
|
|
32
|
+
directoryName: 'bulk-import-streams',
|
|
33
|
+
rawFile: Promise.resolve({ filename: `${date}.json`, createReadStream: () => req }),
|
|
34
|
+
meta: {},
|
|
35
|
+
}, context);
|
|
36
|
+
input.payloadId = file._id;
|
|
37
|
+
input.payloadSize = file.size;
|
|
38
|
+
const purgedInput = Object.fromEntries(Object.entries(input).filter(([, value]) => Boolean(value)));
|
|
39
|
+
const work = await context.modules.worker.addWork({
|
|
40
|
+
type: 'BULK_IMPORT',
|
|
41
|
+
input: purgedInput,
|
|
42
|
+
retries: 0,
|
|
43
|
+
priority: 10,
|
|
44
|
+
});
|
|
45
|
+
res.writeHead(200);
|
|
46
|
+
res.end(JSON.stringify(work));
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
errorHandler(res)(e);
|
|
50
|
+
}
|
|
51
51
|
}
|
|
52
52
|
//# sourceMappingURL=createBulkImportMiddleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBulkImportMiddleware.js","sourceRoot":"","sources":["../../src/express/createBulkImportMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"createBulkImportMiddleware.js","sourceRoot":"","sources":["../../src/express/createBulkImportMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import { IncomingMessage } from 'http';
|
|
3
|
-
|
|
4
|
-
export default function ercMetadataMiddleware(contextResolver: UnchainedContextResolver): (req: IncomingMessage, res: any) => Promise<void>;
|
|
3
|
+
export default function ercMetadataMiddleware(req: IncomingMessage, res: any): Promise<void>;
|
|
@@ -2,6 +2,7 @@ import path from 'path';
|
|
|
2
2
|
import { createLogger } from '@unchainedshop/logger';
|
|
3
3
|
import { systemLocale } from '@unchainedshop/utils';
|
|
4
4
|
import localePkg from 'locale';
|
|
5
|
+
import { getCurrentContextResolver } from '../context.js';
|
|
5
6
|
const { Locale } = localePkg;
|
|
6
7
|
const logger = createLogger('unchained:erc-metadata');
|
|
7
8
|
const errorHandler = (res) => (e) => {
|
|
@@ -14,44 +15,43 @@ const methodWrongHandler = (res) => () => {
|
|
|
14
15
|
res.writeHead(404);
|
|
15
16
|
res.end();
|
|
16
17
|
};
|
|
17
|
-
export default function ercMetadataMiddleware(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const context = await contextResolver({ req, res });
|
|
25
|
-
const url = new URL(req.url, process.env.ROOT_URL);
|
|
26
|
-
const parsedPath = path.parse(url.pathname);
|
|
27
|
-
if (parsedPath.ext !== '.json')
|
|
28
|
-
throw new Error('Invalid ERC Metadata URI');
|
|
29
|
-
const [, productId, localeOrTokenFilename, tokenFileName] = url.pathname.split('/');
|
|
30
|
-
const locale = tokenFileName ? localeOrTokenFilename : systemLocale.language;
|
|
31
|
-
const chainTokenId = parsedPath.name;
|
|
32
|
-
const product = await context.modules.products.findProduct({
|
|
33
|
-
productId,
|
|
34
|
-
});
|
|
35
|
-
const [token] = await context.modules.warehousing.findTokens({
|
|
36
|
-
chainTokenId,
|
|
37
|
-
contractAddress: product?.tokenization?.contractAddress,
|
|
38
|
-
});
|
|
39
|
-
const ercMetadata = await context.modules.warehousing.tokenMetadata(chainTokenId, {
|
|
40
|
-
token,
|
|
41
|
-
product,
|
|
42
|
-
locale: new Locale(locale),
|
|
43
|
-
referenceDate: new Date(),
|
|
44
|
-
}, context);
|
|
45
|
-
const body = JSON.stringify(ercMetadata);
|
|
46
|
-
res.writeHead(200, {
|
|
47
|
-
'Content-Length': Buffer.byteLength(body),
|
|
48
|
-
'Content-Type': 'text/plain',
|
|
49
|
-
});
|
|
50
|
-
res.end(body);
|
|
18
|
+
export default async function ercMetadataMiddleware(req, res) {
|
|
19
|
+
try {
|
|
20
|
+
if (req.method !== 'GET') {
|
|
21
|
+
methodWrongHandler(res)();
|
|
22
|
+
return;
|
|
51
23
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
24
|
+
const contextResolver = getCurrentContextResolver();
|
|
25
|
+
const context = await contextResolver({ req, res });
|
|
26
|
+
const url = new URL(req.url, process.env.ROOT_URL);
|
|
27
|
+
const parsedPath = path.parse(url.pathname);
|
|
28
|
+
if (parsedPath.ext !== '.json')
|
|
29
|
+
throw new Error('Invalid ERC Metadata URI');
|
|
30
|
+
const [, productId, localeOrTokenFilename, tokenFileName] = url.pathname.split('/');
|
|
31
|
+
const locale = tokenFileName ? localeOrTokenFilename : systemLocale.language;
|
|
32
|
+
const chainTokenId = parsedPath.name;
|
|
33
|
+
const product = await context.modules.products.findProduct({
|
|
34
|
+
productId,
|
|
35
|
+
});
|
|
36
|
+
const [token] = await context.modules.warehousing.findTokens({
|
|
37
|
+
chainTokenId,
|
|
38
|
+
contractAddress: product?.tokenization?.contractAddress,
|
|
39
|
+
});
|
|
40
|
+
const ercMetadata = await context.modules.warehousing.tokenMetadata(chainTokenId, {
|
|
41
|
+
token,
|
|
42
|
+
product,
|
|
43
|
+
locale: new Locale(locale),
|
|
44
|
+
referenceDate: new Date(),
|
|
45
|
+
}, context);
|
|
46
|
+
const body = JSON.stringify(ercMetadata);
|
|
47
|
+
res.writeHead(200, {
|
|
48
|
+
'Content-Length': Buffer.byteLength(body),
|
|
49
|
+
'Content-Type': 'text/plain',
|
|
50
|
+
});
|
|
51
|
+
res.end(body);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
errorHandler(res)(e);
|
|
55
|
+
}
|
|
56
56
|
}
|
|
57
57
|
//# sourceMappingURL=createERCMetadataMiddleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createERCMetadataMiddleware.js","sourceRoot":"","sources":["../../src/express/createERCMetadataMiddleware.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"createERCMetadataMiddleware.js","sourceRoot":"","sources":["../../src/express/createERCMetadataMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference lib="dom" />
|
|
3
3
|
import { IncomingMessage } from 'http';
|
|
4
|
-
|
|
5
|
-
export default function singleSignOnMiddleware(contextResolver: UnchainedContextResolver): (req: IncomingMessage & {
|
|
4
|
+
export default function singleSignOnMiddleware(req: IncomingMessage & {
|
|
6
5
|
query?: any;
|
|
7
|
-
}, res: any, next: any)
|
|
6
|
+
}, res: any, next: any): Promise<void>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createLogger } from '@unchainedshop/logger';
|
|
2
2
|
import cookie from 'cookie';
|
|
3
|
+
import { getCurrentContextResolver } from '../context.js';
|
|
3
4
|
const { ROOT_URL, NODE_ENV, UNCHAINED_CLOUD_ENDPOINT } = process.env;
|
|
4
5
|
const logger = createLogger('unchained:unchained-cloud-sso');
|
|
5
6
|
const loginWithSingleSignOn = async (remoteToken, context) => {
|
|
@@ -48,26 +49,25 @@ const loginWithSingleSignOn = async (remoteToken, context) => {
|
|
|
48
49
|
}
|
|
49
50
|
throw new Error('Invalid token/domain pair');
|
|
50
51
|
};
|
|
51
|
-
export default function singleSignOnMiddleware(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
52
|
+
export default async function singleSignOnMiddleware(req, res, next) {
|
|
53
|
+
try {
|
|
54
|
+
if (req.query?.token && UNCHAINED_CLOUD_ENDPOINT) {
|
|
55
|
+
const contextResolver = getCurrentContextResolver();
|
|
56
|
+
const context = await contextResolver({ req, res });
|
|
57
|
+
const authCookie = await loginWithSingleSignOn(req.query.token, context);
|
|
58
|
+
if (authCookie) {
|
|
59
|
+
res.writeHead(303, {
|
|
60
|
+
'Set-Cookie': authCookie,
|
|
61
|
+
Location: '/',
|
|
62
|
+
});
|
|
63
|
+
res.end();
|
|
64
|
+
return;
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
logger.error(e.message);
|
|
70
|
+
}
|
|
71
|
+
next();
|
|
72
72
|
}
|
|
73
73
|
//# sourceMappingURL=createSingleSignOnMiddleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSingleSignOnMiddleware.js","sourceRoot":"","sources":["../../src/express/createSingleSignOnMiddleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"createSingleSignOnMiddleware.js","sourceRoot":"","sources":["../../src/express/createSingleSignOnMiddleware.ts"],"names":[],"mappings":"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"}
|
package/lib/express/index.js
CHANGED
|
@@ -4,24 +4,26 @@ import createERCMetadataMiddleware from './createERCMetadataMiddleware.js';
|
|
|
4
4
|
import createApolloMiddleware from './createApolloMiddleware.js';
|
|
5
5
|
import createSingleSignOnMiddleware from './createSingleSignOnMiddleware.js';
|
|
6
6
|
const { BULK_IMPORT_API_PATH = '/bulk-import', ERC_METADATA_API_PATH = '/erc-metadata', GRAPHQL_API_PATH = '/graphql', } = process.env;
|
|
7
|
+
const addContext = async function middlewareWithContext(req, res, next) {
|
|
8
|
+
try {
|
|
9
|
+
const context = getCurrentContextResolver();
|
|
10
|
+
req.unchainedContext = await context({ req, res });
|
|
11
|
+
next();
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
next(error);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
7
17
|
export const useMiddlewareWithCurrentContext = (expressApp, path, ...middleware) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
req.unchainedContext = await context({ req, res });
|
|
12
|
-
next();
|
|
13
|
-
}
|
|
14
|
-
catch (error) {
|
|
15
|
-
next(error);
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
+
if (!path) {
|
|
19
|
+
throw new Error('Path is required for useMiddlewareWithCurrentContext');
|
|
20
|
+
}
|
|
18
21
|
expressApp.use(path, addContext, ...middleware);
|
|
19
22
|
};
|
|
20
23
|
export const connect = (expressApp, { apolloGraphQLServer }, options) => {
|
|
21
|
-
|
|
22
|
-
expressApp.use(
|
|
23
|
-
expressApp.use(
|
|
24
|
-
expressApp.use(
|
|
25
|
-
expressApp.use(['/', '/.well-known/unchained/cloud-sso'], createSingleSignOnMiddleware(contextResolver));
|
|
24
|
+
expressApp.use(GRAPHQL_API_PATH, createApolloMiddleware(apolloGraphQLServer, options));
|
|
25
|
+
expressApp.use(ERC_METADATA_API_PATH, createERCMetadataMiddleware);
|
|
26
|
+
expressApp.use(BULK_IMPORT_API_PATH, createBulkImportMiddleware);
|
|
27
|
+
expressApp.use(['/', '/.well-known/unchained/cloud-sso'], createSingleSignOnMiddleware);
|
|
26
28
|
};
|
|
27
29
|
//# sourceMappingURL=index.js.map
|
package/lib/express/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,0BAA0B,MAAM,iCAAiC,CAAC;AACzE,OAAO,2BAA2B,MAAM,kCAAkC,CAAC;AAC3E,OAAO,sBAAsB,MAAM,6BAA6B,CAAC;AACjE,OAAO,4BAA4B,MAAM,mCAAmC,CAAC;AAE7E,MAAM,EACJ,oBAAoB,GAAG,cAAc,EACrC,qBAAqB,GAAG,eAAe,EACvC,gBAAgB,GAAG,UAAU,GAC9B,GAAG,OAAO,CAAC,GAAG,CAAC;AAEhB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,0BAA0B,MAAM,iCAAiC,CAAC;AACzE,OAAO,2BAA2B,MAAM,kCAAkC,CAAC;AAC3E,OAAO,sBAAsB,MAAM,6BAA6B,CAAC;AACjE,OAAO,4BAA4B,MAAM,mCAAmC,CAAC;AAE7E,MAAM,EACJ,oBAAoB,GAAG,cAAc,EACrC,qBAAqB,GAAG,eAAe,EACvC,gBAAgB,GAAG,UAAU,GAC9B,GAAG,OAAO,CAAC,GAAG,CAAC;AAEhB,MAAM,UAAU,GAAG,KAAK,UAAU,qBAAqB,CACrD,GAA0D,EAC1D,GAAoB,EACpB,IAAI;IAEJ,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,yBAAyB,EAAE,CAAC;QAC5C,GAAG,CAAC,gBAAgB,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE;IACjF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,UAAqB,EACrB,EAAE,mBAAmB,EAAyC,EAC9D,OAA+B,EAC/B,EAAE;IACF,UAAU,CAAC,GAAG,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC;IACvF,UAAU,CAAC,GAAG,CAAC,qBAAqB,EAAE,2BAA2B,CAAC,CAAC;IACnE,UAAU,CAAC,GAAG,CAAC,oBAAoB,EAAE,0BAA0B,CAAC,CAAC;IACjE,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,kCAAkC,CAAC,EAAE,4BAA4B,CAAC,CAAC;AAC1F,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unchainedshop/api",
|
|
3
|
-
"version": "2.10.
|
|
3
|
+
"version": "2.10.6",
|
|
4
4
|
"main": "lib/api-index.js",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./lib/api-index.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"type": "module",
|
|
20
20
|
"scripts": {
|
|
21
21
|
"clean": "rm -rf lib",
|
|
22
|
-
"
|
|
22
|
+
"prepublishOnly": "npm run clean && tsc",
|
|
23
23
|
"watch": "tsc -w",
|
|
24
24
|
"test": "NODE_OPTIONS=--experimental-vm-modules jest --detectOpenHandles --forceExit",
|
|
25
25
|
"test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch --detectOpenHandles --forceExit"
|
|
@@ -41,18 +41,18 @@
|
|
|
41
41
|
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"@apollo/server": "^4.10.4",
|
|
44
|
-
"cookie": "
|
|
44
|
+
"cookie": "~0.6"
|
|
45
45
|
},
|
|
46
46
|
"optionalDependencies": {
|
|
47
|
-
"express": "
|
|
47
|
+
"express": "~4"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@metamask/eth-sig-util": "^7.0.2",
|
|
51
|
-
"@unchainedshop/core": "^2.10.
|
|
52
|
-
"@unchainedshop/events": "^2.10.
|
|
53
|
-
"@unchainedshop/logger": "^2.10.
|
|
54
|
-
"@unchainedshop/roles": "^2.10.
|
|
55
|
-
"@unchainedshop/utils": "^2.10.
|
|
51
|
+
"@unchainedshop/core": "^2.10.6",
|
|
52
|
+
"@unchainedshop/events": "^2.10.6",
|
|
53
|
+
"@unchainedshop/logger": "^2.10.6",
|
|
54
|
+
"@unchainedshop/roles": "^2.10.6",
|
|
55
|
+
"@unchainedshop/utils": "^2.10.6",
|
|
56
56
|
"accounting": "0.4.1",
|
|
57
57
|
"dataloader": "^2.2.2",
|
|
58
58
|
"graphql-scalars": "^1.23.0",
|
|
@@ -64,11 +64,11 @@
|
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"@types/graphql-upload": "^16.0.7",
|
|
66
66
|
"@types/locale": "^0.1.4",
|
|
67
|
-
"@types/node": "^20.14.
|
|
68
|
-
"@unchainedshop/types": "^2.10.
|
|
67
|
+
"@types/node": "^20.14.5",
|
|
68
|
+
"@unchainedshop/types": "^2.10.6",
|
|
69
69
|
"express": "^4.19.2",
|
|
70
70
|
"jest": "^29.7.0",
|
|
71
|
-
"ts-jest": "^29.1.
|
|
71
|
+
"ts-jest": "^29.1.5",
|
|
72
72
|
"typescript": "^5.4.5"
|
|
73
73
|
}
|
|
74
74
|
}
|
|
@@ -2,12 +2,11 @@ import cors from 'cors';
|
|
|
2
2
|
import { expressMiddleware } from '@apollo/server/express4';
|
|
3
3
|
import graphqlUploadExpress from 'graphql-upload/graphqlUploadExpress.mjs';
|
|
4
4
|
import e from 'express';
|
|
5
|
+
import { getCurrentContextResolver } from '../context.js';
|
|
6
|
+
|
|
7
|
+
export default function createApolloMiddleware(apolloGraphQLServer, { corsOrigins = undefined } = {}) {
|
|
8
|
+
const contextResolver = getCurrentContextResolver();
|
|
5
9
|
|
|
6
|
-
export default function createApolloMiddleware(
|
|
7
|
-
contextResolver,
|
|
8
|
-
apolloGraphQLServer,
|
|
9
|
-
{ corsOrigins = undefined } = {},
|
|
10
|
-
) {
|
|
11
10
|
const originFn =
|
|
12
11
|
corsOrigins && Array.isArray(corsOrigins)
|
|
13
12
|
? (origin, callback) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from '@unchainedshop/logger';
|
|
2
|
-
import { UnchainedContextResolver } from '@unchainedshop/types/api.js';
|
|
3
2
|
import { checkAction } from '../acl.js';
|
|
4
3
|
import { actions } from '../roles/index.js';
|
|
4
|
+
import { getCurrentContextResolver } from '../context.js';
|
|
5
5
|
|
|
6
6
|
const logger = createLogger('unchained:bulk-import');
|
|
7
7
|
|
|
@@ -17,52 +17,49 @@ const methodWrongHandler = (res) => () => {
|
|
|
17
17
|
res.end();
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
export default function bulkImportMiddleware(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
20
|
+
export default async function bulkImportMiddleware(req, res) {
|
|
21
|
+
try {
|
|
22
|
+
if (req.method !== 'POST') {
|
|
23
|
+
methodWrongHandler(res)();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const contextResolver = getCurrentContextResolver();
|
|
28
|
+
const context = await contextResolver({ req, res });
|
|
29
|
+
await checkAction(context, (actions as any).bulkImport);
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
const input: any = {
|
|
32
|
+
createShouldUpsertIfIDExists: !!req.query?.createShouldUpsertIfIDExists,
|
|
33
|
+
skipCacheInvalidation: !!req.query?.skipCacheInvalidation,
|
|
34
|
+
remoteAddress: context.remoteAddress,
|
|
35
|
+
};
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
const date = new Date().toISOString();
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
const file = await context.services.files.uploadFileFromStream(
|
|
40
|
+
{
|
|
41
|
+
directoryName: 'bulk-import-streams',
|
|
42
|
+
rawFile: Promise.resolve({ filename: `${date}.json`, createReadStream: () => req }),
|
|
43
|
+
meta: {},
|
|
44
|
+
},
|
|
45
|
+
context,
|
|
46
|
+
);
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
input.payloadId = file._id;
|
|
49
|
+
input.payloadSize = file.size;
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
Object.entries(input).filter(([, value]) => Boolean(value)),
|
|
53
|
-
);
|
|
51
|
+
const purgedInput = Object.fromEntries(Object.entries(input).filter(([, value]) => Boolean(value)));
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
const work = await context.modules.worker.addWork({
|
|
54
|
+
type: 'BULK_IMPORT',
|
|
55
|
+
input: purgedInput,
|
|
56
|
+
retries: 0,
|
|
57
|
+
priority: 10,
|
|
58
|
+
});
|
|
61
59
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
};
|
|
60
|
+
res.writeHead(200);
|
|
61
|
+
res.end(JSON.stringify(work));
|
|
62
|
+
} catch (e) {
|
|
63
|
+
errorHandler(res)(e);
|
|
64
|
+
}
|
|
68
65
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { IncomingMessage } from 'http';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { createLogger } from '@unchainedshop/logger';
|
|
4
|
-
import { UnchainedContextResolver } from '@unchainedshop/types/api.js';
|
|
5
4
|
import { systemLocale } from '@unchainedshop/utils';
|
|
6
5
|
import localePkg from 'locale';
|
|
6
|
+
import { getCurrentContextResolver } from '../context.js';
|
|
7
7
|
|
|
8
8
|
const { Locale } = localePkg;
|
|
9
9
|
|
|
@@ -21,53 +21,52 @@ const methodWrongHandler = (res) => () => {
|
|
|
21
21
|
res.end();
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
export default function ercMetadataMiddleware(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
24
|
+
export default async function ercMetadataMiddleware(req: IncomingMessage, res) {
|
|
25
|
+
try {
|
|
26
|
+
if (req.method !== 'GET') {
|
|
27
|
+
methodWrongHandler(res)();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
const contextResolver = getCurrentContextResolver();
|
|
32
|
+
const context = await contextResolver({ req, res });
|
|
33
|
+
const url = new URL(req.url, process.env.ROOT_URL);
|
|
34
|
+
const parsedPath = path.parse(url.pathname);
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
if (parsedPath.ext !== '.json') throw new Error('Invalid ERC Metadata URI');
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
const [, productId, localeOrTokenFilename, tokenFileName] = url.pathname.split('/');
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
const locale = tokenFileName ? localeOrTokenFilename : systemLocale.language;
|
|
41
|
+
const chainTokenId = parsedPath.name;
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
const product = await context.modules.products.findProduct({
|
|
44
|
+
productId,
|
|
45
|
+
});
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
const [token] = await context.modules.warehousing.findTokens({
|
|
48
|
+
chainTokenId,
|
|
49
|
+
contractAddress: product?.tokenization?.contractAddress,
|
|
50
|
+
});
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
const ercMetadata = await context.modules.warehousing.tokenMetadata(
|
|
53
|
+
chainTokenId,
|
|
54
|
+
{
|
|
55
|
+
token,
|
|
56
|
+
product,
|
|
57
|
+
locale: new Locale(locale),
|
|
58
|
+
referenceDate: new Date(),
|
|
59
|
+
},
|
|
60
|
+
context,
|
|
61
|
+
);
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
};
|
|
63
|
+
const body = JSON.stringify(ercMetadata);
|
|
64
|
+
res.writeHead(200, {
|
|
65
|
+
'Content-Length': Buffer.byteLength(body),
|
|
66
|
+
'Content-Type': 'text/plain',
|
|
67
|
+
});
|
|
68
|
+
res.end(body);
|
|
69
|
+
} catch (e) {
|
|
70
|
+
errorHandler(res)(e);
|
|
71
|
+
}
|
|
73
72
|
}
|
|
@@ -4,6 +4,7 @@ import { createLogger } from '@unchainedshop/logger';
|
|
|
4
4
|
import { UnchainedContextResolver } from '@unchainedshop/types/api.js';
|
|
5
5
|
import { UnchainedCore } from '@unchainedshop/types/core.js';
|
|
6
6
|
import cookie from 'cookie';
|
|
7
|
+
import { getCurrentContextResolver } from '../context.js';
|
|
7
8
|
|
|
8
9
|
const { ROOT_URL, NODE_ENV, UNCHAINED_CLOUD_ENDPOINT } = process.env;
|
|
9
10
|
|
|
@@ -63,25 +64,24 @@ const loginWithSingleSignOn = async (remoteToken, context: UnchainedCore) => {
|
|
|
63
64
|
throw new Error('Invalid token/domain pair');
|
|
64
65
|
};
|
|
65
66
|
|
|
66
|
-
export default function singleSignOnMiddleware(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
export default async function singleSignOnMiddleware(req: IncomingMessage & { query?: any }, res, next) {
|
|
68
|
+
try {
|
|
69
|
+
if (req.query?.token && UNCHAINED_CLOUD_ENDPOINT) {
|
|
70
|
+
const contextResolver = getCurrentContextResolver();
|
|
71
|
+
const context = await contextResolver({ req, res });
|
|
72
|
+
const authCookie = await loginWithSingleSignOn(req.query.token, context);
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
74
|
+
if (authCookie) {
|
|
75
|
+
res.writeHead(303, {
|
|
76
|
+
'Set-Cookie': authCookie,
|
|
77
|
+
Location: '/',
|
|
78
|
+
});
|
|
79
|
+
res.end();
|
|
80
|
+
return;
|
|
81
81
|
}
|
|
82
|
-
} catch (e) {
|
|
83
|
-
logger.error(e.message);
|
|
84
82
|
}
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
} catch (e) {
|
|
84
|
+
logger.error(e.message);
|
|
85
|
+
}
|
|
86
|
+
next();
|
|
87
87
|
}
|
package/src/express/index.ts
CHANGED
|
@@ -14,20 +14,24 @@ const {
|
|
|
14
14
|
GRAPHQL_API_PATH = '/graphql',
|
|
15
15
|
} = process.env;
|
|
16
16
|
|
|
17
|
+
const addContext = async function middlewareWithContext(
|
|
18
|
+
req: IncomingMessage & { unchainedContext: UnchainedCore },
|
|
19
|
+
res: OutgoingMessage,
|
|
20
|
+
next,
|
|
21
|
+
) {
|
|
22
|
+
try {
|
|
23
|
+
const context = getCurrentContextResolver();
|
|
24
|
+
req.unchainedContext = await context({ req, res });
|
|
25
|
+
next();
|
|
26
|
+
} catch (error) {
|
|
27
|
+
next(error);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
17
31
|
export const useMiddlewareWithCurrentContext = (expressApp, path, ...middleware) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
res: OutgoingMessage,
|
|
22
|
-
next,
|
|
23
|
-
) {
|
|
24
|
-
try {
|
|
25
|
-
req.unchainedContext = await context({ req, res });
|
|
26
|
-
next();
|
|
27
|
-
} catch (error) {
|
|
28
|
-
next(error);
|
|
29
|
-
}
|
|
30
|
-
};
|
|
32
|
+
if (!path) {
|
|
33
|
+
throw new Error('Path is required for useMiddlewareWithCurrentContext');
|
|
34
|
+
}
|
|
31
35
|
|
|
32
36
|
expressApp.use(path, addContext, ...middleware);
|
|
33
37
|
};
|
|
@@ -37,16 +41,8 @@ export const connect = (
|
|
|
37
41
|
{ apolloGraphQLServer }: { apolloGraphQLServer: ApolloServer },
|
|
38
42
|
options?: { corsOrigins?: any },
|
|
39
43
|
) => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
expressApp.use(
|
|
43
|
-
|
|
44
|
-
createApolloMiddleware(contextResolver, apolloGraphQLServer, options),
|
|
45
|
-
);
|
|
46
|
-
expressApp.use(ERC_METADATA_API_PATH, createERCMetadataMiddleware(contextResolver));
|
|
47
|
-
expressApp.use(BULK_IMPORT_API_PATH, createBulkImportMiddleware(contextResolver));
|
|
48
|
-
expressApp.use(
|
|
49
|
-
['/', '/.well-known/unchained/cloud-sso'],
|
|
50
|
-
createSingleSignOnMiddleware(contextResolver),
|
|
51
|
-
);
|
|
44
|
+
expressApp.use(GRAPHQL_API_PATH, createApolloMiddleware(apolloGraphQLServer, options));
|
|
45
|
+
expressApp.use(ERC_METADATA_API_PATH, createERCMetadataMiddleware);
|
|
46
|
+
expressApp.use(BULK_IMPORT_API_PATH, createBulkImportMiddleware);
|
|
47
|
+
expressApp.use(['/', '/.well-known/unchained/cloud-sso'], createSingleSignOnMiddleware);
|
|
52
48
|
};
|
package/tsconfig.json
CHANGED