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