@things-factory/shell 8.0.37 → 9.0.0-9.0.0-beta.59.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 (180) hide show
  1. package/_index.html +0 -1
  2. package/bin/things-factory-migration +6 -3
  3. package/client/themes/calendar-theme.css +3 -1
  4. package/client/themes/index.css +2 -1
  5. package/dist-server/index.d.ts +12 -12
  6. package/dist-server/index.js +12 -12
  7. package/dist-server/index.js.map +1 -1
  8. package/dist-server/initializers/database.js +4 -10
  9. package/dist-server/initializers/database.js.map +1 -1
  10. package/dist-server/initializers/ormconfig.d.ts +2 -0
  11. package/dist-server/initializers/ormconfig.js +30 -0
  12. package/dist-server/initializers/ormconfig.js.map +1 -0
  13. package/dist-server/middlewares/domain-middleware.js +2 -2
  14. package/dist-server/middlewares/domain-middleware.js.map +1 -1
  15. package/dist-server/middlewares/index.d.ts +1 -1
  16. package/dist-server/middlewares/index.js +3 -3
  17. package/dist-server/middlewares/index.js.map +1 -1
  18. package/dist-server/migrations/1000000000000-SeedDomain.js +4 -4
  19. package/dist-server/migrations/1000000000000-SeedDomain.js.map +1 -1
  20. package/dist-server/migrations/index.js.map +1 -1
  21. package/dist-server/process-cleaner.d.ts +1 -0
  22. package/dist-server/process-cleaner.js +92 -0
  23. package/dist-server/process-cleaner.js.map +1 -0
  24. package/dist-server/routers/domain-router.js +3 -3
  25. package/dist-server/routers/domain-router.js.map +1 -1
  26. package/dist-server/routers/global-router.js +6 -6
  27. package/dist-server/routers/global-router.js.map +1 -1
  28. package/dist-server/routers/index.d.ts +3 -3
  29. package/dist-server/routers/index.js +3 -3
  30. package/dist-server/routers/index.js.map +1 -1
  31. package/dist-server/schema.js +5 -4
  32. package/dist-server/schema.js.map +1 -1
  33. package/dist-server/server-dev.js +37 -39
  34. package/dist-server/server-dev.js.map +1 -1
  35. package/dist-server/server.js +34 -36
  36. package/dist-server/server.js.map +1 -1
  37. package/dist-server/service/attribute-set/attribute-set-item-type.js +3 -3
  38. package/dist-server/service/attribute-set/attribute-set-item-type.js.map +1 -1
  39. package/dist-server/service/attribute-set/attribute-set-mutation.d.ts +2 -2
  40. package/dist-server/service/attribute-set/attribute-set-mutation.js +16 -16
  41. package/dist-server/service/attribute-set/attribute-set-mutation.js.map +1 -1
  42. package/dist-server/service/attribute-set/attribute-set-query.d.ts +3 -3
  43. package/dist-server/service/attribute-set/attribute-set-query.js +15 -15
  44. package/dist-server/service/attribute-set/attribute-set-query.js.map +1 -1
  45. package/dist-server/service/attribute-set/attribute-set-type.d.ts +2 -2
  46. package/dist-server/service/attribute-set/attribute-set-type.js +5 -5
  47. package/dist-server/service/attribute-set/attribute-set-type.js.map +1 -1
  48. package/dist-server/service/attribute-set/attribute-set.d.ts +1 -1
  49. package/dist-server/service/attribute-set/attribute-set.js +2 -2
  50. package/dist-server/service/attribute-set/attribute-set.js.map +1 -1
  51. package/dist-server/service/attribute-set/index.d.ts +3 -3
  52. package/dist-server/service/attribute-set/index.js +5 -5
  53. package/dist-server/service/attribute-set/index.js.map +1 -1
  54. package/dist-server/service/common-types/index.d.ts +6 -6
  55. package/dist-server/service/common-types/index.js +6 -6
  56. package/dist-server/service/common-types/index.js.map +1 -1
  57. package/dist-server/service/common-types/list-param.js +2 -2
  58. package/dist-server/service/common-types/list-param.js.map +1 -1
  59. package/dist-server/service/common-types/log.js +2 -2
  60. package/dist-server/service/common-types/log.js.map +1 -1
  61. package/dist-server/service/common-types/scalar-object.d.ts +2 -1
  62. package/dist-server/service/common-types/scalar-object.js +2 -2
  63. package/dist-server/service/common-types/scalar-object.js.map +1 -1
  64. package/dist-server/service/directive-transaction/index.d.ts +1 -1
  65. package/dist-server/service/directive-transaction/index.js +1 -1
  66. package/dist-server/service/directive-transaction/index.js.map +1 -1
  67. package/dist-server/service/directive-transaction/transaction.js +2 -2
  68. package/dist-server/service/directive-transaction/transaction.js.map +1 -1
  69. package/dist-server/service/domain/domain-mutation.d.ts +2 -2
  70. package/dist-server/service/domain/domain-mutation.js +21 -21
  71. package/dist-server/service/domain/domain-mutation.js.map +1 -1
  72. package/dist-server/service/domain/domain-query.js +6 -6
  73. package/dist-server/service/domain/domain-query.js.map +1 -1
  74. package/dist-server/service/domain/domain-types.d.ts +2 -2
  75. package/dist-server/service/domain/domain-types.js +6 -6
  76. package/dist-server/service/domain/domain-types.js.map +1 -1
  77. package/dist-server/service/domain/index.d.ts +3 -3
  78. package/dist-server/service/domain/index.js +5 -5
  79. package/dist-server/service/domain/index.js.map +1 -1
  80. package/dist-server/service/index.d.ts +7 -7
  81. package/dist-server/service/index.js +16 -16
  82. package/dist-server/service/index.js.map +1 -1
  83. package/dist-server/service/subscription-data/data-resolver.d.ts +1 -1
  84. package/dist-server/service/subscription-data/data-resolver.js +4 -4
  85. package/dist-server/service/subscription-data/data-resolver.js.map +1 -1
  86. package/dist-server/service/subscription-data/data-types.d.ts +1 -1
  87. package/dist-server/service/subscription-data/data-types.js +5 -5
  88. package/dist-server/service/subscription-data/data-types.js.map +1 -1
  89. package/dist-server/service/subscription-data/index.d.ts +1 -1
  90. package/dist-server/service/subscription-data/index.js +2 -2
  91. package/dist-server/service/subscription-data/index.js.map +1 -1
  92. package/dist-server/tsconfig.tsbuildinfo +1 -1
  93. package/dist-server/typeorm/encrypt-transform.js +3 -3
  94. package/dist-server/typeorm/encrypt-transform.js.map +1 -1
  95. package/dist-server/utils/get-times-for-period.d.ts +24 -4
  96. package/dist-server/utils/get-times-for-period.js +42 -5
  97. package/dist-server/utils/get-times-for-period.js.map +1 -1
  98. package/dist-server/utils/index.d.ts +8 -8
  99. package/dist-server/utils/index.js +8 -8
  100. package/dist-server/utils/index.js.map +1 -1
  101. package/dist-server/utils/list-param-adjuster.d.ts +1 -1
  102. package/dist-server/utils/list-param-adjuster.js.map +1 -1
  103. package/dist-server/utils/list-params-converter.d.ts +2 -2
  104. package/dist-server/utils/list-params-converter.js +2 -2
  105. package/dist-server/utils/list-params-converter.js.map +1 -1
  106. package/dist-server/utils/list-query-builder.d.ts +1 -1
  107. package/dist-server/utils/list-query-builder.js +7 -7
  108. package/dist-server/utils/list-query-builder.js.map +1 -1
  109. package/dist-server/utils/publish-progress.js +2 -2
  110. package/dist-server/utils/publish-progress.js.map +1 -1
  111. package/package.json +14 -19
  112. package/translations/en.json +2 -0
  113. package/translations/ja.json +2 -0
  114. package/translations/ko.json +3 -1
  115. package/translations/ms.json +2 -0
  116. package/translations/zh.json +2 -0
  117. package/views/public/home.html +0 -1
  118. package/client/hot-client/hot.js +0 -140
  119. package/client/hot-client/index.js +0 -103
  120. package/client/hot-client/log.js +0 -44
  121. package/client/hot-client/socket.js +0 -63
  122. package/client/scene/scene-components.js +0 -3
  123. package/client/scene/scene-player.js +0 -103
  124. package/client/scene/scene-viewer.js +0 -106
  125. package/client/scene/things-scene-components.import +0 -1
  126. package/ormconfig.js +0 -31
  127. package/server/graphql-local-client.ts +0 -59
  128. package/server/index.ts +0 -13
  129. package/server/initializers/database.ts +0 -96
  130. package/server/initializers/naming-strategy.ts +0 -14
  131. package/server/middlewares/domain-middleware.ts +0 -60
  132. package/server/middlewares/index.ts +0 -43
  133. package/server/migrations/1000000000000-SeedDomain.ts +0 -37
  134. package/server/migrations/index.ts +0 -9
  135. package/server/pubsub-log-transport.ts +0 -59
  136. package/server/pubsub.ts +0 -84
  137. package/server/routers/domain-router.ts +0 -13
  138. package/server/routers/global-router.ts +0 -76
  139. package/server/routers/graphql-router.ts +0 -3
  140. package/server/routers/index.ts +0 -3
  141. package/server/schema.ts +0 -163
  142. package/server/server-dev.ts +0 -305
  143. package/server/server.ts +0 -296
  144. package/server/service/attribute-set/attribute-set-item-type.ts +0 -65
  145. package/server/service/attribute-set/attribute-set-mutation.ts +0 -125
  146. package/server/service/attribute-set/attribute-set-query.ts +0 -36
  147. package/server/service/attribute-set/attribute-set-type.ts +0 -46
  148. package/server/service/attribute-set/attribute-set.ts +0 -35
  149. package/server/service/attribute-set/index.ts +0 -6
  150. package/server/service/common-types/index.ts +0 -6
  151. package/server/service/common-types/list-param.ts +0 -61
  152. package/server/service/common-types/log.ts +0 -17
  153. package/server/service/common-types/object-ref.ts +0 -13
  154. package/server/service/common-types/scalar-any.ts +0 -44
  155. package/server/service/common-types/scalar-date.ts +0 -22
  156. package/server/service/common-types/scalar-object.ts +0 -15
  157. package/server/service/directive-transaction/index.ts +0 -1
  158. package/server/service/directive-transaction/transaction.ts +0 -40
  159. package/server/service/domain/domain-mutation.ts +0 -120
  160. package/server/service/domain/domain-query.ts +0 -55
  161. package/server/service/domain/domain-types.ts +0 -69
  162. package/server/service/domain/domain.ts +0 -112
  163. package/server/service/domain/index.ts +0 -6
  164. package/server/service/index.ts +0 -32
  165. package/server/service/subscription-data/data-resolver.ts +0 -37
  166. package/server/service/subscription-data/data-types.ts +0 -16
  167. package/server/service/subscription-data/index.ts +0 -4
  168. package/server/typeorm/encrypt-transform.ts +0 -70
  169. package/server/typeorm/get-data-encryption-key.ts +0 -13
  170. package/server/typeorm/json5-transform.ts +0 -26
  171. package/server/typeorm/round-transform.ts +0 -20
  172. package/server/utils/condition-builder.ts +0 -145
  173. package/server/utils/get-domain.ts +0 -228
  174. package/server/utils/get-query-builder-from-list-params.ts +0 -469
  175. package/server/utils/get-times-for-period.ts +0 -60
  176. package/server/utils/index.ts +0 -8
  177. package/server/utils/list-param-adjuster.ts +0 -21
  178. package/server/utils/list-params-converter.ts +0 -200
  179. package/server/utils/list-query-builder.ts +0 -120
  180. package/server/utils/publish-progress.ts +0 -23
