@things-factory/shell 5.0.14 → 6.0.0-alpha.0
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/client/elements/custom-alert.js +3 -0
- package/config/config.development.js +31 -22
- package/dist-server/graphql-local-client.d.ts +28 -0
- package/dist-server/index.d.ts +9 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/initializers/database.d.ts +7 -0
- package/dist-server/initializers/database.js +38 -8
- package/dist-server/initializers/database.js.map +1 -1
- package/dist-server/initializers/naming-strategy.d.ts +6 -0
- package/dist-server/middlewares/domain-middleware.d.ts +1 -0
- package/dist-server/middlewares/index.d.ts +2 -0
- package/dist-server/migrations/1000000000000-SeedDomain.d.ts +5 -0
- package/dist-server/migrations/1000000000000-SeedDomain.js +4 -4
- package/dist-server/migrations/1000000000000-SeedDomain.js.map +1 -1
- package/dist-server/migrations/index.d.ts +1 -0
- package/dist-server/pubsub-log-transport.d.ts +8 -0
- package/dist-server/pubsub.d.ts +2 -0
- package/dist-server/routers/domain-router.d.ts +2 -0
- package/dist-server/routers/global-router.d.ts +2 -0
- package/dist-server/routers/index.d.ts +2 -0
- package/dist-server/schema.d.ts +2 -0
- package/dist-server/server-dev.d.ts +1 -0
- package/dist-server/server-dev.js +16 -12
- package/dist-server/server-dev.js.map +1 -1
- package/dist-server/server.d.ts +1 -0
- package/dist-server/server.js +9 -6
- package/dist-server/server.js.map +1 -1
- package/dist-server/service/common-types/index.d.ts +6 -0
- package/dist-server/service/common-types/list-param.d.ts +19 -0
- package/dist-server/service/common-types/list-param.js +1 -1
- package/dist-server/service/common-types/list-param.js.map +1 -1
- package/dist-server/service/common-types/log.d.ts +6 -0
- package/dist-server/service/common-types/object-ref.d.ts +5 -0
- package/dist-server/service/common-types/scalar-any.d.ts +2 -0
- package/dist-server/service/common-types/scalar-date.d.ts +2 -0
- package/dist-server/service/common-types/scalar-object.d.ts +1 -0
- package/dist-server/service/directive-transaction/index.d.ts +1 -0
- package/dist-server/service/directive-transaction/transaction.d.ts +3 -0
- package/dist-server/service/directive-transaction/transaction.js +2 -2
- package/dist-server/service/directive-transaction/transaction.js.map +1 -1
- package/dist-server/service/domain/domain-resolver.d.ts +17 -0
- package/dist-server/service/domain/domain-resolver.js +14 -13
- package/dist-server/service/domain/domain-resolver.js.map +1 -1
- package/dist-server/service/domain/domain-types.d.ts +21 -0
- package/dist-server/service/domain/domain.d.ts +16 -0
- package/dist-server/service/domain/index.d.ts +4 -0
- package/dist-server/service/index.d.ts +14 -0
- package/dist-server/service/subscription-data/data-resolver.d.ts +6 -0
- package/dist-server/service/subscription-data/data-types.d.ts +6 -0
- package/dist-server/service/subscription-data/index.d.ts +3 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/condition-builder.d.ts +17 -0
- package/dist-server/utils/get-domain.d.ts +10 -0
- package/dist-server/utils/get-domain.js +2 -2
- package/dist-server/utils/get-domain.js.map +1 -1
- package/dist-server/utils/get-query-builder-from-list-params.d.ts +21 -0
- package/dist-server/utils/index.d.ts +7 -0
- package/dist-server/utils/list-param-adjuster.d.ts +2 -0
- package/dist-server/utils/list-params-converter.d.ts +16 -0
- package/dist-server/utils/list-params-converter.js.map +1 -1
- package/dist-server/utils/list-query-builder.d.ts +7 -0
- package/dist-server/utils/publish-progress.d.ts +6 -0
- package/dist-server/webpack/koa-webpack/client.d.ts +1 -0
- package/dist-server/webpack/koa-webpack/index.d.ts +2 -0
- package/dist-server/webpack/koa-webpack/middleware.d.ts +0 -0
- package/dist-server/webpack/koa-webpack/validate.d.ts +1 -0
- package/ormconfig.js +2 -3
- package/package.json +8 -7
- package/server/index.ts +1 -0
- package/server/initializers/database.ts +49 -9
- package/server/migrations/1000000000000-SeedDomain.ts +4 -2
- package/server/server-dev.ts +29 -16
- package/server/server.ts +8 -8
- package/server/service/common-types/list-param.ts +4 -3
- package/server/service/directive-transaction/transaction.ts +3 -2
- package/server/service/domain/domain-resolver.ts +7 -6
- package/server/utils/get-domain.ts +2 -2
- package/server/utils/list-params-converter.ts +1 -1
@@ -0,0 +1,17 @@
|
|
1
|
+
export declare const buildCondition: (alias: string, fieldName: string, operator: string, value: any, relation: boolean | string, seq: number) => {
|
2
|
+
clause: string;
|
3
|
+
parameters: {
|
4
|
+
[x: string]: any;
|
5
|
+
};
|
6
|
+
value?: undefined;
|
7
|
+
} | {
|
8
|
+
clause: string;
|
9
|
+
value: {
|
10
|
+
[x: string]: string;
|
11
|
+
};
|
12
|
+
parameters?: undefined;
|
13
|
+
} | {
|
14
|
+
clause: string;
|
15
|
+
parameters?: undefined;
|
16
|
+
value?: undefined;
|
17
|
+
};
|
@@ -0,0 +1,10 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import { URL } from 'url';
|
3
|
+
import { Domain } from '../service/domain/domain';
|
4
|
+
export declare function getUrlFromContext(context: any, path?: string): URL;
|
5
|
+
export declare function getDomainFromURL(context: any): Promise<Domain>;
|
6
|
+
export declare function getCookieDomainFromHostname(hostname: any): any;
|
7
|
+
export declare function getContextPath(subdomain: any): string;
|
8
|
+
export declare function getRedirectSubdomainPath(context: any, subdomain: any, redirectTo?: string): string;
|
9
|
+
export declare function findSubdomainFromPath(context: any, path: any): any;
|
10
|
+
export declare function getSiteRootPath(context: any): string;
|
@@ -1,10 +1,10 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.getSiteRootPath = exports.findSubdomainFromPath = exports.getRedirectSubdomainPath = exports.getContextPath = exports.getCookieDomainFromHostname = exports.getDomainFromURL = exports.getUrlFromContext = void 0;
|
4
|
-
const typeorm_1 = require("typeorm");
|
5
4
|
const url_1 = require("url");
|
6
5
|
const env_1 = require("@things-factory/env");
|
7
6
|
const utils_1 = require("@things-factory/utils");
|
7
|
+
const database_1 = require("../initializers/database");
|
8
8
|
const domain_1 = require("../service/domain/domain");
|
9
9
|
const useVirtualHostBasedDomain = !!env_1.config.get('useVirtualHostBasedDomain');
|
10
10
|
const protocol = env_1.config.get('protocol');
|
@@ -56,7 +56,7 @@ async function getDomainFromURL(context) {
|
|
56
56
|
const { header } = context;
|
57
57
|
const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context);
|
58
58
|
if (subdomain) {
|
59
|
-
return await (0,
|
59
|
+
return await (0, database_1.getRepository)(domain_1.Domain).findOne({ where: { subdomain }, cache: true });
|
60
60
|
}
|
61
61
|
}
|
62
62
|
exports.getDomainFromURL = getDomainFromURL;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"get-domain.js","sourceRoot":"","sources":["../../server/utils/get-domain.ts"],"names":[],"mappings":";;;AAAA,
|
1
|
+
{"version":3,"file":"get-domain.js","sourceRoot":"","sources":["../../server/utils/get-domain.ts"],"names":[],"mappings":"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","sourcesContent":["import { URL } from 'url'\n\nimport { config } from '@things-factory/env'\nimport { getPathInfo } from '@things-factory/utils'\n\nimport { getRepository } from '../initializers/database'\nimport { Domain } from '../service/domain/domain'\n\nconst useVirtualHostBasedDomain = !!config.get('useVirtualHostBasedDomain')\nconst protocol: string = config.get('protocol')\nconst fixed = config.get('subdomain')\nconst subdomainOffset = config.getNumber('subdomainOffset', 2)\n\nexport function getUrlFromContext(context, path = '') {\n const { method, href, host } = context\n const { referer } = context.header\n\n var base = href\n\n if (method !== 'GET' && referer) {\n var { host: refererHost } = new URL(referer)\n if (refererHost === host) {\n base = referer\n }\n }\n\n let url: URL = new URL(path, base)\n url.protocol = protocol || url.protocol\n return url\n}\n\nfunction getSubdomainsFromHost(context: any) {\n const { request } = context\n var subdomains = request.headers.host.split('.').reverse()\n return subdomains.slice(subdomainOffset)\n}\n\nfunction getSubdomainFromPath(context: any) {\n var { path } = context\n\n var domain = getPathInfo(path || '')?.domain\n if (domain) {\n return domain\n }\n\n var {\n host,\n header: { referer }\n } = context\n\n if (referer) {\n var { host: refererHost, pathname } = new URL(referer)\n if (refererHost === host) {\n return getPathInfo(pathname || '')?.domain\n }\n }\n}\n\nfunction getSubdomainFromVhost(context: any) {\n const subdomain = (context.subdomains || getSubdomainsFromHost(context)).slice(-1)[0]\n\n return subdomain\n}\n\nfunction getSubdomainFromURL(context) {\n return fixed || (useVirtualHostBasedDomain ? getSubdomainFromVhost(context) : getSubdomainFromPath(context))\n}\n\nexport async function getDomainFromURL(context: any): Promise<Domain> {\n const { header } = context\n\n const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context)\n\n if (subdomain) {\n return await getRepository(Domain).findOne({ where: { subdomain }, cache: true })\n }\n}\n\nexport function getCookieDomainFromHostname(hostname) {\n if (useVirtualHostBasedDomain) {\n return hostname.split('.').slice(-subdomainOffset).join('.')\n }\n}\n\nexport function getContextPath(subdomain) {\n return fixed || useVirtualHostBasedDomain ? '' : '/domain/' + subdomain\n}\n\nexport function getRedirectSubdomainPath(context, subdomain, redirectTo = '/') {\n if (fixed) {\n return redirectTo || '/'\n }\n\n var parsed = getUrlFromContext(context, redirectTo)\n var { hostname, pathname } = parsed\n\n if (useVirtualHostBasedDomain) {\n const splitHost = hostname.split('.').reverse()\n splitHost[subdomainOffset] = subdomain\n parsed.hostname = splitHost\n .reverse()\n .filter(a => a)\n .join('.')\n } else {\n const contextPath = `/domain/${subdomain}`\n const match = pathname.match(/^\\/domain\\/([^\\/]+)/)\n\n if (match) {\n parsed.pathname = pathname.replace(match[0], contextPath)\n } else {\n parsed.pathname = `${contextPath}${pathname}`\n }\n }\n\n return parsed.toString()\n}\n\nexport function findSubdomainFromPath(context, path) {\n if (fixed) {\n return fixed\n }\n\n var parsed = getUrlFromContext(context, path)\n var { hostname, pathname } = parsed\n\n if (useVirtualHostBasedDomain) {\n return hostname.split('.').reverse()[subdomainOffset]\n }\n\n const match = pathname.match(/^\\/domain\\/([^\\/]+)/)\n return match && match[1]\n}\n\nexport function getSiteRootPath(context) {\n if (useVirtualHostBasedDomain) {\n var { protocol, host } = context\n protocol = protocol.replace(':', '')\n\n let domainname = host.split('.').slice(-subdomainOffset).join('.')\n return protocol + '://' + domainname + '/'\n } else {\n return '/'\n }\n}\n"]}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { Repository, SelectQueryBuilder } from 'typeorm';
|
2
|
+
import { ListParam } from '../service/common-types/list-param';
|
3
|
+
import { Domain } from '../service/domain/domain';
|
4
|
+
/**
|
5
|
+
*
|
6
|
+
* @param options
|
7
|
+
* @returns
|
8
|
+
*/
|
9
|
+
export declare function getQueryBuilderFromListParams<Type>(options: {
|
10
|
+
repository: Repository<Type>;
|
11
|
+
params: ListParam;
|
12
|
+
domain?: Domain;
|
13
|
+
alias?: string;
|
14
|
+
searchables?: string[];
|
15
|
+
filtersMap?: {
|
16
|
+
[name: string]: {
|
17
|
+
columnName: string;
|
18
|
+
relationColumn?: string;
|
19
|
+
};
|
20
|
+
};
|
21
|
+
}): SelectQueryBuilder<Type>;
|
@@ -0,0 +1,7 @@
|
|
1
|
+
export * from './get-domain';
|
2
|
+
export * from './condition-builder';
|
3
|
+
export * from './list-query-builder';
|
4
|
+
export * from './list-params-converter';
|
5
|
+
export * from './publish-progress';
|
6
|
+
export * from './get-query-builder-from-list-params';
|
7
|
+
export * from './list-param-adjuster';
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { FindOperator } from 'typeorm';
|
2
|
+
import { ListParam } from '../service/common-types';
|
3
|
+
import { Domain } from '../service/domain/domain';
|
4
|
+
export declare function convertListParams(params: ListParam, options?: string | {
|
5
|
+
domain?: string | Domain;
|
6
|
+
searchables?: string[];
|
7
|
+
}): {
|
8
|
+
where?: {
|
9
|
+
[name: string]: FindOperator<any>;
|
10
|
+
};
|
11
|
+
order?: {
|
12
|
+
[name: string]: 'DESC' | 'ASC';
|
13
|
+
};
|
14
|
+
skip?: number;
|
15
|
+
take?: number;
|
16
|
+
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"list-params-converter.js","sourceRoot":"","sources":["../../server/utils/list-params-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Between, Equal, FindOperator, ILike, In, IsNull, Like, Not, Raw } from 'typeorm'\n\nimport { Filter, ListParam, Pagination, Sorting } from '../service/common-types'\nimport { Domain } from '../service/domain/domain'\nimport { adjustFilters } from './list-param-adjuster'\n\nconst OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator<any> } = {\n search: value => ILike(value),\n eq: value => Equal(value),\n noteq: value => Not(Equal(value)),\n like: value => Like(value),\n i_like: value => ILike(value),\n nlike: value => Not(Like(value)),\n i_nlike: value => Not(ILike(value)),\n lt: value => Raw(alias => `${alias} < ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gt: value => Raw(alias => `${alias} > ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n lte: value => Raw(alias => `${alias} <= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gte: value => Raw(alias => `${alias} >= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n in: value => In(value),\n notin: value => Not(In(value)),\n is_null: () => IsNull(),\n is_not_null: () => Not(IsNull()),\n is_false: () => Raw(alias => `${alias} IS FALSE`),\n in_true: () => Raw(alias => `${alias} IS TRUE`),\n is_not_true: () => Raw(alias => `${alias} IS NOT TRUE`),\n is_present: () => Raw(alias => `${alias} IS PRESENT`),\n is_blank: () => Raw(alias => `${alias} IS BLANK`),\n is_empty_num_id: () => Raw(alias => `${alias} IS EMPTY NUMERIC ID`),\n between: value => Between(value[0], value[1])\n}\n\nfunction getOperatorFunction({ operator, value }: { operator: string; value: any }): FindOperator<any> {\n return OPERATION_FUNCTION_MAP[operator](value)\n}\n\nfunction makePaginationParams(pagination: Pagination): { skip?: number; take?: number } {\n var result = {} as { skip?: number; take?: number }\n if (pagination) {\n var { page = 0, limit = 0 } = pagination\n var skip = 0\n var take = 0\n\n if (limit > 0) {\n skip = Math.max(page - 1, 0) * limit\n take = limit\n Object.assign(result, {\n skip,\n take\n })\n }\n }\n\n return result\n}\n\nfunction makeSortingParams(sortings: Sorting[]): { order?: { [name: string]: 'DESC' | 'ASC' } } {\n var result = {} as { order?: { [name: string]: 'DESC' | 'ASC' } }\n if (sortings) {\n var order = {} as { [name: string]: 'DESC' | 'ASC' }\n sortings.forEach(s => {\n order[s.name] = s.desc ? 'DESC' : 'ASC'\n })\n\n Object.assign(result, {\n order\n })\n }\n\n return result\n}\n\nfunction makeFilterParams(\n filters: Filter[],\n searchables?: string[]\n): {\n where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[]\n} {\n /* for where AND clauses */\n const columnFilters =\n filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const columnWhere = columnFilters.reduce((where, f) => {\n where[f.name] = getOperatorFunction(f)\n return where\n }, {} as { [name: string]: FindOperator<any> })\n\n if (searchFilters.length === 0) {\n return {\n where: columnWhere\n }\n }\n\n /* for fulltext searching ... OR-AND composition */\n const searchWheres = searchFilters.map(f => {\n return {\n [f.name]: getOperatorFunction(f),\n ...columnWhere\n }\n })\n\n return {\n where: searchWheres\n }\n}\n\nexport function convertListParams(\n params: ListParam,\n options?:\n | string\n | {\n domain?: string | Domain\n searchables?: string[]\n }\n): {\n where?: { [name: string]: FindOperator<any> }\n order?: {\n [name: string]: 'DESC' | 'ASC'\n }\n skip?: number\n take?: number\n} {\n var domainId: string | undefined\n\n if (options) {\n if (typeof options === 'string' /* for 하위 호환성 */) {\n var domainId = options\n } else {\n var { domain, searchables } = options\n var domainId = typeof domain === 'string' ? domain : domain?.id\n }\n }\n\n var { pagination, filters = [], sortings } = params\n var result = {}\n\n if (domainId) {\n filters = adjustFilters(filters, [\n {\n name: 'domain',\n operator: 'eq',\n value: domainId\n }\n ])\n }\n\n if (pagination) Object.assign(result, makePaginationParams(pagination))\n if (sortings) Object.assign(result, makeSortingParams(sortings))\n if (filters) Object.assign(result, makeFilterParams(filters, searchables))\n\n return result\n}\n"]}
|
1
|
+
{"version":3,"file":"list-params-converter.js","sourceRoot":"","sources":["../../server/utils/list-params-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Between, Equal, FindOperator, ILike, In, IsNull, Like, Not, Raw } from 'typeorm'\n\nimport { Filter, ListParam, Pagination, Sorting } from '../service/common-types'\nimport { Domain } from '../service/domain/domain'\nimport { adjustFilters } from './list-param-adjuster'\n\nconst OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator<any> } = {\n search: value => ILike(value),\n eq: value => Equal(value),\n noteq: value => Not(Equal(value)),\n like: value => Like(value),\n i_like: value => ILike(value),\n nlike: value => Not(Like(value)),\n i_nlike: value => Not(ILike(value)),\n lt: value => Raw(alias => `${alias} < ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gt: value => Raw(alias => `${alias} > ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n lte: value => Raw(alias => `${alias} <= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gte: value => Raw(alias => `${alias} >= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n in: value => In(value),\n notin: value => Not(In(value)),\n is_null: () => IsNull(),\n is_not_null: () => Not(IsNull()),\n is_false: () => Raw(alias => `${alias} IS FALSE`),\n in_true: () => Raw(alias => `${alias} IS TRUE`),\n is_not_true: () => Raw(alias => `${alias} IS NOT TRUE`),\n is_present: () => Raw(alias => `${alias} IS PRESENT`),\n is_blank: () => Raw(alias => `${alias} IS BLANK`),\n is_empty_num_id: () => Raw(alias => `${alias} IS EMPTY NUMERIC ID`),\n between: value => Between(value[0], value[1])\n}\n\nfunction getOperatorFunction({ operator, value }: Filter): FindOperator<any> {\n return OPERATION_FUNCTION_MAP[operator](value)\n}\n\nfunction makePaginationParams(pagination: Pagination): { skip?: number; take?: number } {\n var result = {} as { skip?: number; take?: number }\n if (pagination) {\n var { page = 0, limit = 0 } = pagination\n var skip = 0\n var take = 0\n\n if (limit > 0) {\n skip = Math.max(page - 1, 0) * limit\n take = limit\n Object.assign(result, {\n skip,\n take\n })\n }\n }\n\n return result\n}\n\nfunction makeSortingParams(sortings: Sorting[]): { order?: { [name: string]: 'DESC' | 'ASC' } } {\n var result = {} as { order?: { [name: string]: 'DESC' | 'ASC' } }\n if (sortings) {\n var order = {} as { [name: string]: 'DESC' | 'ASC' }\n sortings.forEach(s => {\n order[s.name] = s.desc ? 'DESC' : 'ASC'\n })\n\n Object.assign(result, {\n order\n })\n }\n\n return result\n}\n\nfunction makeFilterParams(\n filters: Filter[],\n searchables?: string[]\n): {\n where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[]\n} {\n /* for where AND clauses */\n const columnFilters =\n filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const columnWhere = columnFilters.reduce((where, f) => {\n where[f.name] = getOperatorFunction(f)\n return where\n }, {} as { [name: string]: FindOperator<any> })\n\n if (searchFilters.length === 0) {\n return {\n where: columnWhere\n }\n }\n\n /* for fulltext searching ... OR-AND composition */\n const searchWheres = searchFilters.map(f => {\n return {\n [f.name]: getOperatorFunction(f),\n ...columnWhere\n }\n })\n\n return {\n where: searchWheres\n }\n}\n\nexport function convertListParams(\n params: ListParam,\n options?:\n | string\n | {\n domain?: string | Domain\n searchables?: string[]\n }\n): {\n where?: { [name: string]: FindOperator<any> }\n order?: {\n [name: string]: 'DESC' | 'ASC'\n }\n skip?: number\n take?: number\n} {\n var domainId: string | undefined\n\n if (options) {\n if (typeof options === 'string' /* for 하위 호환성 */) {\n var domainId = options\n } else {\n var { domain, searchables } = options\n var domainId = typeof domain === 'string' ? domain : domain?.id\n }\n }\n\n var { pagination, filters = [], sortings } = params\n var result = {}\n\n if (domainId) {\n filters = adjustFilters(filters, [\n {\n name: 'domain',\n operator: 'eq',\n value: domainId\n }\n ])\n }\n\n if (pagination) Object.assign(result, makePaginationParams(pagination))\n if (sortings) Object.assign(result, makeSortingParams(sortings))\n if (filters) Object.assign(result, makeFilterParams(filters, searchables))\n\n return result\n}\n"]}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
/**
|
2
|
+
* @deprecated The name of this function does not imply an exact purpose and it is not possible to correspond to a foreign key using the meta information of the table column, so it is recommended to replace it with the getQueryBuilderFromListParams function.
|
3
|
+
*/
|
4
|
+
export declare const buildQuery: (queryBuilder: any, params: any, context: any, options?: boolean | {
|
5
|
+
domainRef?: boolean;
|
6
|
+
searchables?: string[];
|
7
|
+
}) => void;
|
@@ -0,0 +1 @@
|
|
1
|
+
declare const webpackHotClient: any;
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
declare const Joi: any;
|
package/ormconfig.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
const { orderedModuleNames,
|
1
|
+
const { orderedModuleNames, loader } = require('@things-factory/env')
|
2
2
|
const { NamingStrategy } = require('@things-factory/shell')
|
3
3
|
|
4
4
|
const debug = require('debug')('things-factory:shell:ormconfig')
|
@@ -27,6 +27,5 @@ module.exports = {
|
|
27
27
|
namingStrategy: new NamingStrategy(),
|
28
28
|
entities,
|
29
29
|
migrations,
|
30
|
-
subscribers
|
31
|
-
...config.get('ormconfig')
|
30
|
+
subscribers
|
32
31
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@things-factory/shell",
|
3
|
-
"version": "
|
3
|
+
"version": "6.0.0-alpha.0",
|
4
4
|
"description": "Core module for framework",
|
5
5
|
"bin": {
|
6
6
|
"things-factory": "bin/things-factory",
|
@@ -45,16 +45,17 @@
|
|
45
45
|
"@material/mwc-icon-button": "^0.26.1",
|
46
46
|
"@material/mwc-slider": "^0.26.1",
|
47
47
|
"@material/mwc-textfield": "^0.26.1",
|
48
|
+
"@open-wc/scoped-elements": "^2.1.3",
|
48
49
|
"@operato/board": "^1.0.1",
|
49
50
|
"@operato/graphql": "^1.0.0",
|
50
51
|
"@operato/help": "^1.0.1",
|
51
52
|
"@operato/layout": "^1.0.1",
|
52
53
|
"@operato/shell": "^1.0.1",
|
53
54
|
"@operato/utils": "^1.0.1",
|
54
|
-
"@things-factory/ejs-remote": "^
|
55
|
-
"@things-factory/env": "^
|
56
|
-
"@things-factory/styles": "^
|
57
|
-
"@things-factory/utils": "^
|
55
|
+
"@things-factory/ejs-remote": "^6.0.0-alpha.0",
|
56
|
+
"@things-factory/env": "^6.0.0-alpha.0",
|
57
|
+
"@things-factory/styles": "^6.0.0-alpha.0",
|
58
|
+
"@things-factory/utils": "^6.0.0-alpha.0",
|
58
59
|
"@webcomponents/webcomponentsjs": "^2.6.0",
|
59
60
|
"@webpack-contrib/schema-utils": "^1.0.0-beta.0",
|
60
61
|
"apollo-server-core": "^3.10.0",
|
@@ -116,7 +117,7 @@
|
|
116
117
|
"scrollbooster": "^3.0.2",
|
117
118
|
"sweetalert2": "^10.9.0",
|
118
119
|
"type-graphql": "npm:type-graphql-v2-fork@2.0.0-alpha2",
|
119
|
-
"typeorm": "^0.
|
120
|
+
"typeorm": "^0.3.9",
|
120
121
|
"uuid": "^3.4.0",
|
121
122
|
"web-animations-js": "^2.3.2",
|
122
123
|
"web-push": "^3.5.0",
|
@@ -131,5 +132,5 @@
|
|
131
132
|
"pg": "^8.7.3",
|
132
133
|
"sqlite3": "^5.0.8"
|
133
134
|
},
|
134
|
-
"gitHead": "
|
135
|
+
"gitHead": "e5b9823ab3ebc5d6ae5bcb4b5aa60c1306e4dd7e"
|
135
136
|
}
|
package/server/index.ts
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
|
1
|
+
import { createConnection, DataSource, EntityTarget, Repository } from 'typeorm'
|
2
|
+
|
3
|
+
import { appRootPath, config, logger } from '@things-factory/env'
|
2
4
|
|
3
|
-
|
4
|
-
import { logger, appRootPath } from '@things-factory/env'
|
5
|
+
const path = require('path')
|
5
6
|
|
6
7
|
var ormconfig
|
7
8
|
try {
|
@@ -10,18 +11,57 @@ try {
|
|
10
11
|
ormconfig = require('@things-factory/shell/ormconfig')
|
11
12
|
}
|
12
13
|
|
14
|
+
const dataSources: { [name: string]: DataSource } = {}
|
15
|
+
|
16
|
+
export function getDataSource(name?: string): DataSource {
|
17
|
+
return dataSources[name || 'default']
|
18
|
+
}
|
19
|
+
|
20
|
+
export function addDataSource(name: string, dataSource: DataSource) {
|
21
|
+
dataSources[name] = dataSource
|
22
|
+
}
|
23
|
+
|
24
|
+
export function removeDataSource(name: string) {
|
25
|
+
delete dataSources[name]
|
26
|
+
}
|
27
|
+
|
28
|
+
export function getDataSourceNames() {
|
29
|
+
return Object.keys(dataSources)
|
30
|
+
}
|
31
|
+
|
32
|
+
export function getRepository<X>(target: EntityTarget<X>): Repository<X> {
|
33
|
+
return getDataSource('default').getRepository<X>(target)
|
34
|
+
}
|
35
|
+
|
13
36
|
export const databaseInitializer = async () => {
|
14
37
|
try {
|
15
|
-
const
|
16
|
-
|
38
|
+
const dataSource = await createConnection({
|
39
|
+
...ormconfig,
|
40
|
+
...config.get('ormconfig')
|
41
|
+
})
|
42
|
+
|
43
|
+
addDataSource('default', dataSource)
|
44
|
+
|
45
|
+
logger.info('Default DataSource established')
|
17
46
|
|
18
47
|
if (ormconfig.type == 'sqlite' && ormconfig.synchronize == false) {
|
19
|
-
await
|
20
|
-
await
|
21
|
-
await
|
48
|
+
await dataSource.query('PRAGMA foreign_keys=OFF')
|
49
|
+
await dataSource.synchronize()
|
50
|
+
await dataSource.query('PRAGMA foreign_keys=ON')
|
22
51
|
}
|
23
52
|
|
24
|
-
|
53
|
+
if (config.get('ormconfig4Tx')) {
|
54
|
+
const dataSource4Tx = new DataSource({
|
55
|
+
...ormconfig,
|
56
|
+
...config.get('ormconfig4Tx')
|
57
|
+
})
|
58
|
+
dataSource4Tx.initialize()
|
59
|
+
addDataSource('tx', dataSource4Tx)
|
60
|
+
|
61
|
+
logger.info('Transaction DataSource established')
|
62
|
+
} else {
|
63
|
+
addDataSource('tx', dataSource)
|
64
|
+
}
|
25
65
|
} catch (e) {
|
26
66
|
logger.error(e)
|
27
67
|
}
|
@@ -1,4 +1,6 @@
|
|
1
|
-
import { MigrationInterface, QueryRunner
|
1
|
+
import { MigrationInterface, QueryRunner } from 'typeorm'
|
2
|
+
|
3
|
+
import { getRepository } from '../initializers/database'
|
2
4
|
import { Domain } from '../service/domain/domain'
|
3
5
|
|
4
6
|
const SEED_DOMAINS = [
|
@@ -27,7 +29,7 @@ export class SeedDomain1000000000000 implements MigrationInterface {
|
|
27
29
|
|
28
30
|
return await Promise.all(
|
29
31
|
SEED_DOMAINS.reverse().map(async domain => {
|
30
|
-
let recode = await repository.
|
32
|
+
let recode = await repository.findOneBy({ subdomain: domain.subdomain })
|
31
33
|
await repository.remove(recode)
|
32
34
|
})
|
33
35
|
)
|
package/server/server-dev.ts
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
process.env.NODE_ENV = 'development'
|
5
5
|
process.setMaxListeners(0)
|
6
6
|
|
7
|
-
import { ApolloServerPluginDrainHttpServer,
|
7
|
+
import { ApolloServerPluginDrainHttpServer, ApolloServerPluginLandingPageLocalDefault } from 'apollo-server-core'
|
8
8
|
import { ApolloServer } from 'apollo-server-koa'
|
9
9
|
import bytesFormat from 'bytes'
|
10
10
|
import graphqlUploadKoa from 'graphql-upload/graphqlUploadKoa.js'
|
@@ -27,6 +27,8 @@ import { GraphqlLocalClient } from './graphql-local-client'
|
|
27
27
|
import { databaseInitializer } from './initializers/database'
|
28
28
|
import { domainPrivateRouter, domainPublicRouter, globalPrivateRouter, globalPublicRouter } from './routers'
|
29
29
|
import { schema } from './schema'
|
30
|
+
import { Domain } from './service'
|
31
|
+
import { EntityManager } from 'typeorm'
|
30
32
|
|
31
33
|
process.on('uncaughtException', error => {
|
32
34
|
logger.error(error)
|
@@ -68,11 +70,21 @@ const fileUploadOption = {
|
|
68
70
|
maxFiles: fileUpload.maxFiles || 10
|
69
71
|
}
|
70
72
|
|
73
|
+
interface ICustomAppState {
|
74
|
+
domain: Domain
|
75
|
+
user: any
|
76
|
+
tx: EntityManager
|
77
|
+
}
|
78
|
+
|
79
|
+
interface ICustomAppContext {
|
80
|
+
t: any
|
81
|
+
}
|
82
|
+
|
71
83
|
/* bootstrap */
|
72
84
|
const bootstrap = async () => {
|
73
85
|
await databaseInitializer()
|
74
86
|
|
75
|
-
const app = new Koa()
|
87
|
+
const app = new Koa<ICustomAppState, ICustomAppContext>()
|
76
88
|
|
77
89
|
app.use(
|
78
90
|
cors({
|
@@ -124,9 +136,13 @@ const bootstrap = async () => {
|
|
124
136
|
var { extra, connectionParams } = ctx
|
125
137
|
var { request } = extra
|
126
138
|
|
127
|
-
|
128
|
-
|
129
|
-
|
139
|
+
if (((connectionParams['headers'] as any) || connectionParams)?.referer) {
|
140
|
+
var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
|
141
|
+
var accessToken = url.searchParams.get('access_token')
|
142
|
+
if (accessToken) {
|
143
|
+
connectionParams['headers']['authorization'] = accessToken
|
144
|
+
}
|
145
|
+
}
|
130
146
|
|
131
147
|
request.headers = {
|
132
148
|
...request.headers,
|
@@ -170,13 +186,11 @@ const bootstrap = async () => {
|
|
170
186
|
return ctx
|
171
187
|
}
|
172
188
|
},
|
189
|
+
csrfPrevention: true,
|
173
190
|
plugins: [
|
174
|
-
|
175
|
-
settings: {
|
176
|
-
'request.credentials': 'same-origin'
|
177
|
-
}
|
178
|
-
}),
|
191
|
+
// Proper shutdown for the HTTP server.
|
179
192
|
ApolloServerPluginDrainHttpServer({ httpServer }),
|
193
|
+
// Proper shutdown for the WebSocket server.
|
180
194
|
{
|
181
195
|
async serverWillStart() {
|
182
196
|
return {
|
@@ -185,7 +199,10 @@ const bootstrap = async () => {
|
|
185
199
|
}
|
186
200
|
}
|
187
201
|
}
|
188
|
-
}
|
202
|
+
},
|
203
|
+
ApolloServerPluginLandingPageLocalDefault({
|
204
|
+
embed: true
|
205
|
+
})
|
189
206
|
],
|
190
207
|
cache: 'bounded'
|
191
208
|
})
|
@@ -226,11 +243,7 @@ const bootstrap = async () => {
|
|
226
243
|
app.use(koaBodyParser(bodyParserOption))
|
227
244
|
app.use(graphqlUploadKoa(fileUploadOption))
|
228
245
|
|
229
|
-
|
230
|
-
server.getMiddleware({
|
231
|
-
path: '/graphql'
|
232
|
-
})
|
233
|
-
)
|
246
|
+
server.applyMiddleware({ app, path: '/graphql' })
|
234
247
|
|
235
248
|
/* routers */
|
236
249
|
process.emit('bootstrap-module-global-public-route' as any, app, globalPublicRouter)
|
package/server/server.ts
CHANGED
@@ -113,9 +113,13 @@ const bootstrap = async () => {
|
|
113
113
|
var { extra, connectionParams } = ctx
|
114
114
|
var { request } = extra
|
115
115
|
|
116
|
-
|
117
|
-
|
118
|
-
|
116
|
+
if (((connectionParams['headers'] as any) || connectionParams)?.referer) {
|
117
|
+
var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
|
118
|
+
var accessToken = url.searchParams.get('access_token')
|
119
|
+
if (accessToken) {
|
120
|
+
connectionParams['headers']['authorization'] = accessToken
|
121
|
+
}
|
122
|
+
}
|
119
123
|
|
120
124
|
request.headers = {
|
121
125
|
...request.headers,
|
@@ -198,11 +202,7 @@ const bootstrap = async () => {
|
|
198
202
|
app.use(koaBodyParser(bodyParserOption))
|
199
203
|
app.use(graphqlUploadKoa(fileUploadOption))
|
200
204
|
|
201
|
-
|
202
|
-
server.getMiddleware({
|
203
|
-
path: '/graphql'
|
204
|
-
})
|
205
|
-
)
|
205
|
+
server.applyMiddleware({ app, path: '/graphql' })
|
206
206
|
|
207
207
|
/* routers */
|
208
208
|
process.emit('bootstrap-module-global-public-route' as any, app, globalPublicRouter)
|
@@ -1,4 +1,5 @@
|
|
1
|
-
import { ArgsType,
|
1
|
+
import { ArgsType, Field, InputType, Int } from 'type-graphql'
|
2
|
+
|
2
3
|
import { ScalarAny } from './scalar-any'
|
3
4
|
|
4
5
|
@InputType()
|
@@ -27,8 +28,8 @@ export class Filter {
|
|
27
28
|
@Field()
|
28
29
|
operator: string
|
29
30
|
|
30
|
-
@Field(type => ScalarAny)
|
31
|
-
value
|
31
|
+
@Field(type => ScalarAny, { nullable: true })
|
32
|
+
value?: any
|
32
33
|
|
33
34
|
@Field({ nullable: true })
|
34
35
|
relation?: boolean
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import { defaultFieldResolver, GraphQLSchema } from 'graphql'
|
2
2
|
import gql from 'graphql-tag'
|
3
|
-
import { getConnection } from 'typeorm'
|
4
3
|
|
5
4
|
import { getDirective, MapperKind, mapSchema } from '@graphql-tools/utils'
|
6
5
|
|
6
|
+
import { getDataSource } from '../../initializers/database'
|
7
|
+
|
7
8
|
const DIRECTIVE = 'transaction'
|
8
9
|
|
9
10
|
export const transactionDirectiveTypeDefs = gql`
|
@@ -17,7 +18,7 @@ export const transactionDirectiveResolver = (schema: GraphQLSchema) =>
|
|
17
18
|
const { resolve = defaultFieldResolver } = fieldConfig
|
18
19
|
|
19
20
|
fieldConfig.resolve = async function (source, args, context, info) {
|
20
|
-
return await
|
21
|
+
return await getDataSource('tx').transaction(async tx => {
|
21
22
|
/* local-graphql-client로부터 invoke인 경우에는 context.req, context.res 가 없으므로, 빈 오브젝트로 대체해준다. */
|
22
23
|
let wrap = context.app.createContext(context.req || {}, context.res || {})
|
23
24
|
|
@@ -1,8 +1,9 @@
|
|
1
1
|
import { Arg, Args, Ctx, Directive, Mutation, Query, Resolver } from 'type-graphql'
|
2
|
-
import {
|
2
|
+
import { In, Repository } from 'typeorm'
|
3
3
|
|
4
4
|
import { slugger } from '@things-factory/utils'
|
5
5
|
|
6
|
+
import { getRepository } from '../../initializers/database'
|
6
7
|
import { buildQuery } from '../../utils/list-query-builder'
|
7
8
|
import { ListParam } from '../common-types/list-param'
|
8
9
|
import { Domain } from './domain'
|
@@ -15,12 +16,12 @@ export class DomainResolver {
|
|
15
16
|
async domain(@Arg('id') id: string): Promise<Domain> {
|
16
17
|
const repository = getRepository(Domain)
|
17
18
|
|
18
|
-
return await repository.
|
19
|
+
return await repository.findOneBy({ id })
|
19
20
|
}
|
20
21
|
|
21
22
|
@Directive('@privilege(category: "system", privilege: "query", superUserGranted: true)')
|
22
23
|
@Query(returns => DomainList, { description: 'To fetch multiple domain' })
|
23
|
-
async domains(@Args() params: ListParam, @Ctx() context): Promise<DomainList> {
|
24
|
+
async domains(@Args() params: ListParam, @Ctx() context: any): Promise<DomainList> {
|
24
25
|
const queryBuilder = getRepository(Domain).createQueryBuilder()
|
25
26
|
|
26
27
|
buildQuery(queryBuilder, params || {}, context, {
|
@@ -37,7 +38,7 @@ export class DomainResolver {
|
|
37
38
|
const domainRepository: Repository<Domain> = getRepository(Domain)
|
38
39
|
const targetSubdomain: string = slugger(name)
|
39
40
|
|
40
|
-
const oldDomain = await domainRepository.
|
41
|
+
const oldDomain = await domainRepository.findOneBy({ subdomain: targetSubdomain })
|
41
42
|
if (oldDomain) {
|
42
43
|
throw new Error('domain is duplicated')
|
43
44
|
}
|
@@ -52,7 +53,7 @@ export class DomainResolver {
|
|
52
53
|
const domainRepo: Repository<Domain> = getRepository(Domain)
|
53
54
|
const subdomain: string = slugger(name)
|
54
55
|
|
55
|
-
const domain: Domain = await domainRepo.
|
56
|
+
const domain: Domain = await domainRepo.findOneBy({ subdomain })
|
56
57
|
if (domain) {
|
57
58
|
throw new Error('domain is duplicated')
|
58
59
|
}
|
@@ -79,7 +80,7 @@ export class DomainResolver {
|
|
79
80
|
@Mutation(returns => Domain, { description: 'To update domain' })
|
80
81
|
async updateDomain(@Arg('name') name: string, @Arg('patch', () => DomainPatch) patch: DomainPatch) {
|
81
82
|
const repository = getRepository(Domain)
|
82
|
-
const domain: Domain = await repository.
|
83
|
+
const domain: Domain = await repository.findOneBy({ name })
|
83
84
|
|
84
85
|
return await repository.save({
|
85
86
|
...domain,
|
@@ -1,9 +1,9 @@
|
|
1
|
-
import { getRepository } from 'typeorm'
|
2
1
|
import { URL } from 'url'
|
3
2
|
|
4
3
|
import { config } from '@things-factory/env'
|
5
4
|
import { getPathInfo } from '@things-factory/utils'
|
6
5
|
|
6
|
+
import { getRepository } from '../initializers/database'
|
7
7
|
import { Domain } from '../service/domain/domain'
|
8
8
|
|
9
9
|
const useVirtualHostBasedDomain = !!config.get('useVirtualHostBasedDomain')
|
@@ -72,7 +72,7 @@ export async function getDomainFromURL(context: any): Promise<Domain> {
|
|
72
72
|
const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context)
|
73
73
|
|
74
74
|
if (subdomain) {
|
75
|
-
return await getRepository(Domain).findOne({ subdomain },
|
75
|
+
return await getRepository(Domain).findOne({ where: { subdomain }, cache: true })
|
76
76
|
}
|
77
77
|
}
|
78
78
|
|