@things-factory/shell 5.0.0-alpha.7 → 5.0.0-y.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 (36) hide show
  1. package/client/themes/tooltip-theme.css +4 -3
  2. package/config/config.production.js +13 -0
  3. package/dist-server/middlewares/index.js +2 -2
  4. package/dist-server/middlewares/index.js.map +1 -1
  5. package/dist-server/pubsub.js +2 -2
  6. package/dist-server/pubsub.js.map +1 -1
  7. package/dist-server/server-dev.js +18 -16
  8. package/dist-server/server-dev.js.map +1 -1
  9. package/dist-server/server.js +15 -14
  10. package/dist-server/server.js.map +1 -1
  11. package/dist-server/service/domain/domain-resolver.js +4 -1
  12. package/dist-server/service/domain/domain-resolver.js.map +1 -1
  13. package/dist-server/service/domain/domain.js +34 -1
  14. package/dist-server/service/domain/domain.js.map +1 -1
  15. package/dist-server/utils/condition-builder.js +10 -11
  16. package/dist-server/utils/condition-builder.js.map +1 -1
  17. package/dist-server/utils/get-query-builder-from-list-params.js +249 -0
  18. package/dist-server/utils/get-query-builder-from-list-params.js.map +1 -0
  19. package/dist-server/utils/index.js +1 -0
  20. package/dist-server/utils/index.js.map +1 -1
  21. package/dist-server/utils/list-params-converter.js +48 -18
  22. package/dist-server/utils/list-params-converter.js.map +1 -1
  23. package/dist-server/utils/list-query-builder.js +33 -3
  24. package/dist-server/utils/list-query-builder.js.map +1 -1
  25. package/package.json +19 -18
  26. package/server/middlewares/index.ts +3 -2
  27. package/server/pubsub.ts +3 -3
  28. package/server/server-dev.ts +20 -17
  29. package/server/server.ts +17 -15
  30. package/server/service/domain/domain-resolver.ts +5 -1
  31. package/server/service/domain/domain.ts +37 -2
  32. package/server/utils/condition-builder.ts +12 -12
  33. package/server/utils/get-query-builder-from-list-params.ts +304 -0
  34. package/server/utils/index.ts +1 -0
  35. package/server/utils/list-params-converter.ts +83 -26
  36. package/server/utils/list-query-builder.ts +50 -3
@@ -1,8 +1,11 @@
1
- import { Between, Equal, ILike, In, IsNull, Like, Not, Raw } from 'typeorm'
1
+ import { Between, Equal, FindOperator, ILike, In, IsNull, Like, Not, Raw } from 'typeorm'
2
2
 
3
- import { ListParam } from '../service/common-types'
3
+ import { Filter, ListParam, Pagination, Sorting } from '../service/common-types'
4
+ import { Domain } from '../service/domain/domain'
4
5
 
