@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.
Files changed (145) hide show
  1. package/client/elements/custom-alert.js +3 -0
  2. package/config/config.development.js +31 -22
  3. package/dist-server/graphql-local-client.d.ts +28 -0
  4. package/dist-server/graphql-local-client.js.map +1 -1
  5. package/dist-server/index.d.ts +9 -0
  6. package/dist-server/index.js +10 -22
  7. package/dist-server/index.js.map +1 -1
  8. package/dist-server/initializers/database.d.ts +7 -0
  9. package/dist-server/initializers/database.js +38 -8
  10. package/dist-server/initializers/database.js.map +1 -1
  11. package/dist-server/initializers/naming-strategy.d.ts +6 -0
  12. package/dist-server/initializers/naming-strategy.js +3 -5
  13. package/dist-server/initializers/naming-strategy.js.map +1 -1
  14. package/dist-server/middlewares/domain-middleware.d.ts +1 -0
  15. package/dist-server/middlewares/domain-middleware.js +0 -4
  16. package/dist-server/middlewares/domain-middleware.js.map +1 -1
  17. package/dist-server/middlewares/index.d.ts +2 -0
  18. package/dist-server/middlewares/index.js +2 -17
  19. package/dist-server/middlewares/index.js.map +1 -1
  20. package/dist-server/migrations/1000000000000-SeedDomain.d.ts +5 -0
  21. package/dist-server/migrations/1000000000000-SeedDomain.js +4 -4
  22. package/dist-server/migrations/1000000000000-SeedDomain.js.map +1 -1
  23. package/dist-server/migrations/index.d.ts +1 -0
  24. package/dist-server/migrations/index.js.map +1 -1
  25. package/dist-server/pubsub-log-transport.d.ts +8 -0
  26. package/dist-server/pubsub-log-transport.js +3 -5
  27. package/dist-server/pubsub-log-transport.js.map +1 -1
  28. package/dist-server/pubsub.d.ts +2 -0
  29. package/dist-server/pubsub.js +2 -6
  30. package/dist-server/pubsub.js.map +1 -1
  31. package/dist-server/routers/domain-router.d.ts +2 -0
  32. package/dist-server/routers/domain-router.js +2 -7
  33. package/dist-server/routers/domain-router.js.map +1 -1
  34. package/dist-server/routers/global-router.d.ts +2 -0
  35. package/dist-server/routers/global-router.js +3 -7
  36. package/dist-server/routers/global-router.js.map +1 -1
  37. package/dist-server/routers/index.d.ts +2 -0
  38. package/dist-server/routers/index.js +3 -16
  39. package/dist-server/routers/index.js.map +1 -1
  40. package/dist-server/schema.d.ts +2 -0
  41. package/dist-server/schema.js.map +1 -1
  42. package/dist-server/server-dev.d.ts +1 -0
  43. package/dist-server/server-dev.js +27 -26
  44. package/dist-server/server-dev.js.map +1 -1
  45. package/dist-server/server.d.ts +1 -0
  46. package/dist-server/server.js +19 -18
  47. package/dist-server/server.js.map +1 -1
  48. package/dist-server/service/common-types/index.d.ts +6 -0
  49. package/dist-server/service/common-types/index.js +7 -20
  50. package/dist-server/service/common-types/index.js.map +1 -1
  51. package/dist-server/service/common-types/list-param.d.ts +19 -0
  52. package/dist-server/service/common-types/list-param.js +28 -36
  53. package/dist-server/service/common-types/list-param.js.map +1 -1
  54. package/dist-server/service/common-types/log.d.ts +6 -0
  55. package/dist-server/service/common-types/log.js +10 -18
  56. package/dist-server/service/common-types/log.js.map +1 -1
  57. package/dist-server/service/common-types/object-ref.d.ts +5 -0
  58. package/dist-server/service/common-types/object-ref.js +8 -16
  59. package/dist-server/service/common-types/object-ref.js.map +1 -1
  60. package/dist-server/service/common-types/scalar-any.d.ts +2 -0
  61. package/dist-server/service/common-types/scalar-any.js.map +1 -1
  62. package/dist-server/service/common-types/scalar-date.d.ts +2 -0
  63. package/dist-server/service/common-types/scalar-date.js.map +1 -1
  64. package/dist-server/service/common-types/scalar-object.d.ts +1 -0
  65. package/dist-server/service/common-types/scalar-object.js.map +1 -1
  66. package/dist-server/service/directive-transaction/index.d.ts +1 -0
  67. package/dist-server/service/directive-transaction/index.js +2 -15
  68. package/dist-server/service/directive-transaction/index.js.map +1 -1
  69. package/dist-server/service/directive-transaction/transaction.d.ts +3 -0
  70. package/dist-server/service/directive-transaction/transaction.js +4 -9
  71. package/dist-server/service/directive-transaction/transaction.js.map +1 -1
  72. package/dist-server/service/domain/domain-resolver.d.ts +17 -0
  73. package/dist-server/service/domain/domain-resolver.js +58 -68
  74. package/dist-server/service/domain/domain-resolver.js.map +1 -1
  75. package/dist-server/service/domain/domain-types.d.ts +21 -0
  76. package/dist-server/service/domain/domain-types.js +32 -40
  77. package/dist-server/service/domain/domain-types.js.map +1 -1
  78. package/dist-server/service/domain/domain.d.ts +16 -0
  79. package/dist-server/service/domain/domain.js +30 -38
  80. package/dist-server/service/domain/domain.js.map +1 -1
  81. package/dist-server/service/domain/index.d.ts +4 -0
  82. package/dist-server/service/domain/index.js.map +1 -1
  83. package/dist-server/service/index.d.ts +14 -0
  84. package/dist-server/service/index.js +5 -18
  85. package/dist-server/service/index.js.map +1 -1
  86. package/dist-server/service/subscription-data/data-resolver.d.ts +6 -0
  87. package/dist-server/service/subscription-data/data-resolver.js +9 -22
  88. package/dist-server/service/subscription-data/data-resolver.js.map +1 -1
  89. package/dist-server/service/subscription-data/data-types.d.ts +6 -0
  90. package/dist-server/service/subscription-data/data-types.js +8 -17
  91. package/dist-server/service/subscription-data/data-types.js.map +1 -1
  92. package/dist-server/service/subscription-data/index.d.ts +3 -0
  93. package/dist-server/service/subscription-data/index.js.map +1 -1
  94. package/dist-server/tsconfig.tsbuildinfo +1 -0
  95. package/dist-server/utils/condition-builder.d.ts +17 -0
  96. package/dist-server/utils/condition-builder.js +2 -4
  97. package/dist-server/utils/condition-builder.js.map +1 -1
  98. package/dist-server/utils/get-domain.d.ts +10 -0
  99. package/dist-server/utils/get-domain.js +3 -6
  100. package/dist-server/utils/get-domain.js.map +1 -1
  101. package/dist-server/utils/get-query-builder-from-list-params.d.ts +21 -0
  102. package/dist-server/utils/get-query-builder-from-list-params.js +7 -8
  103. package/dist-server/utils/get-query-builder-from-list-params.js.map +1 -1
  104. package/dist-server/utils/index.d.ts +7 -0
  105. package/dist-server/utils/index.js +8 -21
  106. package/dist-server/utils/index.js.map +1 -1
  107. package/dist-server/utils/list-param-adjuster.d.ts +2 -0
  108. package/dist-server/utils/list-param-adjuster.js.map +1 -1
  109. package/dist-server/utils/list-params-converter.d.ts +16 -0
  110. package/dist-server/utils/list-params-converter.js +1 -2
  111. package/dist-server/utils/list-params-converter.js.map +1 -1
  112. package/dist-server/utils/list-query-builder.d.ts +7 -0
  113. package/dist-server/utils/list-query-builder.js +2 -3
  114. package/dist-server/utils/list-query-builder.js.map +1 -1
  115. package/dist-server/utils/publish-progress.d.ts +6 -0
  116. package/dist-server/utils/publish-progress.js.map +1 -1
  117. package/dist-server/webpack/koa-webpack/client.d.ts +1 -0
  118. package/dist-server/webpack/koa-webpack/client.js.map +1 -1
  119. package/dist-server/webpack/koa-webpack/index.d.ts +2 -0
  120. package/dist-server/webpack/koa-webpack/index.js.map +1 -1
  121. package/dist-server/webpack/koa-webpack/middleware.d.ts +0 -0
  122. package/dist-server/webpack/koa-webpack/middleware.js.map +1 -1
  123. package/dist-server/webpack/koa-webpack/validate.d.ts +1 -0
  124. package/dist-server/webpack/koa-webpack/validate.js.map +1 -1
  125. package/ormconfig.js +2 -3
  126. package/package.json +9 -8
  127. package/server/index.ts +1 -0
  128. package/server/initializers/database.ts +49 -9
  129. package/server/middlewares/domain-middleware.ts +0 -5
  130. package/server/middlewares/index.ts +0 -4
  131. package/server/migrations/1000000000000-SeedDomain.ts +4 -2
  132. package/server/pubsub.ts +0 -4
  133. package/server/routers/domain-router.ts +1 -4
  134. package/server/routers/global-router.ts +2 -3
  135. package/server/server-dev.ts +29 -18
  136. package/server/server.ts +8 -8
  137. package/server/service/common-types/list-param.ts +4 -3
  138. package/server/service/directive-transaction/transaction.ts +2 -7
  139. package/server/service/domain/domain-resolver.ts +7 -6
  140. package/server/service/subscription-data/data-resolver.ts +3 -6
  141. package/server/service/subscription-data/data-types.ts +2 -3
  142. package/server/utils/get-domain.ts +5 -7
  143. package/server/utils/get-query-builder-from-list-params.ts +13 -9
  144. package/server/utils/list-params-converter.ts +5 -4
  145. 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": "5.0.7",
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.19",
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": "^5.0.0",
55
- "@things-factory/env": "^5.0.0",
56
- "@things-factory/styles": "^5.0.0",
57
- "@things-factory/utils": "^5.0.1",
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.2.45",
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": "1c7c7618e2e3c9ef8b07d730c3df84c8bc01b35f"
135
+ "gitHead": "e5b9823ab3ebc5d6ae5bcb4b5aa60c1306e4dd7e"
135
136
  }