@@ -1,13 +0,0 @@
1
- import { InputType, Field, ID } from 'type-graphql'
2
-
3
- @InputType()
4
- export class ObjectRef {
5
- @Field(() => ID, { description: 'Field id' })
6
- id: string
7
-
8
- @Field({ nullable: true, description: 'Field name' })
9
- name?: string
10
-
11
- @Field({ nullable: true, description: 'Field description' })
12
- description?: string
13
- }
@@ -1,44 +0,0 @@
1
- import { GraphQLScalarType, Kind } from 'graphql'
2
-
3
- function parseObject(ast) {
4
- const value = Object.create(null)
5
- ast.fields.forEach(field => {
6
- value[field.name.value] = parseAst(field.value)
7
- })
8
- return value
9
- }
10
-
11
- function parseAst(ast) {
12
- switch (ast.kind) {
13
- case Kind.INT:
14
- return parseInt(ast.value)
15
- case Kind.FLOAT:
16
- return parseFloat(ast.value)
17
- case Kind.BOOLEAN:
18
- return ast.value
19
- case Kind.STRING:
20
- return ast.value
21
- case Kind.LIST:
22
- return ast.values.map(parseAst)
23
- case Kind.OBJECT:
24
- return parseObject(ast)
25
- default:
26
- return null
27
- }
28
- }
29
-
30
- export const ScalarAny = new GraphQLScalarType({
31
- name: 'Any',
32
- description: 'Any Scalar type (String, Boolean, Int, Float, Object, List)',
33
- serialize(value) {
34
- // Implement your own behavior here by setting the 'result' variable
35
- return value
36
- },
37
- parseValue(value) {
38
- // Implement your own behavior here by setting the 'result' variable
39
- return value
40
- },
41
- parseLiteral(ast) {
42
- return parseAst(ast)
43
- }
44
- })
@@ -1,22 +0,0 @@
1
- import { GraphQLScalarType, Kind } from 'graphql'
2
-
3
- export const ScalarDate = new GraphQLScalarType({
4
- name: 'Date',
5
- description: 'Date custom scalar type',
6
- parseValue(value) {
7
- return new Date(value as string | number) // value from the client
8
- },
9
- serialize(value) {
10
- /**
11
- * Note: Allow value to be date only like "2021-01-31" to be serialize before passing data to clientside for TypeGraphql.
12
- * Usage: When database column datatype is "date" and data do not contain any time component.
13
- */
14
- return new Date(value as any).getTime() // value sent to the client
15
- },
16
- parseLiteral(ast) {
17
- if (ast.kind === Kind.INT) {
18
- return new Date(+ast.value) // ast value is always in string format
19
- }
20
- return null
21
- }
22
- })
@@ -1,15 +0,0 @@
1
- const { GraphQLScalarType } = require('graphql')
2
-
3
- export const ScalarObject = new GraphQLScalarType({
4
- name: 'Object',
5
- description: 'Can be anything',
6
- parseValue(value) {
7
- return value
8
- },
9
- serialize(value) {
10
- return value
11
- },
12
- parseLiteral(ast) {
13
- return ast
14
- }
15
- })
@@ -1 +0,0 @@
1
- export * from './transaction'
@@ -1,40 +0,0 @@
1
- import { defaultFieldResolver, GraphQLSchema } from 'graphql'
2
- import gql from 'graphql-tag'
3
-
4
- import { getDirective, MapperKind, mapSchema } from '@graphql-tools/utils'
5
-
6
- import { getDataSource } from '../../initializers/database'
7
-
8
- const DIRECTIVE = 'transaction'
9
-
10
- export const transactionDirectiveTypeDefs = gql`
11
- directive @${DIRECTIVE} on FIELD_DEFINITION
12
- `
13
- export const transactionDirectiveResolver = (schema: GraphQLSchema) =>
14
- mapSchema(schema, {
15
- [MapperKind.OBJECT_FIELD]: (fieldConfig, fieldName) => {
16
- const transactionDirective = getDirective(schema, fieldConfig, DIRECTIVE)?.[0]
17
- if (transactionDirective) {
18
- const { resolve = defaultFieldResolver } = fieldConfig
19
-
20
- fieldConfig.resolve = async function (source, args, context, info) {
21
- return await getDataSource('tx').transaction(async tx => {
22
- /* local-graphql-client로부터 invoke인 경우에는 context.req, context.res 가 없으므로, 빈 오브젝트로 대체해준다. */
23
- let wrap = context.app.createContext(context.req || {}, context.res || {})
24
-
25
- wrap.state = {
26
- ...context.state,
27
- tx
28
- }
29
- wrap.t = context.t
30
-
31
- let result = await resolve.call(this, source, args, wrap, info)
32
-
33
- return result
34
- })
35
- }
36
-
37
- return fieldConfig
38
- }
39
- }
40
- })
@@ -1,120 +0,0 @@
1
- import { Arg, Args, Ctx, Directive, Mutation, Query, Resolver, Root } from 'type-graphql'
2
- import { In, Repository } from 'typeorm'
3
-
4
- import { slugger } from '@things-factory/utils'
5
-
6
- import { getRepository } from '../../initializers/database'
7
-
8
- import { Domain, IPList } from './domain'
9
- import { DomainPatch } from './domain-types'
10
- import { ScalarObject } from '../common-types'
11
-
12
- @Resolver(Domain)
13
- export class DomainMutation {
14
- @Directive('@transaction')
15
- @Directive('@privilege(superUserGranted: true)')
16
- @Mutation(returns => Domain, { description: 'To create domain (Only superuser is granted this privilege.)' })
17
- async createDomain(@Arg('domainInput') domainInput: DomainPatch) {
18
- const { name, description } = domainInput
19
- const domainRepo: Repository<Domain> = getRepository(Domain)
20
- const subdomain: string = slugger(name)
21
-
22
- const domain: Domain = await domainRepo.findOneBy({ subdomain })
23
- if (domain) {
24
- throw new Error('domain is duplicated')
25
- }
26
-
27
- return await domainRepo.save({ name, description, subdomain })
28
- }
29
-
30
- @Directive('@transaction')
31
- @Directive('@privilege(superUserGranted: true)')
32
- @Mutation(returns => Domain, { description: 'To delete domain (Only superuser is granted this privilege.)' })
33
- async deleteDomain(@Arg('name') name: string) {
34
- return await getRepository(Domain).delete({ name })
35
- }
36
-
37
- @Directive('@transaction')
38
- @Directive('@privilege(superUserGranted: true)')
39
- @Mutation(returns => Boolean, {
40
- description: 'To delete multiple domains (Only superuser is granted this privilege.)'
41
- })
42
- async deleteDomains(@Arg('names', () => [String]) names: string[]) {
43
- const domains: Domain[] = await getRepository(Domain).find({ where: { name: In(names) } })
44
- const domainIds: string[] = domains.map(domain => domain.id)
45
-
46
- await getRepository(Domain).delete({ id: In(domainIds) })
47
- }
48
-
49
- @Directive('@transaction')
50
- @Directive('@privilege(superUserGranted: true)')
51
- @Mutation(returns => Domain, {
52
- description: 'To update domain (Only superuser is granted this privilege.)'
53
- })
54
- async updateDomain(@Arg('name') name: string, @Arg('patch', () => DomainPatch) patch: DomainPatch) {
55
- const repository = getRepository(Domain)
56
- const domain: Domain = await repository.findOneBy({ name })
57
-
58
- if (patch.parent && patch.parent.id == domain.id) {
59
- delete patch.parent
60
- }
61
-
62
- return await repository.save({
63
- ...domain,
64
- ...patch
65
- } as any)
66
- }
67
-
68
- @Directive('@transaction')
69
- @Directive('@privilege(superUserGranted: true)')
70
- @Mutation(returns => Boolean, {
71
- description: 'To update multiple domains (Only superuser is granted this privilege.)'
72
- })
73
- async updateDomains(@Arg('patches', () => [DomainPatch]) patches: DomainPatch[]): Promise<boolean> {
74
- const domainRepo: Repository<Domain> = getRepository(Domain)
75
-
76
- const patchIds = patches.filter((patch: any) => patch.id)
77
-
78
- if (patchIds.length > 0) {
79
- patchIds.forEach(async updateRecord => {
80
- const domain: Domain = await domainRepo.findOne({ where: { id: updateRecord.id } })
81
-
82
- if (updateRecord.name) {
83
- updateRecord.subdomain = slugger(updateRecord.name)
84
- }
85
-
86
- if (updateRecord.parent && updateRecord.parent.id == domain.id) {
87
- delete updateRecord.parent
88
- }
89
-
90
- await domainRepo.save({
91
- ...domain,
92
- ...updateRecord
93
- } as any)
94
- })
95
- }
96
-
97
- return true
98
- }
99
-
100
- @Directive('@transaction')
101
- @Directive(
102
- '@privilege(category: "security", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'
103
- )
104
- @Mutation(returns => ScalarObject, { nullable: true, description: 'To update secure IP list for domain' })
105
- async updateSecureIPList(
106
- @Arg('iplist', type => ScalarObject) iplist: IPList,
107
- @Ctx() context: any
108
- ): Promise<IPList | null> {
109
- const { domain } = context.state
110
- const repository = getRepository(Domain)
111
- // const domain: Domain = await repository.findOneBy({ id })
112
-
113
- const { iplist: result } = await repository.save({
114
- ...domain,
115
- iplist
116
- } as any)
117
-
118
- return result
119
- }
120
- }
@@ -1,55 +0,0 @@
1
- import { Arg, Args, Ctx, Directive, Mutation, Query, Resolver, FieldResolver, Root } from 'type-graphql'
2
- import { In, Repository } from 'typeorm'
3
-
4
- import { getRepository } from '../../initializers/database'
5
- import { getQueryBuilderFromListParams } from '../../utils/get-query-builder-from-list-params'
6
-
7
- import { ListParam } from '../common-types/list-param.js'
8
- import { Domain, IPList } from './domain.js'
9
- import { DomainList } from './domain-types.js'
10
- import { ScalarObject } from '../common-types/scalar-object.js'
11
- import { config } from '@things-factory/env'
12
-
13
- @Resolver(Domain)
14
- export class DomainQuery {
15
- @Directive('@privilege(superUserGranted: true)')
16
- @Query(returns => [String], { description: 'To fetch domain' })
17
- async domainTypes(@Ctx() context: any): Promise<String[]> {
18
- return config.get('domainTypes') || ['domain']
19
- }
20
-
21
- @Directive('@privilege(superUserGranted: true)')
22
- @Query(returns => Domain, { description: 'To fetch domain' })
23
- async domain(@Arg('id') id: string, @Ctx() context: any): Promise<Domain> {
24
- const repository = getRepository(Domain)
25
-
26
- return await repository.findOneBy({ id })
27
- }
28
-
29
- @Directive('@privilege(superUserGranted: true)')
30
- @Query(returns => DomainList, { description: 'To fetch all domains (Only superuser is granted this privilege.)' })
31
- async domains(@Args(type => ListParam) params: ListParam, @Ctx() context: any): Promise<DomainList> {
32
- const queryBuilder = await getQueryBuilderFromListParams({
33
- repository: getRepository(Domain),
34
- alias: 'ContactPoint',
35
- params,
36
- searchables: ['name', 'description', 'subdomain']
37
- })
38
-
39
- const [items, total] = await queryBuilder.getManyAndCount()
40
-
41
- return { items, total }
42
- }
43
-
44
- @Directive('@privilege(category: "security", privilege: "query", domainOwnerGranted: true, superUserGranted: true)')
45
- @Query(returns => ScalarObject, { nullable: true, description: 'To fetch domain' })
46
- async secureIPList(@Ctx() context: any): Promise<IPList | null> {
47
- const { domain } = context.state
48
- return domain.iplist
49
- }
50
-
51
- @FieldResolver(type => Domain)
52
- async parent(@Root() domain: Domain): Promise<Domain> {
53
- return domain.parentId && (await getRepository(Domain).findOneBy({ id: domain.parentId }))
54
- }
55
- }
@@ -1,69 +0,0 @@
1
- import { ObjectType, InputType, Field, Int } from 'type-graphql'
2
- import { Domain, IPList } from './domain'
3
- import { ObjectRef, ScalarObject } from '../common-types'
4
-
5
- @InputType()
6
- export class DomainInput {
7
- @Field()
8
- name: string
9
-
10
- @Field({ nullable: true })
11
- description?: string
12
-
13
- @Field({ nullable: true })
14
- extType?: string
15
- }
16
-
17
- @InputType()
18
- export class DomainPatch {
19
- @Field({ nullable: true })
20
- id?: string
21
-
22
- @Field({ nullable: true })
23
- name?: string
24
-
25
- @Field({ nullable: true })
26
- description?: string
27
-
28
- @Field({ nullable: true })
29
- timezone?: string
30
-
31
- @Field({ nullable: true })
32
- systemFlag?: Boolean
33
-
34
- @Field({ nullable: true })
35
- subdomain?: string
36
-
37
- @Field({ nullable: true })
38
- owner?: string
39
-
40
- @Field(type => ObjectRef, { nullable: true })
41
- parent?: ObjectRef
42
-
43
- @Field({ nullable: true })
44
- brandName?: string
45
-
46
- @Field({ nullable: true })
47
- brandImage?: string
48
-
49
- @Field({ nullable: true })
50
- contentImage?: string
51
-
52
- @Field({ nullable: true })
53
- extType?: string
54
-
55
- @Field(type => ScalarObject, { nullable: true })
56
- attributes?: any
57
-
58
- @Field({ nullable: true })
59
- theme?: string
60
- }
61
-
62
- @ObjectType()
63
- export class DomainList {
64
- @Field(type => [Domain], { nullable: true })
65
- items: Domain[]
66
-
67
- @Field(type => Int, { nullable: true })
68
- total: number
69
- }
@@ -1,112 +0,0 @@
1
- import {
2
- Column,
3
- CreateDateColumn,
4
- ManyToOne,
5
- OneToMany,
6
- RelationId,
7
- Entity,
8
- Index,
9
- UpdateDateColumn,
10
- DeleteDateColumn,
11
- PrimaryGeneratedColumn
12
- } from 'typeorm'
13
- import { ObjectType, Directive, Field, ID } from 'type-graphql'
14
- import { ScalarObject } from '../common-types/scalar-object.js'
15
-
16
- export type IPList = {
17
- whitelist?: string[]
18
- blacklist?: string[]
19
- protectedlist?: string[]
20
- privileges?: {
21
- category: string
22
- privilege: string
23
- }[]
24
- }
25
-
26
- @Entity()
27
- @Index('ix_domain_0', (domain: Domain) => [domain.subdomain, domain.deletedAt], {
28
- unique: true,
29
- where: '"deleted_at" IS NULL'
30
- })
31
- @ObjectType()
32
- export class Domain {
33
- @PrimaryGeneratedColumn('uuid')
34
- @Field(type => ID)
35
- readonly id: string
36
-
37
- @Field()
38
- @Column({ unique: true })
39
- name: string
40
-
41
- @Field({ nullable: true })
42
- @Column({ nullable: true })
43
- description: string
44
-
45
- @Field({ nullable: true })
46
- @Column({ nullable: true })
47
- extType: string
48
-
49
- @Field({ nullable: true })
50
- @Column({ nullable: true })
51
- timezone: string
52
-
53
- @Directive('@deprecated(reason: "Use `parent`")')
54
- @Field({ nullable: true })
55
- @Column({ default: false })
56
- systemFlag: boolean
57
-
58
- @Field({ nullable: true })
59
- @Column({ nullable: true })
60
- subdomain: string
61
-
62
- @Field({ nullable: true })
63
- @ManyToOne(type => Domain, { nullable: true })
64
- parent: Domain
65
-
66
- @RelationId((domain: Domain) => domain.parent)
67
- parentId?: string
68
-
69
- @OneToMany(type => Domain, domain => domain.parent)
70
- @Field(type => Domain, { nullable: true })
71
- children: Domain[]
72
-
73
- @Field({ nullable: true })
74
- @Column({ nullable: true })
75
- brandName: string
76
-
77
- @Field({ nullable: true })
78
- @Column({ nullable: true })
79
- brandImage: string
80
-
81
- @Field({ nullable: true })
82
- @Column({ nullable: true })
83
- contentImage: string
84
-
85
- @Field({ nullable: true })
86
- @Column({ nullable: true })
87
- owner: string
88
-
89
- @Field({ nullable: true })
90
- @Column({ nullable: true })
91
- theme: string
92
-
93
- @Column('simple-json', { nullable: true })
94
- @Field(type => ScalarObject, { nullable: true })
95
- iplist?: IPList
96
-
97
- @Column('simple-json', { nullable: true })
98
- @Field(type => ScalarObject, { nullable: true })
99
- attributes?: any
100
-
101
- @Field({ nullable: true })
102
- @CreateDateColumn()
103
- createdAt: Date
104
-
105
- @Field({ nullable: true })
106
- @UpdateDateColumn()
107
- updatedAt: Date
108
-
109
- @DeleteDateColumn()
110
- @Field({ nullable: true })
111
- deletedAt?: Date
112
- }
@@ -1,6 +0,0 @@
1
- import { Domain } from './domain'
2
- import { DomainQuery } from './domain-query'
3
- import { DomainMutation } from './domain-mutation'
4
-
5
- export const entities = [Domain]
6
- export const resolvers = [DomainQuery, DomainMutation]
@@ -1,32 +0,0 @@
1
- import { transactionDirectiveResolver, transactionDirectiveTypeDefs } from './directive-transaction'
2
- import { entities as DomainEntities, resolvers as DomainResolvers } from './domain'
3
- import { entities as AttributeEntities, resolvers as AttributeResolvers } from './attribute-set'
4
- import { resolvers as SubscriptionDataResolvers } from './subscription-data'
5
-
6
- export * from './common-types'
7
- export * from './domain/domain'
8
- export * from './domain/domain'
9
-
10
- /* EXPORT TYPES */
11
- export * from './domain/domain-types'
12
- export * from './subscription-data/data-types'
13
-
14
- export const entities = [
15
- /* Entities */
16
- ...AttributeEntities,
17
- ...DomainEntities
18
- ]
19
- export const schema = {
20
- typeDefs: {
21
- transactionDirectiveTypeDefs
22
- },
23
- resolverClasses: [
24
- /* Resolvers */
25
- ...AttributeResolvers,
26
- ...DomainResolvers,
27
- ...SubscriptionDataResolvers
28
- ],
29
- directives: {
30
- transaction: transactionDirectiveResolver
31
- }
32
- }
@@ -1,37 +0,0 @@
1
- import { filter, pipe } from 'graphql-yoga'
2
- import { Arg, Resolver, Root, Subscription } from 'type-graphql'
3
-
4
- import { pubsub } from '../../pubsub'
5
- import { Data } from './data-types'
6
-
7
- /* 이 Resolver는 @things-factory/integration-base 에서 Overide 된다. (state-register를 사용하기 위해서) */
8
- @Resolver()
9
- export class DataResolver {
10
- @Subscription({
11
- subscribe: ({ args, context, info }) => {
12
- const { domain, user } = context.state
13
- const { tag } = args
14
- const subdomain = domain?.subdomain
15
-
16
- if (!domain || !tag) {
17
- throw new Error('domain and tag required')
18
- }
19
-
20
- //@ts-ignore
21
- if (!user.domains?.find(d => d.subdomain === subdomain) && !process.superUserGranted(domain, user)) {
22
- throw new Error(`domain(${subdomain}) is not working for user(${user.email}).`)
23
- }
24
-
25
- return pipe(
26
- pubsub.subscribe('data'),
27
- filter((payload: { data: Data }) => {
28
- const { domain: pdomain, tag: ptag, data } = payload.data
29
- return tag === ptag && subdomain === pdomain?.subdomain
30
- })
31
- )
32
- }
33
- })
34
- data(@Root() payload: { data: Data }, @Arg('tag') tag: string): Data {
35
- return payload.data
36
- }
37
- }
@@ -1,16 +0,0 @@
1
- import { Field, ObjectType } from 'type-graphql'
2
-
3
- import { ScalarObject } from '../common-types/scalar-object'
4
- import { Domain } from '../domain/domain'
5
-
6
- @ObjectType()
7
- export class Data {
8
- @Field(type => Domain, { nullable: true, description: 'The domain where the data originated' })
9
- domain?: Domain
10
-
11
- @Field({ description: 'Tag name attached to data' })
12
- tag: string
13
-
14
- @Field(type => ScalarObject, { nullable: true, description: 'Data delivered by subscription' })
15
- data?: Object
16
- }
@@ -1,4 +0,0 @@
1
- import { DataResolver } from './data-resolver'
2
-
3
- export const entities = []
4
- export const resolvers = [DataResolver]
@@ -1,70 +0,0 @@
1
- import { ValueTransformer } from 'typeorm'
2
- import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'crypto'
3
-
4
- import { dataEncryptionKey } from './get-data-encryption-key'
5
-
6
- const ALGORITHM = 'aes-256-cbc'
7
- const KEY_LENGTH = 32
8
- const SALT_LENGTH = 16
9
- const IV_LENGTH = 16
10
-
11
- /**
12
- * ValueTransformer object for encrypting and decrypting database entity field values.
13
- * Used in TypeORM entities to encrypt field values before storing them in the database
14
- * and decrypt values when retrieving them from the database.
15
- */
16
- export const encryptTransformer: ValueTransformer = {
17
- /**
18
- * Encrypts the entity field value before storing it in the database.
19
- * @param {string} entityValue - Unencrypted entity field value
20
- * @returns {string} - Encrypted string
21
- */
22
- to: (entityValue: string) => encrypt(entityValue), // DB에 저장하기 전에 암호화
23
-
24
- /**
25
- * Decrypts the encrypted database value when retrieving it from the database.
26
- * @param {string} databaseValue - Encrypted database field value
27
- * @returns {string} - Decrypted string
28
- */
29
- from: (databaseValue: string) => decrypt(databaseValue) // DB에서 값을 가져올 때 복호화
30
- }
31
-
32
- /**
33
- * Encrypts the given text using the AES-256-CBC algorithm.
34
- * @param {string} text - Text to encrypt
35
- * @returns {string} - Encrypted string
36
- */
37
- function encrypt(text: string): string {
38
- if (!text) {
39
- return null
40
- }
41
-
42
- const iv = randomBytes(IV_LENGTH)
43
- const cipher = createCipheriv(ALGORITHM, dataEncryptionKey, iv)
44
- const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()])
45
-
46
- return `${iv.toString('hex')}:${encrypted.toString('hex')}`
47
- }
48
-
49
- /**
50
- * Decrypts the given encrypted text.
51
- * @param {string} text - Encrypted text to decrypt
52
- * @returns {string} - Decrypted string
53
- */
54
- function decrypt(text: string): string {
55
- if (!text) {
56
- return null
57
- }
58
-
59
- try {
60
- const parts = text.split(':')
61
- const iv = Buffer.from(parts.shift(), 'hex')
62
- const encryptedText = Buffer.from(parts.join(':'), 'hex')
63
- const decipher = createDecipheriv(ALGORITHM, dataEncryptionKey, iv)
64
-
65
- return Buffer.concat([decipher.update(encryptedText), decipher.final()]).toString('utf8')
66
- } catch (err) {
67
- console.error(`decryption for encrypted field failed in encryptTransformer`)
68
- return null
69
- }
70
- }
@@ -1,13 +0,0 @@
1
- import { config } from '@things-factory/env'
2
-
3
- var _DATA_ENCRYPTION_KEY = config.get('dataEncryptionKey')
4
-
5
- if (!_DATA_ENCRYPTION_KEY) {
6
- if (process.env.NODE_ENV == 'production') {
7
- throw new TypeError('dataEncryptionKey not configured.')
8
- } else {
9
- _DATA_ENCRYPTION_KEY = 'V6g5oHJZb7KcYzIyL6cM95XvIDouon5b'
10
- }
11
- }
12
-
13
- export const dataEncryptionKey = _DATA_ENCRYPTION_KEY