@things-factory/shell 5.0.15 → 6.0.0-alpha.12

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 (89) hide show
  1. package/bin/things-factory-migration +18 -9
  2. package/client/elements/custom-alert.js +3 -0
  3. package/config/config.development.js +31 -22
  4. package/dist-server/graphql-local-client.d.ts +28 -0
  5. package/dist-server/index.d.ts +9 -0
  6. package/dist-server/index.js +1 -0
  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 +40 -9
  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/middlewares/domain-middleware.d.ts +1 -0
  13. package/dist-server/middlewares/index.d.ts +2 -0
  14. package/dist-server/migrations/1000000000000-SeedDomain.d.ts +5 -0
  15. package/dist-server/migrations/1000000000000-SeedDomain.js +4 -4
  16. package/dist-server/migrations/1000000000000-SeedDomain.js.map +1 -1
  17. package/dist-server/migrations/index.d.ts +1 -0
  18. package/dist-server/pubsub-log-transport.d.ts +8 -0
  19. package/dist-server/pubsub.d.ts +2 -0
  20. package/dist-server/routers/domain-router.d.ts +2 -0
  21. package/dist-server/routers/global-router.d.ts +2 -0
  22. package/dist-server/routers/index.d.ts +2 -0
  23. package/dist-server/schema.d.ts +2 -0
  24. package/dist-server/server-dev.d.ts +1 -0
  25. package/dist-server/server-dev.js +16 -12
  26. package/dist-server/server-dev.js.map +1 -1
  27. package/dist-server/server.d.ts +1 -0
  28. package/dist-server/server.js +9 -6
  29. package/dist-server/server.js.map +1 -1
  30. package/dist-server/service/common-types/index.d.ts +6 -0
  31. package/dist-server/service/common-types/list-param.d.ts +19 -0
  32. package/dist-server/service/common-types/list-param.js +1 -1
  33. package/dist-server/service/common-types/list-param.js.map +1 -1
  34. package/dist-server/service/common-types/log.d.ts +6 -0
  35. package/dist-server/service/common-types/log.js.map +1 -1
  36. package/dist-server/service/common-types/object-ref.d.ts +5 -0
  37. package/dist-server/service/common-types/object-ref.js.map +1 -1
  38. package/dist-server/service/common-types/scalar-any.d.ts +2 -0
  39. package/dist-server/service/common-types/scalar-date.d.ts +2 -0
  40. package/dist-server/service/common-types/scalar-object.d.ts +1 -0
  41. package/dist-server/service/directive-transaction/index.d.ts +1 -0
  42. package/dist-server/service/directive-transaction/transaction.d.ts +3 -0
  43. package/dist-server/service/directive-transaction/transaction.js +2 -2
  44. package/dist-server/service/directive-transaction/transaction.js.map +1 -1
  45. package/dist-server/service/domain/domain-resolver.d.ts +17 -0
  46. package/dist-server/service/domain/domain-resolver.js +14 -13
  47. package/dist-server/service/domain/domain-resolver.js.map +1 -1
  48. package/dist-server/service/domain/domain-types.d.ts +21 -0
  49. package/dist-server/service/domain/domain-types.js.map +1 -1
  50. package/dist-server/service/domain/domain.d.ts +16 -0
  51. package/dist-server/service/domain/domain.js.map +1 -1
  52. package/dist-server/service/domain/index.d.ts +4 -0
  53. package/dist-server/service/index.d.ts +14 -0
  54. package/dist-server/service/subscription-data/data-resolver.d.ts +6 -0
  55. package/dist-server/service/subscription-data/data-resolver.js.map +1 -1
  56. package/dist-server/service/subscription-data/data-types.d.ts +6 -0
  57. package/dist-server/service/subscription-data/data-types.js.map +1 -1
  58. package/dist-server/service/subscription-data/index.d.ts +3 -0
  59. package/dist-server/tsconfig.tsbuildinfo +1 -1
  60. package/dist-server/utils/condition-builder.d.ts +17 -0
  61. package/dist-server/utils/get-domain.d.ts +10 -0
  62. package/dist-server/utils/get-domain.js +2 -2
  63. package/dist-server/utils/get-domain.js.map +1 -1
  64. package/dist-server/utils/get-query-builder-from-list-params.d.ts +21 -0
  65. package/dist-server/utils/get-query-builder-from-list-params.js +26 -7
  66. package/dist-server/utils/get-query-builder-from-list-params.js.map +1 -1
  67. package/dist-server/utils/index.d.ts +7 -0
  68. package/dist-server/utils/list-param-adjuster.d.ts +2 -0
  69. package/dist-server/utils/list-params-converter.d.ts +16 -0
  70. package/dist-server/utils/list-params-converter.js.map +1 -1
  71. package/dist-server/utils/list-query-builder.d.ts +7 -0
  72. package/dist-server/utils/publish-progress.d.ts +6 -0
  73. package/dist-server/webpack/koa-webpack/client.d.ts +1 -0
  74. package/dist-server/webpack/koa-webpack/index.d.ts +2 -0
  75. package/dist-server/webpack/koa-webpack/middleware.d.ts +0 -0
  76. package/dist-server/webpack/koa-webpack/validate.d.ts +1 -0
  77. package/ormconfig.js +2 -3
  78. package/package.json +8 -7
  79. package/server/index.ts +1 -0
  80. package/server/initializers/database.ts +52 -10
  81. package/server/migrations/1000000000000-SeedDomain.ts +4 -2
  82. package/server/server-dev.ts +29 -16
  83. package/server/server.ts +8 -8
  84. package/server/service/common-types/list-param.ts +4 -3
  85. package/server/service/directive-transaction/transaction.ts +3 -2
  86. package/server/service/domain/domain-resolver.ts +7 -6
  87. package/server/utils/get-domain.ts +2 -2
  88. package/server/utils/get-query-builder-from-list-params.ts +30 -7
  89. package/server/utils/list-params-converter.ts +1 -1
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,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 getConnection().transaction(async tx => {
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 { 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,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 }, { cache: true })
75
+ return await getRepository(Domain).findOne({ where: { subdomain }, cache: true })
76
76
  }
