@things-factory/shell 5.0.7 → 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/graphql-local-client.js.map +1 -1
- package/dist-server/index.d.ts +9 -0
- package/dist-server/index.js +10 -22
- 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/initializers/naming-strategy.js +3 -5
- package/dist-server/initializers/naming-strategy.js.map +1 -1
- package/dist-server/middlewares/domain-middleware.d.ts +1 -0
- package/dist-server/middlewares/domain-middleware.js +0 -4
- package/dist-server/middlewares/domain-middleware.js.map +1 -1
- package/dist-server/middlewares/index.d.ts +2 -0
- package/dist-server/middlewares/index.js +2 -17
- package/dist-server/middlewares/index.js.map +1 -1
- 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/migrations/index.js.map +1 -1
- package/dist-server/pubsub-log-transport.d.ts +8 -0
- package/dist-server/pubsub-log-transport.js +3 -5
- package/dist-server/pubsub-log-transport.js.map +1 -1
- package/dist-server/pubsub.d.ts +2 -0
- package/dist-server/pubsub.js +2 -6
- package/dist-server/pubsub.js.map +1 -1
- package/dist-server/routers/domain-router.d.ts +2 -0
- package/dist-server/routers/domain-router.js +2 -7
- package/dist-server/routers/domain-router.js.map +1 -1
- package/dist-server/routers/global-router.d.ts +2 -0
- package/dist-server/routers/global-router.js +3 -7
- package/dist-server/routers/global-router.js.map +1 -1
- package/dist-server/routers/index.d.ts +2 -0
- package/dist-server/routers/index.js +3 -16
- package/dist-server/routers/index.js.map +1 -1
- package/dist-server/schema.d.ts +2 -0
- package/dist-server/schema.js.map +1 -1
- package/dist-server/server-dev.d.ts +1 -0
- package/dist-server/server-dev.js +27 -26
- package/dist-server/server-dev.js.map +1 -1
- package/dist-server/server.d.ts +1 -0
- package/dist-server/server.js +19 -18
- 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/index.js +7 -20
- package/dist-server/service/common-types/index.js.map +1 -1
- package/dist-server/service/common-types/list-param.d.ts +19 -0
- package/dist-server/service/common-types/list-param.js +28 -36
- 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/log.js +10 -18
- package/dist-server/service/common-types/log.js.map +1 -1
- package/dist-server/service/common-types/object-ref.d.ts +5 -0
- package/dist-server/service/common-types/object-ref.js +8 -16
- package/dist-server/service/common-types/object-ref.js.map +1 -1
- package/dist-server/service/common-types/scalar-any.d.ts +2 -0
- package/dist-server/service/common-types/scalar-any.js.map +1 -1
- package/dist-server/service/common-types/scalar-date.d.ts +2 -0
- package/dist-server/service/common-types/scalar-date.js.map +1 -1
- package/dist-server/service/common-types/scalar-object.d.ts +1 -0
- package/dist-server/service/common-types/scalar-object.js.map +1 -1
- package/dist-server/service/directive-transaction/index.d.ts +1 -0
- package/dist-server/service/directive-transaction/index.js +2 -15
- package/dist-server/service/directive-transaction/index.js.map +1 -1
- package/dist-server/service/directive-transaction/transaction.d.ts +3 -0
- package/dist-server/service/directive-transaction/transaction.js +4 -9
- 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 +58 -68
- 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-types.js +32 -40
- package/dist-server/service/domain/domain-types.js.map +1 -1
- package/dist-server/service/domain/domain.d.ts +16 -0
- package/dist-server/service/domain/domain.js +30 -38
- package/dist-server/service/domain/domain.js.map +1 -1
- package/dist-server/service/domain/index.d.ts +4 -0
- package/dist-server/service/domain/index.js.map +1 -1
- package/dist-server/service/index.d.ts +14 -0
- package/dist-server/service/index.js +5 -18
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/subscription-data/data-resolver.d.ts +6 -0
- package/dist-server/service/subscription-data/data-resolver.js +9 -22
- package/dist-server/service/subscription-data/data-resolver.js.map +1 -1
- package/dist-server/service/subscription-data/data-types.d.ts +6 -0
- package/dist-server/service/subscription-data/data-types.js +8 -17
- package/dist-server/service/subscription-data/data-types.js.map +1 -1
- package/dist-server/service/subscription-data/index.d.ts +3 -0
- package/dist-server/service/subscription-data/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/dist-server/utils/condition-builder.d.ts +17 -0
- package/dist-server/utils/condition-builder.js +2 -4
- package/dist-server/utils/condition-builder.js.map +1 -1
- package/dist-server/utils/get-domain.d.ts +10 -0
- package/dist-server/utils/get-domain.js +3 -6
- 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/get-query-builder-from-list-params.js +7 -8
- package/dist-server/utils/get-query-builder-from-list-params.js.map +1 -1
- package/dist-server/utils/index.d.ts +7 -0
- package/dist-server/utils/index.js +8 -21
- package/dist-server/utils/index.js.map +1 -1
- package/dist-server/utils/list-param-adjuster.d.ts +2 -0
- package/dist-server/utils/list-param-adjuster.js.map +1 -1
- package/dist-server/utils/list-params-converter.d.ts +16 -0
- package/dist-server/utils/list-params-converter.js +1 -2
- 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/list-query-builder.js +2 -3
- package/dist-server/utils/list-query-builder.js.map +1 -1
- package/dist-server/utils/publish-progress.d.ts +6 -0
- package/dist-server/utils/publish-progress.js.map +1 -1
- package/dist-server/webpack/koa-webpack/client.d.ts +1 -0
- package/dist-server/webpack/koa-webpack/client.js.map +1 -1
- package/dist-server/webpack/koa-webpack/index.d.ts +2 -0
- package/dist-server/webpack/koa-webpack/index.js.map +1 -1
- package/dist-server/webpack/koa-webpack/middleware.d.ts +0 -0
- package/dist-server/webpack/koa-webpack/middleware.js.map +1 -1
- package/dist-server/webpack/koa-webpack/validate.d.ts +1 -0
- package/dist-server/webpack/koa-webpack/validate.js.map +1 -1
- package/ormconfig.js +2 -3
- package/package.json +9 -8
- package/server/index.ts +1 -0
- package/server/initializers/database.ts +49 -9
- package/server/middlewares/domain-middleware.ts +0 -5
- package/server/middlewares/index.ts +0 -4
- package/server/migrations/1000000000000-SeedDomain.ts +4 -2
- package/server/pubsub.ts +0 -4
- package/server/routers/domain-router.ts +1 -4
- package/server/routers/global-router.ts +2 -3
- package/server/server-dev.ts +29 -18
- package/server/server.ts +8 -8
- package/server/service/common-types/list-param.ts +4 -3
- package/server/service/directive-transaction/transaction.ts +2 -7
- package/server/service/domain/domain-resolver.ts +7 -6
- package/server/service/subscription-data/data-resolver.ts +3 -6
- package/server/service/subscription-data/data-types.ts +2 -3
- package/server/utils/get-domain.ts +5 -7
- package/server/utils/get-query-builder-from-list-params.ts +13 -9
- package/server/utils/list-params-converter.ts +5 -4
- package/server/utils/list-query-builder.ts +8 -4
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",
|
@@ -37,7 +37,7 @@
|
|
37
37
|
"@graphql-tools/schema": "^8.5.0",
|
38
38
|
"@graphql-tools/utils": "^8.8.0",
|
39
39
|
"@hatiolab/koa-webpack": "^6.0.0",
|
40
|
-
"@hatiolab/things-scene": "^3.0.
|
40
|
+
"@hatiolab/things-scene": "^3.0.23",
|
41
41
|
"@koa/cors": "^3.3.0",
|
42
42
|
"@material/mwc-button": "^0.26.1",
|
43
43
|
"@material/mwc-fab": "^0.26.1",
|
@@ -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,11 +1,8 @@
|
|
1
1
|
import { getDomainFromURL } from '../utils'
|
2
2
|
|
3
|
-
const debug = require('debug')('things-factory:shell:domain-middleware')
|
4
|
-
|
5
3
|
export async function domainMiddleware(context: any, next: any) {
|
6
4
|
const { domain } = context.state
|
7
5
|
if (domain) {
|
8
|
-
debug('already fetch domain', context.path, domain.subdomain)
|
9
6
|
return await next()
|
10
7
|
}
|
11
8
|
|
@@ -16,7 +13,5 @@ export async function domainMiddleware(context: any, next: any) {
|
|
16
13
|
*/
|
17
14
|
context.state.domain = await getDomainFromURL(context)
|
18
15
|
|
19
|
-
debug('subdomain', context.path, context.state.domain?.subdomain)
|
20
|
-
|
21
16
|
await next()
|
22
17
|
}
|
@@ -2,8 +2,6 @@ import { config, logger } from '@things-factory/env'
|
|
2
2
|
|
3
3
|
import { domainMiddleware } from './domain-middleware'
|
4
4
|
|
5
|
-
const debug = require('debug')('things-factory:shell:middleware')
|
6
|
-
|
7
5
|
export function initMiddlewares(app) {
|
8
6
|
app.subdomainOffset = config.get('subdomainOffset', 2)
|
9
7
|
|
@@ -43,8 +41,6 @@ export function initMiddlewares(app) {
|
|
43
41
|
}
|
44
42
|
|
45
43
|
process.on('bootstrap-module-subscription' as any, (app, subscriptionMiddleware) => {
|
46
|
-
debug('bootstrap-module-subscription')
|
47
|
-
|
48
44
|
subscriptionMiddleware.push(domainMiddleware)
|
49
45
|
})
|
50
46
|
|
@@ -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/pubsub.ts
CHANGED
@@ -8,8 +8,6 @@ import { config, logger } from '@things-factory/env'
|
|
8
8
|
|
9
9
|
const { middleware, host, port, nodes, topic, options } = config.get('pubsub', {})
|
10
10
|
|
11
|
-
const debug = require('debug')('things-factory:shell')
|
12
|
-
|
13
11
|
let pubsub: any
|
14
12
|
|
15
13
|
switch (middleware) {
|
@@ -65,8 +63,6 @@ switch (middleware) {
|
|
65
63
|
break
|
66
64
|
}
|
67
65
|
|
68
|
-
debug(middleware || 'default', 'pubsub initialized.')
|
69
|
-
|
70
66
|
// kafka pubsub keeps connection and app port with 'ctrl+c' termination.
|
71
67
|
const exitHandler = async evt => {
|
72
68
|
if (pubsub.close) {
|
@@ -1,16 +1,13 @@
|
|
1
1
|
import Router from 'koa-router'
|
2
|
-
import { domainMiddleware } from '../middlewares/domain-middleware'
|
3
2
|
|
4
|
-
|
3
|
+
import { domainMiddleware } from '../middlewares/domain-middleware'
|
5
4
|
|
6
5
|
export const domainPublicRouter = new Router()
|
7
6
|
domainPublicRouter.use(async (context, next) => {
|
8
|
-
debug('domain-public-router path, referer, matched', context.path, context.get('Referrer'), context._matchedRoute)
|
9
7
|
await next()
|
10
8
|
}, domainMiddleware)
|
11
9
|
|
12
10
|
export const domainPrivateRouter = new Router()
|
13
11
|
domainPrivateRouter.use(async (context, next) => {
|
14
|
-
debug('domain-private-router path, referer, matched', context.path, context.get('Referrer'), context._matchedRoute)
|
15
12
|
await next()
|
16
13
|
}, domainMiddleware)
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import Router from 'koa-router'
|
2
|
+
|
2
3
|
import { domainMiddleware } from '../middlewares/domain-middleware'
|
3
4
|
|
4
5
|
var crawler = require('npm-license-crawler')
|
5
|
-
const debug = require('debug')('things-factory:shell:global-router')
|
6
6
|
|
7
7
|
export const globalPublicRouter = new Router()
|
8
8
|
export const globalPrivateRouter = new Router()
|
@@ -28,7 +28,7 @@ globalPublicRouter.get('/licenses', (context, next) => {
|
|
28
28
|
|
29
29
|
crawler.dumpLicenses(options, function (error, res) {
|
30
30
|
if (error) {
|
31
|
-
|
31
|
+
console.error('get:/licenses', error)
|
32
32
|
reject(error)
|
33
33
|
} else {
|
34
34
|
context.type = 'application/json'
|
@@ -42,6 +42,5 @@ globalPublicRouter.get('/licenses', (context, next) => {
|
|
42
42
|
/* Paths starting with /public are assumed to use the koa-view renderer. */
|
43
43
|
globalPublicRouter.get('/public/(.[^.]*)', async (context, next) => {
|
44
44
|
const { path } = context
|
45
|
-
debug('get:/public/(.[^.]*)', path)
|
46
45
|
await context.render(path.substr(1))
|
47
46
|
})
|
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)
|
@@ -34,8 +36,6 @@ process.on('uncaughtException', error => {
|
|
34
36
|
process.exit(1)
|
35
37
|
})
|
36
38
|
|
37
|
-
const debug = require('debug')('things-factory:shell:server-dev')
|
38
|
-
|
39
39
|
const args = require('args')
|
40
40
|
|
41
41
|
args.option('port', 'The port on which the app will be running', config.get('port', 3000))
|
@@ -70,11 +70,21 @@ const fileUploadOption = {
|
|
70
70
|
maxFiles: fileUpload.maxFiles || 10
|
71
71
|
}
|
72
72
|
|
73
|
+
interface ICustomAppState {
|
74
|
+
domain: Domain
|
75
|
+
user: any
|
76
|
+
tx: EntityManager
|
77
|
+
}
|
78
|
+
|
79
|
+
interface ICustomAppContext {
|
80
|
+
t: any
|
81
|
+
}
|
82
|
+
|
73
83
|
/* bootstrap */
|
74
84
|
const bootstrap = async () => {
|
75
85
|
await databaseInitializer()
|
76
86
|
|
77
|
-
const app = new Koa()
|
87
|
+
const app = new Koa<ICustomAppState, ICustomAppContext>()
|
78
88
|
|
79
89
|
app.use(
|
80
90
|
cors({
|
@@ -126,9 +136,13 @@ const bootstrap = async () => {
|
|
126
136
|
var { extra, connectionParams } = ctx
|
127
137
|
var { request } = extra
|
128
138
|
|
129
|
-
|
130
|
-
|
131
|
-
|
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
|
+
}
|
132
146
|
|
133
147
|
request.headers = {
|
134
148
|
...request.headers,
|
@@ -172,13 +186,11 @@ const bootstrap = async () => {
|
|
172
186
|
return ctx
|
173
187
|
}
|
174
188
|
},
|
189
|
+
csrfPrevention: true,
|
175
190
|
plugins: [
|
176
|
-
|
177
|
-
settings: {
|
178
|
-
'request.credentials': 'same-origin'
|
179
|
-
}
|
180
|
-
}),
|
191
|
+
// Proper shutdown for the HTTP server.
|
181
192
|
ApolloServerPluginDrainHttpServer({ httpServer }),
|
193
|
+
// Proper shutdown for the WebSocket server.
|
182
194
|
{
|
183
195
|
async serverWillStart() {
|
184
196
|
return {
|
@@ -187,7 +199,10 @@ const bootstrap = async () => {
|
|
187
199
|
}
|
188
200
|
}
|
189
201
|
}
|
190
|
-
}
|
202
|
+
},
|
203
|
+
ApolloServerPluginLandingPageLocalDefault({
|
204
|
+
embed: true
|
205
|
+
})
|
191
206
|
],
|
192
207
|
cache: 'bounded'
|
193
208
|
})
|
@@ -228,11 +243,7 @@ const bootstrap = async () => {
|
|
228
243
|
app.use(koaBodyParser(bodyParserOption))
|
229
244
|
app.use(graphqlUploadKoa(fileUploadOption))
|
230
245
|
|
231
|
-
|
232
|
-
server.getMiddleware({
|
233
|
-
path: '/graphql'
|
234
|
-
})
|
235
|
-
)
|
246
|
+
server.applyMiddleware({ app, path: '/graphql' })
|
236
247
|
|
237
248
|
/* routers */
|
238
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,10 +1,9 @@
|
|
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
|
|
7
|
-
|
6
|
+
import { getDataSource } from '../../initializers/database'
|
8
7
|
|
9
8
|
const DIRECTIVE = 'transaction'
|
10
9
|
|
@@ -19,9 +18,7 @@ export const transactionDirectiveResolver = (schema: GraphQLSchema) =>
|
|
19
18
|
const { resolve = defaultFieldResolver } = fieldConfig
|
20
19
|
|
21
20
|
fieldConfig.resolve = async function (source, args, context, info) {
|
22
|
-
|
23
|
-
|
24
|
-
return await getConnection().transaction(async tx => {
|
21
|
+
return await getDataSource('tx').transaction(async tx => {
|
25
22
|
/* local-graphql-client로부터 invoke인 경우에는 context.req, context.res 가 없으므로, 빈 오브젝트로 대체해준다. */
|
26
23
|
let wrap = context.app.createContext(context.req || {}, context.res || {})
|
27
24
|
|
@@ -32,8 +29,6 @@ export const transactionDirectiveResolver = (schema: GraphQLSchema) =>
|
|
32
29
|
|
33
30
|
let result = await resolve.call(this, source, args, wrap, info)
|
34
31
|
|
35
|
-
debug('@transaction-end : ', fieldName)
|
36
|
-
|
37
32
|
return result
|
38
33
|
})
|
39
34
|
}
|
@@ -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,8 @@
|
|
1
|
-
import { Subscription, Root, Arg, Resolver } from 'type-graphql'
|
2
|
-
import { pubsub } from '../../pubsub'
|
3
1
|
import { withFilter } from 'graphql-subscriptions'
|
4
|
-
import {
|
2
|
+
import { Arg, Resolver, Root, Subscription } from 'type-graphql'
|
5
3
|
|
6
|
-
|
4
|
+
import { pubsub } from '../../pubsub'
|
5
|
+
import { Data } from './data-types'
|
7
6
|
|
8
7
|
@Resolver()
|
9
8
|
export class DataResolver {
|
@@ -13,8 +12,6 @@ export class DataResolver {
|
|
13
12
|
const { tag } = args
|
14
13
|
const subdomain = domain?.subdomain
|
15
14
|
|
16
|
-
debug('subscribe', subdomain, tag)
|
17
|
-
|
18
15
|
if (!domain || !tag) {
|
19
16
|
throw new Error('domain and tag required')
|
20
17
|
}
|
@@ -1,9 +1,8 @@
|
|
1
|
-
import {
|
1
|
+
import { Field, ObjectType } from 'type-graphql'
|
2
|
+
|
2
3
|
import { ScalarObject } from '../common-types/scalar-object'
|
3
4
|
import { Domain } from '../domain/domain'
|
4
5
|
|
5
|
-
const debug = require('debug')('things-factory:integraton-base:subscribe-data')
|
6
|
-
|
7
6
|
@ObjectType()
|
8
7
|
export class Data {
|
9
8
|
@Field(type => Domain, { nullable: true, description: 'The domain where the data originated' })
|
@@ -1,7 +1,9 @@
|
|
1
|
+
import { URL } from 'url'
|
2
|
+
|
1
3
|
import { config } from '@things-factory/env'
|
2
4
|
import { getPathInfo } from '@things-factory/utils'
|
3
|
-
|
4
|
-
import {
|
5
|
+
|
6
|
+
import { getRepository } from '../initializers/database'
|
5
7
|
import { Domain } from '../service/domain/domain'
|
6
8
|
|
7
9
|
const useVirtualHostBasedDomain = !!config.get('useVirtualHostBasedDomain')
|
@@ -9,8 +11,6 @@ const protocol: string = config.get('protocol')
|
|
9
11
|
const fixed = config.get('subdomain')
|
10
12
|
const subdomainOffset = config.getNumber('subdomainOffset', 2)
|
11
13
|
|
12
|
-
const debug = require('debug')('things-factory:shell:get-domain')
|
13
|
-
|
14
14
|
export function getUrlFromContext(context, path = '') {
|
15
15
|
const { method, href, host } = context
|
16
16
|
const { referer } = context.header
|
@@ -24,7 +24,6 @@ export function getUrlFromContext(context, path = '') {
|
|
24
24
|
}
|
25
25
|
}
|
26
26
|
|
27
|
-
debug('get-url-from-context', method, base)
|
28
27
|
let url: URL = new URL(path, base)
|
29
28
|
url.protocol = protocol || url.protocol
|
30
29
|
return url
|
@@ -73,7 +72,7 @@ export async function getDomainFromURL(context: any): Promise<Domain> {
|
|
73
72
|
const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context)
|
74
73
|
|
75
74
|
if (subdomain) {
|
76
|
-
return await getRepository(Domain).findOne({ subdomain },
|
75
|
+
return await getRepository(Domain).findOne({ where: { subdomain }, cache: true })
|
77
76
|
}
|
78
77
|
}
|
79
78
|
|
@@ -113,7 +112,6 @@ export function getRedirectSubdomainPath(context, subdomain, redirectTo = '/') {
|
|
113
112
|
}
|
114
113
|
}
|
115
114
|
|
116
|
-
debug('get-redirect-subdomain-path', parsed.toString())
|
117
115
|
return parsed.toString()
|
118
116
|
}
|
119
117
|
|
@@ -3,8 +3,6 @@ import { Brackets, EntityMetadata, Repository, SelectQueryBuilder, WhereExpressi
|
|
3
3
|
import { Filter, ListParam } from '../service/common-types/list-param'
|
4
4
|
import { Domain } from '../service/domain/domain'
|
5
5
|
|
6
|
-
const debug = require('debug')('things-factory:shell:get-query-builder-from-list-params')
|
7
|
-
|
8
6
|
/**
|
9
7
|
*
|
10
8
|
* @param options
|
@@ -29,7 +27,10 @@ export function getQueryBuilderFromListParams<Type>(options: {
|
|
29
27
|
return false
|
30
28
|
}
|
31
29
|
if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {
|
32
|
-
|
30
|
+
console.warn(
|
31
|
+
'"searchables" setting is required for like searches with a heavy database query load',
|
32
|
+
filter.name
|
33
|
+
)
|
33
34
|
return false
|
34
35
|
}
|
35
36
|
return true
|
@@ -41,7 +42,10 @@ export function getQueryBuilderFromListParams<Type>(options: {
|
|
41
42
|
return false
|
42
43
|
}
|
43
44
|
if (!searchables.includes(filter.name)) {
|
44
|
-
|
45
|
+
console.warn(
|
46
|
+
'"searchables" setting is required for like searches with a heavy database query load',
|
47
|
+
filter.name
|
48
|
+
)
|
45
49
|
return false
|
46
50
|
}
|
47
51
|
return true
|
@@ -115,7 +119,7 @@ function addCondition<T>(
|
|
115
119
|
if (relationColumn) {
|
116
120
|
var relationColumnMeta = metadata.columns.find(column => column.propertyName === relationColumn)
|
117
121
|
if (!relationColumnMeta) {
|
118
|
-
|
122
|
+
console.warn(`relationColumn "${relationColumn}" in filtersMap for "${name}" is not a relation column`)
|
119
123
|
return
|
120
124
|
}
|
121
125
|
|
@@ -123,7 +127,7 @@ function addCondition<T>(
|
|
123
127
|
var entityMetadata = relation.inverseEntityMetadata
|
124
128
|
var columnMeta = entityMetadata.columns.find(column => column.propertyName === (columnName || 'name'))
|
125
129
|
if (!columnMeta) {
|
126
|
-
|
130
|
+
console.warn(`columnName "${columnName}" in filtersMap for "${name}" is not a column`)
|
127
131
|
return
|
128
132
|
}
|
129
133
|
} else {
|
@@ -135,8 +139,8 @@ function addCondition<T>(
|
|
135
139
|
columnMeta = relationIdMeta.relation.joinColumns[0]
|
136
140
|
} else {
|
137
141
|
columnName
|
138
|
-
?
|
139
|
-
:
|
142
|
+
? console.warn(`columnName "${columnName}" in filtersMap for "${name}" is not a column`)
|
143
|
+
: console.warn(`name "${name}" is not a column`)
|
140
144
|
}
|
141
145
|
} else {
|
142
146
|
var relation = columnMeta.relationMetadata
|
@@ -150,7 +154,7 @@ function addCondition<T>(
|
|
150
154
|
var entityMetadata = relation.inverseEntityMetadata
|
151
155
|
columnMeta = entityMetadata.columns.find(column => column.propertyName === 'name')
|
152
156
|
if (!columnMeta) {
|
153
|
-
|
157
|
+
console.warn(`relation column "${columnName || name}" does not have "name" column`)
|
154
158
|
return
|
155
159
|
}
|
156
160
|
}
|