@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.
- package/client/themes/tooltip-theme.css +4 -3
- package/config/config.production.js +13 -0
- package/dist-server/middlewares/index.js +2 -2
- package/dist-server/middlewares/index.js.map +1 -1
- package/dist-server/pubsub.js +2 -2
- package/dist-server/pubsub.js.map +1 -1
- package/dist-server/server-dev.js +18 -16
- package/dist-server/server-dev.js.map +1 -1
- package/dist-server/server.js +15 -14
- package/dist-server/server.js.map +1 -1
- package/dist-server/service/domain/domain-resolver.js +4 -1
- package/dist-server/service/domain/domain-resolver.js.map +1 -1
- package/dist-server/service/domain/domain.js +34 -1
- package/dist-server/service/domain/domain.js.map +1 -1
- package/dist-server/utils/condition-builder.js +10 -11
- package/dist-server/utils/condition-builder.js.map +1 -1
- package/dist-server/utils/get-query-builder-from-list-params.js +240 -0
- package/dist-server/utils/get-query-builder-from-list-params.js.map +1 -0
- package/dist-server/utils/index.js +2 -0
- package/dist-server/utils/index.js.map +1 -1
- package/dist-server/utils/list-param-adjuster.js +13 -0
- package/dist-server/utils/list-param-adjuster.js.map +1 -0
- package/dist-server/utils/list-params-converter.js +55 -22
- package/dist-server/utils/list-params-converter.js.map +1 -1
- package/dist-server/utils/list-query-builder.js +33 -3
- package/dist-server/utils/list-query-builder.js.map +1 -1
- package/package.json +19 -18
- package/server/middlewares/index.ts +3 -2
- package/server/pubsub.ts +3 -3
- package/server/server-dev.ts +20 -17
- package/server/server.ts +17 -15
- package/server/service/domain/domain-resolver.ts +5 -1
- package/server/service/domain/domain.ts +37 -2
- package/server/utils/condition-builder.ts +12 -12
- package/server/utils/get-query-builder-from-list-params.ts +291 -0
- package/server/utils/index.ts +2 -0
- package/server/utils/list-param-adjuster.ts +12 -0
- package/server/utils/list-params-converter.ts +90 -30
- 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
|
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,
|
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
|
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(
|
48
|
+
Object.assign(result, {
|
45
49
|
skip,
|
46
50
|
take
|
47
51
|
})
|
48
52
|
}
|
49
53
|
}
|
50
54
|
|
51
|
-
return
|
55
|
+
return result
|
52
56
|
}
|
53
57
|
|
54
|
-
function makeSortingParams(sortings) {
|
55
|
-
var
|
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(
|
66
|
+
Object.assign(result, {
|
63
67
|
order
|
64
68
|
})
|
65
69
|
}
|
66
70
|
|
67
|
-
return
|
71
|
+
return result
|
68
72
|
}
|
69
73
|
|
70
|
-
function makeFilterParams(
|
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 =
|
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(
|
99
|
-
|
100
|
-
|
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
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
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(
|
111
|
-
if (sortings) Object.assign(
|
112
|
-
if (filters) Object.assign(
|
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
|
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
|
-
|
6
|
-
|
7
|
-
|
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
|