77
77
  }
78
78
 
@@ -1,4 +1,5 @@
1
1
  import { Brackets, EntityMetadata, Repository, SelectQueryBuilder, WhereExpressionBuilder } from 'typeorm'
2
+ import { RelationMetadata } from 'typeorm/metadata/RelationMetadata'
2
3
 
3
4
  import { Filter, ListParam } from '../service/common-types/list-param'
4
5
  import { Domain } from '../service/domain/domain'
@@ -105,7 +106,7 @@ function addCondition<T>(
105
106
  ): void {
106
107
  const { name, operator, value } = filter
107
108
  const values = value instanceof Array ? value : [value]
108
- const entityAlias = selectQueryBuilder.alias
109
+ var entityAlias = selectQueryBuilder.alias
109
110
 
110
111
  var { relationColumn, columnName } = filtersMap[name] || {}
111
112
  /*
@@ -117,14 +118,36 @@ function addCondition<T>(
117
118
  - 이 경우는 columnName 만 적용한다.
118
119
  */
119
120
  if (relationColumn) {
120
- var relationColumnMeta = metadata.columns.find(column => column.propertyName === relationColumn)
121
- if (!relationColumnMeta) {
122
- console.warn(`relationColumn "${relationColumn}" in filtersMap for "${name}" is not a relation column`)
123
- return
121
+ const columns = relationColumn.split('.')
122
+ var entityMetadata: EntityMetadata
123
+ var relation: RelationMetadata
124
+
125
+ for (const rcolumn of columns) {
126
+ if (relation) {
127
+ const { propertyName } = relationColumnMeta
128
+ const property = `${entityAlias}.${propertyName}`
129
+
130
+ entityAlias = `${entityMetadata.tableName}-${entityMetadata.tableName}` as string
131
+
132
+ if (andCondition) {
133
+ selectQueryBuilder.innerJoin(property, entityAlias)
134
+ } else {
135
+ selectQueryBuilder.leftJoin(property, entityAlias)
136
+ }
137
+ } else {
138
+ entityMetadata = metadata
139
+ }
140
+
141
+ var relationColumnMeta = entityMetadata.columns.find(column => column.propertyName === rcolumn)
142
+ if (!relationColumnMeta) {
143
+ console.warn(`relationColumn "${relationColumn}" in filtersMap for "${name}" is not a relation column`)
144
+ return
145
+ }
146
+
147
+ relation = relationColumnMeta.relationMetadata
148
+ entityMetadata = relation.inverseEntityMetadata
124
149
  }
125
150
 
126
- var relation = relationColumnMeta.relationMetadata
127
- var entityMetadata = relation.inverseEntityMetadata
128
151
  var columnMeta = entityMetadata.columns.find(column => column.propertyName === (columnName || 'name'))
129
152
  if (!columnMeta) {
130
153
  console.warn(`columnName "${columnName}" in filtersMap for "${name}" is not a column`)
@@ -29,7 +29,7 @@ const OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator
29
29
  between: value => Between(value[0], value[1])
30
30
  }
31
31
 
32
- function getOperatorFunction({ operator, value }: { operator: string; value: any }): FindOperator<any> {
32
+ function getOperatorFunction({ operator, value }: Filter): FindOperator<any> {
33
33
  return OPERATION_FUNCTION_MAP[operator](value)
34
34
  }
35
35