5
- const OPERATION_FUNCTION_MAP = {
6
+ const debug = require('debug')('things-factory:shell:list-params-converter')
7
+
8
+ const OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator<any> } = {
6
9
  search: value => ILike(value),
7
10
  eq: value => Equal(value),
8
11
  noteq: value => Not(Equal(value)),
@@ -27,12 +30,12 @@ const OPERATION_FUNCTION_MAP = {
27
30
  between: value => Between(value[0], value[1])
28
31
  }
29
32
 
30
- function getOperatorFunction({ operator, name, value, dataType }) {
33
+ function getOperatorFunction({ operator, value }: { operator: string; value: any }): FindOperator<any> {
31
34
  return OPERATION_FUNCTION_MAP[operator](value)
32
35
  }
33
36
 
34
- function makePaginationParams(pagination) {
35
- var jsonParams = {}
37
+ function makePaginationParams(pagination: Pagination): { skip?: number; take?: number } {
38
+ var result = {} as { skip?: number; take?: number }
36
39
  if (pagination) {
37
40
  var { page = 0, limit = 0 } = pagination
38
41
  var skip = 0
@@ -41,41 +44,69 @@ function makePaginationParams(pagination) {
41
44
  if (limit > 0) {
42
45
  skip = Math.max(page - 1, 0) * limit
43
46
  take = limit
44
- Object.assign(jsonParams, {
47
+ Object.assign(result, {
45
48
  skip,
46
49
  take
47
50
  })
48
51
  }
49
52
  }
50
53
 
51
- return jsonParams
54
+ return result
52
55
  }
53
56
 
54
- function makeSortingParams(sortings) {
55
- var jsonParams = {}
57
+ function makeSortingParams(sortings: Sorting[]): { order?: { [name: string]: 'DESC' | 'ASC' } } {
58
+ var result = {} as { order?: { [name: string]: 'DESC' | 'ASC' } }
56
59
  if (sortings) {
57
- var order = {}
60
+ var order = {} as { [name: string]: 'DESC' | 'ASC' }
58
61
  sortings.forEach(s => {
59
62
  order[s.name] = s.desc ? 'DESC' : 'ASC'
60
63
  })
61
64
 
62
- Object.assign(jsonParams, {
65
+ Object.assign(result, {
63
66
  order
64
67
  })
65
68
  }
66
69
 
67
- return jsonParams
70
+ return result
68
71
  }
69
72
 
70
- function makeFilterParams(filters) {
73
+ function makeFilterParams(
74
+ filters: Filter[],
75
+ searchables?: string[]
76
+ ): {
77
+ where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[]
78
+ } {
71
79
  /* for where AND clauses */
72
- const columnFilters = filters.filter(filter => filter.operator !== 'search')
80
+ const columnFilters =
81
+ filters?.filter(filter => {
82
+ if (filter.operator === 'search') {
83
+ return false
84
+ }
85
+ if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {
86
+ return false
87
+ }
88
+ return true
89
+ }) || []
90
+
91
+ const searchFilters =
92
+ searchables instanceof Array
93
+ ? filters?.filter(filter => {
94
+ if (filter.operator !== 'search') {
95
+ return false
96
+ }
97
+ if (!searchables.includes(filter.name)) {
98
+ debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
99
+ return false
100
+ }
101
+ return true
102
+ }) || []
103
+ : []
104
+
73
105
  const columnWhere = columnFilters.reduce((where, f) => {
74
106
  where[f.name] = getOperatorFunction(f)
75
107
  return where
76
- }, {})
108
+ }, {} as { [name: string]: FindOperator<any> })
77
109
 
78
- const searchFilters = filters.filter(filter => filter.operator === 'search')
79
110
  if (searchFilters.length === 0) {
80
111
  return {
81
112
  where: columnWhere
@@ -95,21 +126,47 @@ function makeFilterParams(filters) {
95
126
  }
96
127
  }
97
128
 
98
- export function convertListParams(params: typeof ListParam, domain?: String) {
99
- var { pagination, filters = [], sortings } = params as any
100
- var jsonParams = {}
129
+ export function convertListParams(
130
+ params: ListParam,
131
+ options?:
132
+ | string
133
+ | {
134
+ domain?: string | Domain
135
+ searchables?: string[]
136
+ }
137
+ ): {
138
+ where?: { [name: string]: FindOperator<any> }
139
+ order?: {
140
+ [name: string]: 'DESC' | 'ASC'
141
+ }
142
+ skip?: number
143
+ take?: number
144
+ } {
145
+ var domainId: string | undefined
146
+
147
+ if (options) {
148
+ if (typeof options === 'string' /* for 하위 호환성 */) {
149
+ var domainId = options
150
+ } else {
151
+ var { domain, searchables } = options
152
+ var domainId = typeof domain === 'string' ? domain : domain?.id
153
+ }
154
+ }
155
+
156
+ var { pagination, filters = [], sortings } = params
157
+ var result = {}
101
158
 
102
- if (domain) {
159
+ if (domainId) {
103
160
  filters.push({
104
161
  name: 'domain',
105
162
  operator: 'eq',
106
- value: domain
163
+ value: domainId
107
164
  })
108
165
  }
109
166
 
110
- if (pagination) Object.assign(jsonParams, makePaginationParams(pagination))
111
- if (sortings) Object.assign(jsonParams, makeSortingParams(sortings))
112
- if (filters) Object.assign(jsonParams, makeFilterParams(filters))
167
+ if (pagination) Object.assign(result, makePaginationParams(pagination))
168
+ if (sortings) Object.assign(result, makeSortingParams(sortings))
169
+ if (filters) Object.assign(result, makeFilterParams(filters, searchables))
113
170
 
114
- return jsonParams
171
+ return result
115
172
  }
@@ -2,9 +2,56 @@ import { Brackets } from 'typeorm'
2
2
 
3
3
  import { buildCondition } from './condition-builder'
4
4
 
5
- export const buildQuery = function (queryBuilder: any, params: any, context: any, domainRef: Boolean = true) {
6
- const columnFilters = params.filters?.filter(filter => filter.operator !== 'search') || []
7
- const searchFilters = params.filters?.filter(filter => filter.operator === 'search') || []
5
+ const debug = require('debug')('things-factory:shell:list-query-builder')
6
+
7
+ /**
8
+ * @deprecated The name of this function does not imply an exact purpose and it is not possible to correspond to a foreign key using the meta information of the table column, so it is recommended to replace it with the A function.
9
+ */
10
+ export const buildQuery = function (
11
+ queryBuilder: any,
12
+ params: any,
13
+ context: any,
14
+ options?:
15
+ | boolean
16
+ | {
17
+ domainRef?: boolean
18
+ searchables?: string[]
19
+ }
20
+ ) {
21
+ /* default value of domainRef is 'true' */
22
+ var domainRef = typeof options === 'boolean' ? options : true
23
+
24
+ /* for backwards compatibility of function spec */
25
+ if (typeof options === 'object') {
26
+ var { domainRef = true, searchables } = options
27
+ }
28
+
29
+ const columnFilters =
30
+ params.filters?.filter(filter => {
31
+ if (filter.operator === 'search') {
32
+ return false
33
+ }
34
+ if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {
35
+ debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
36
+ return false
37
+ }
38
+ return true
39
+ }) || []
40
+
41
+ const searchFilters =
42
+ searchables instanceof Array
43
+ ? params.filters?.filter(filter => {
44
+ if (filter.operator !== 'search') {
45
+ return false
46
+ }
47
+ if (!searchables.includes(filter.name)) {
48
+ debug('"searchables" setting is required for like searches with a heavy database query load', filter.name)
49
+ return false
50
+ }
51
+ return true
52
+ }) || []
53
+ : []
54
+
8
55
  const pagination = params.pagination
9
56
  const sortings = params.sortings
10
57
  const domainId = context && context.state.domain && context.state.domain.id