package/server/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './migrations'
2
2
  export * from './initializers/naming-strategy'
3
+ export * from './initializers/database'
3
4
  export * from './utils'
4
5
  export * from './pubsub'
5
6
  export * from './pubsub-log-transport'
@@ -1,7 +1,8 @@
1
- const path = require('path')
1
+ import { createConnection, DataSource, EntityTarget, Repository } from 'typeorm'
2
+
3
+ import { appRootPath, config, logger } from '@things-factory/env'
2
4
 
3
- import { createConnection } from 'typeorm'
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 connection = await createConnection(ormconfig)
16
- logger.info('Database connection established')
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 connection.query('PRAGMA foreign_keys=OFF')
20
- await connection.synchronize()
21
- await connection.query('PRAGMA foreign_keys=ON')
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
- return connection
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, getRepository } from 'typeorm'
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.findOne({ subdomain: domain.subdomain })
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
- const debug = require('debug')('things-factory:shell:domain-router')
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
- debug('get:/licenses', error)
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
  })
@@ -4,7 +4,7 @@
4
4
  process.env.NODE_ENV = 'development'
5
5
  process.setMaxListeners(0)
6
6
 
7
- import { ApolloServerPluginDrainHttpServer, ApolloServerPluginLandingPageGraphQLPlayground } from 'apollo-server-core'
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
- var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
130
- var accessToken = url.searchParams.get('access_token')
131
- connectionParams['headers']['authorization'] = accessToken
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
- ApolloServerPluginLandingPageGraphQLPlayground({
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
- app.use(
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
- var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
117
- var accessToken = url.searchParams.get('access_token')
118
- connectionParams['headers']['authorization'] = accessToken
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
- app.use(
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, InputType, Field, Int } from 'type-graphql'
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: any
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
- const debug = require('debug')('things-factory:shell:directive-transaction')
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
- debug('@transaction-begin : ', fieldName)
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 { getRepository, In, Repository } from 'typeorm'
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.findOne({ id })
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.findOne({ subdomain: targetSubdomain })
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.findOne({ subdomain })
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.findOne({ name })
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 { Data } from './data-types'
2
+ import { Arg, Resolver, Root, Subscription } from 'type-graphql'
5
3
 
6
- const debug = require('debug')('things-factory:shell:data-subscription')
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 { ObjectType, Field } from 'type-graphql'
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
- import { getRepository } from 'typeorm'
4
- import { URL } from 'url'
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 }, { cache: true })
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
- debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
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
- debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
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
- debug(`relationColumn "${relationColumn}" in filtersMap for "${name}" is not a relation column`)
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
- debug(`columnName "${columnName}" in filtersMap for "${name}" is not a column`)
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
- ? debug(`columnName "${columnName}" in filtersMap for "${name}" is not a column`)
139
- : debug(`name "${name}" is not a column`)
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
- debug(`relation column "${columnName || name}" does not have "name" column`)
157
+ console.warn(`relation column "${columnName || name}" does not have "name" column`)
154
158
  return
155
159
  }
156
160
  }