sumba 2.29.0 → 2.31.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/extend/bajo/hook.js +48 -51
- package/extend/bajo/intl/en-US.json +5 -5
- package/extend/bajo/intl/id.json +5 -5
- package/extend/dobo/feature/lat-lng.js +6 -1
- package/extend/dobo/feature/lat.js +1 -1
- package/extend/dobo/feature/lng.js +1 -1
- package/extend/dobo/feature/status.js +3 -1
- package/extend/dobo/fixture/site.json +1 -1
- package/extend/dobo/fixture/team-user.json +1 -1
- package/extend/dobo/fixture/team.json +2 -2
- package/extend/dobo/fixture/user.json +1 -1
- package/extend/dobo/model.js +82 -122
- package/extend/dobo/model.json +3 -9
- package/extend/sumba/route/anonymous.json +5 -0
- package/extend/sumba/route/secure.json +8 -0
- package/extend/waibuDb/schema/anonymous-guard.js +15 -0
- package/extend/waibuDb/schema/{route-guard.js → secure-guard.js} +2 -2
- package/extend/waibuDb/schema/team-user.js +2 -2
- package/extend/waibuDb/schema/team.json +1 -1
- package/extend/waibuMpa/extend/waibuAdmin/route/{x/model-guard → anonymous-guard}/@action.js +2 -3
- package/extend/waibuMpa/extend/waibuAdmin/route/{route-guard → secure-guard}/@action.js +2 -2
- package/extend/waibuMpa/route/access-token.js +3 -1
- package/extend/waibuRestApi/route/manage/anonymous-guard/model-builder.json +4 -0
- package/extend/waibuRestApi/route/manage/{route-guard → secure-guard}/model-builder.json +1 -1
- package/index.js +302 -98
- package/lib/get-site.js +1 -3
- package/lib/get-user.js +2 -6
- package/package.json +1 -1
- package/wiki/CHANGES.md +13 -0
- package/extend/dobo/fixture/x-route-guard.js +0 -24
- package/extend/waibuDb/schema/x-attrib-guard.js +0 -15
- package/extend/waibuDb/schema/x-model-guard.js +0 -15
- package/extend/waibuDb/schema/x-route-guard.js +0 -15
- package/extend/waibuMpa/extend/waibuAdmin/route/index.json +0 -3
- package/extend/waibuMpa/extend/waibuAdmin/route/x/attrib-guard/@action.js +0 -12
- package/extend/waibuMpa/extend/waibuAdmin/route/x/index.json +0 -3
- package/extend/waibuMpa/extend/waibuAdmin/route/x/route-guard/@action.js +0 -12
- package/lib/util.js +0 -201
package/extend/bajo/hook.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { checkUserId, checkTeam, checkXSite, checkTheme, checkIconset } from '../../lib/util.js'
|
|
2
1
|
import { removeRefs } from '../../lib/remove-site.js'
|
|
3
2
|
import { getAllFixtures, createRefs } from '../../lib/create-new-site.js'
|
|
4
3
|
import path from 'path'
|
|
@@ -22,45 +21,30 @@ async function clearCacheUser (id, result) {
|
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
async function applyModelGuard ({ model, q, teamIds, options }) {
|
|
25
|
-
const { get, set, orderBy,
|
|
24
|
+
const { get, set, orderBy, without } = this.app.lib._
|
|
26
25
|
const { includes } = this.app.lib.aneka
|
|
27
26
|
const { req } = options
|
|
28
27
|
const results = []
|
|
29
28
|
|
|
30
29
|
const guards = await this.getModelGuards()
|
|
31
|
-
const
|
|
30
|
+
const fields = model.getNonVirtualProperties().map(prop => prop.name)
|
|
32
31
|
const filterFn = item => {
|
|
33
|
-
const bySiteId = item.
|
|
32
|
+
const bySiteId = item.siteId === req.site.id + ''
|
|
34
33
|
const byModel = item.models.includes(model.name)
|
|
35
|
-
const byTeamId =
|
|
36
|
-
const
|
|
37
|
-
return bySiteId && byModel && byTeamId &&
|
|
34
|
+
const byTeamId = includes(item.teamIds, teamIds)
|
|
35
|
+
const byFields = fields.includes(item.field)
|
|
36
|
+
return bySiteId && byModel && byTeamId && byFields
|
|
38
37
|
}
|
|
39
38
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
for (const col of columns) {
|
|
39
|
+
const rules = orderBy(guards.filter(filterFn), ['field'])
|
|
40
|
+
for (const field of fields) {
|
|
43
41
|
let values = []
|
|
44
|
-
|
|
42
|
+
const items = rules.filter(item => item.field === field)
|
|
45
43
|
for (const item of items) {
|
|
46
|
-
values
|
|
44
|
+
if (item.behavior === 'NIN') values = without(values, ...item.value)
|
|
45
|
+
else if (item.behavior === 'IN') values.push(...item.value)
|
|
47
46
|
}
|
|
48
|
-
|
|
49
|
-
for (const item of items) {
|
|
50
|
-
values = without(values, ...item.value)
|
|
51
|
-
}
|
|
52
|
-
items = guards.local.filter(item => item.column === col && !item.negation)
|
|
53
|
-
const newValues = []
|
|
54
|
-
for (const item of items) {
|
|
55
|
-
newValues.push(...item.value)
|
|
56
|
-
}
|
|
57
|
-
if (values.length === 0) values = newValues
|
|
58
|
-
else if (newValues.length > 0) values = intersection(values, newValues)
|
|
59
|
-
items = guards.local.filter(item => item.column === col && item.negation)
|
|
60
|
-
for (const item of items) {
|
|
61
|
-
values = without(values, ...item.value)
|
|
62
|
-
}
|
|
63
|
-
if (values.length) results.push(set({}, col, { $in: values }))
|
|
47
|
+
if (values.length) results.push(set({}, field, { $in: values }))
|
|
64
48
|
}
|
|
65
49
|
|
|
66
50
|
const allowEmpty = get(this, `config.dobo.model.${model.name}.allowEmptyQuery`, true)
|
|
@@ -76,16 +60,14 @@ export async function applyAttribGuard ({ model, teamIds, options }) {
|
|
|
76
60
|
|
|
77
61
|
const guards = await this.getAttribGuards()
|
|
78
62
|
const filterFn = item => {
|
|
79
|
-
const bySiteId = item.
|
|
63
|
+
const bySiteId = item.siteId === req.site.id + ''
|
|
80
64
|
const byModel = item.models.includes(model.name)
|
|
81
|
-
const byTeamId =
|
|
65
|
+
const byTeamId = includes(item.teamIds, teamIds)
|
|
82
66
|
return bySiteId && byModel && byTeamId
|
|
83
67
|
}
|
|
84
68
|
|
|
85
|
-
|
|
86
|
-
if (item) results.push(...item.
|
|
87
|
-
item = guards.local.filter(filterFn)[0]
|
|
88
|
-
if (item) results.push(...item.hiddenCols)
|
|
69
|
+
const item = guards.filter(filterFn)[0]
|
|
70
|
+
if (item) results.push(...item.hiddenFields)
|
|
89
71
|
options.hidden = options.hidden ?? []
|
|
90
72
|
if (results.length > 0) options.hidden.push(...results)
|
|
91
73
|
options.hidden = uniq(options.hidden)
|
|
@@ -168,7 +150,7 @@ async function hook () {
|
|
|
168
150
|
}
|
|
169
151
|
}
|
|
170
152
|
}, {
|
|
171
|
-
name: ['dobo.sumbaAttribGuard:afterTransaction'
|
|
153
|
+
name: ['dobo.sumbaAttribGuard:afterTransaction'],
|
|
172
154
|
handler: async function (action, ...args) {
|
|
173
155
|
if (!['createRecord', 'updateRecord', 'removeRecord'].includes(action)) return
|
|
174
156
|
await this.getAttribGuards(true)
|
|
@@ -205,16 +187,22 @@ async function hook () {
|
|
|
205
187
|
options.checksumId = true
|
|
206
188
|
}
|
|
207
189
|
}, {
|
|
208
|
-
name: ['dobo.sumbaModelGuard:afterTransaction'
|
|
190
|
+
name: ['dobo.sumbaModelGuard:afterTransaction'],
|
|
209
191
|
handler: async function (action, ...args) {
|
|
210
192
|
if (!['createRecord', 'updateRecord', 'removeRecord'].includes(action)) return
|
|
211
193
|
await this.getModelGuards(true)
|
|
212
194
|
}
|
|
213
195
|
}, {
|
|
214
|
-
name: ['dobo.
|
|
196
|
+
name: ['dobo.sumbaSecureGuard:afterTransaction'],
|
|
215
197
|
handler: async function (action, ...args) {
|
|
216
198
|
if (!['createRecord', 'updateRecord', 'removeRecord'].includes(action)) return
|
|
217
|
-
await this.
|
|
199
|
+
await this.getSecureGuards(true)
|
|
200
|
+
}
|
|
201
|
+
}, {
|
|
202
|
+
name: ['dobo.sumbaAnonymousGuard:afterTransaction'],
|
|
203
|
+
handler: async function (action, ...args) {
|
|
204
|
+
if (!['createRecord', 'updateRecord', 'removeRecord'].includes(action)) return
|
|
205
|
+
await this.getAnonymousGuards(true)
|
|
218
206
|
}
|
|
219
207
|
}, {
|
|
220
208
|
name: 'dobo.sumbaSite:afterCreateRecord',
|
|
@@ -237,7 +225,7 @@ async function hook () {
|
|
|
237
225
|
name: ['dobo.sumbaTeam:afterTransaction', 'dobo.sumbaSite:afterTransaction'],
|
|
238
226
|
handler: async function (action, ...args) {
|
|
239
227
|
if (!['createRecord', 'updateRecord', 'removeRecord'].includes(action)) return
|
|
240
|
-
await this.
|
|
228
|
+
await this.getSecureGuards(true)
|
|
241
229
|
await this.getModelGuards(true)
|
|
242
230
|
await this.getAttribGuards(true)
|
|
243
231
|
}
|
|
@@ -349,35 +337,36 @@ async function hook () {
|
|
|
349
337
|
level: 10,
|
|
350
338
|
name: 'waibuMpa:preParsing',
|
|
351
339
|
handler: async function (req, reply) {
|
|
352
|
-
await checkTheme
|
|
353
|
-
await checkIconset
|
|
354
|
-
const secure = await
|
|
340
|
+
await this.checkTheme(req, reply)
|
|
341
|
+
await this.checkIconset(req, reply)
|
|
342
|
+
const secure = await this.checkUser(req, reply, 'waibuMpa')
|
|
355
343
|
if (!secure) return
|
|
356
|
-
await checkTeam
|
|
357
|
-
await checkXSite
|
|
344
|
+
await this.checkTeam(req, reply)
|
|
345
|
+
await this.checkXSite(req, reply)
|
|
358
346
|
}
|
|
359
347
|
}, {
|
|
360
348
|
level: 10,
|
|
361
349
|
name: 'waibuRestApi:preParsing',
|
|
362
350
|
handler: async function (req, reply) {
|
|
363
|
-
const secure = await
|
|
351
|
+
const secure = await this.checkUser(req, reply, 'waibuRestApi')
|
|
364
352
|
if (!secure) return
|
|
365
|
-
await checkTeam
|
|
366
|
-
await checkXSite
|
|
353
|
+
await this.checkTeam(req, reply)
|
|
354
|
+
await this.checkXSite(req, reply)
|
|
367
355
|
}
|
|
368
356
|
}, {
|
|
369
357
|
level: 10,
|
|
370
358
|
name: 'waibuStatic:preParsing',
|
|
371
359
|
handler: async function (req, reply) {
|
|
372
|
-
const secure = await
|
|
360
|
+
const secure = await this.checkUser(req, reply, 'waibuStatic')
|
|
373
361
|
if (!secure) return
|
|
374
|
-
await checkTeam
|
|
375
|
-
await checkXSite
|
|
362
|
+
await this.checkTeam(req, reply)
|
|
363
|
+
await this.checkXSite(req, reply)
|
|
376
364
|
}
|
|
377
365
|
}, {
|
|
378
366
|
name: 'waibu:afterAppBoot',
|
|
379
367
|
handler: async function () {
|
|
380
|
-
await this.
|
|
368
|
+
await this.getAnonymousGuards(true)
|
|
369
|
+
await this.getSecureGuards(true)
|
|
381
370
|
await this.getModelGuards(true)
|
|
382
371
|
await this.getAttribGuards(true)
|
|
383
372
|
}
|
|
@@ -392,6 +381,14 @@ async function hook () {
|
|
|
392
381
|
handler: async function (req, reply) {
|
|
393
382
|
const { getHostname } = this.app.waibu
|
|
394
383
|
req.site = await this.getSite(getHostname(req))
|
|
384
|
+
req.user = {}
|
|
385
|
+
}
|
|
386
|
+
}, {
|
|
387
|
+
name: 'waibu:beforeStart',
|
|
388
|
+
handler: async function () {
|
|
389
|
+
if (this.app.sumba.config.multiSite.enabled) return
|
|
390
|
+
const routes = ['waibuAdmin:/site/x/site/*']
|
|
391
|
+
this.app.waibu.config.route.disabled.push(...routes)
|
|
395
392
|
}
|
|
396
393
|
}]
|
|
397
394
|
}
|
|
@@ -132,15 +132,14 @@
|
|
|
132
132
|
"statusClosed": "Closed",
|
|
133
133
|
"allSites": "All Sites",
|
|
134
134
|
"permission": "Permission",
|
|
135
|
-
"
|
|
135
|
+
"anonymousGuard": "Anonymous Guard",
|
|
136
|
+
"secureGuard": "Secure Guard",
|
|
136
137
|
"modelGuard": "Model Guard",
|
|
137
138
|
"attribGuard": "Attribute Guard",
|
|
138
|
-
"xRouteGuard": "Route Guard",
|
|
139
|
-
"xModelGuard": "Model Guard",
|
|
140
|
-
"xAttribGuard": "Attribute Guard",
|
|
141
139
|
"xSite": "Cross-Site",
|
|
142
140
|
"xSiteAdminArea": "Cross-Site Admin Area",
|
|
143
141
|
"x": "Cross-Site",
|
|
142
|
+
"misc": "Miscellaneous",
|
|
144
143
|
"field": {
|
|
145
144
|
"currentPassword": "Current Password",
|
|
146
145
|
"newPassword": "New Password",
|
|
@@ -173,7 +172,8 @@
|
|
|
173
172
|
"column": "Column",
|
|
174
173
|
"hiddenCols": "Hidden Columns",
|
|
175
174
|
"models": "Models",
|
|
176
|
-
"siteIds": "Sites"
|
|
175
|
+
"siteIds": "Sites",
|
|
176
|
+
"allTeams": "All Teams?"
|
|
177
177
|
},
|
|
178
178
|
"validation": {
|
|
179
179
|
"password": {
|
package/extend/bajo/intl/id.json
CHANGED
|
@@ -138,15 +138,14 @@
|
|
|
138
138
|
"statusClosed": "Tertutup",
|
|
139
139
|
"allSites": "Semua Situs",
|
|
140
140
|
"permission": "Permisi",
|
|
141
|
-
"
|
|
141
|
+
"anonymousGuard": "Pelindung Rute Anonim",
|
|
142
|
+
"secureGuard": "Pelindung Rute Aman",
|
|
142
143
|
"modelGuard": "Pelindung Model",
|
|
143
144
|
"attribGuard": "Pelindung Atribut",
|
|
144
|
-
"xRouteGuard": "Pelindung Rute",
|
|
145
|
-
"xModelGuard": "Pelindung Model",
|
|
146
|
-
"xAttribGuard": "Pelindung Atribut",
|
|
147
145
|
"xSite": "Antar Situs",
|
|
148
146
|
"xSiteAdminArea": "Area Admin Antar Situs",
|
|
149
147
|
"x": "Antar Situs",
|
|
148
|
+
"misc": "Lain-lain",
|
|
150
149
|
"field": {
|
|
151
150
|
"currentPassword": "Kata Sandi Saat Ini",
|
|
152
151
|
"newPassword": "Kata Sandi Baru",
|
|
@@ -179,7 +178,8 @@
|
|
|
179
178
|
"column": "Kolom",
|
|
180
179
|
"hiddenCols": "Kolom Tersembunyi",
|
|
181
180
|
"models": "Model",
|
|
182
|
-
"siteIds": "Situs"
|
|
181
|
+
"siteIds": "Situs",
|
|
182
|
+
"allTeams": "Semua Tim?"
|
|
183
183
|
},
|
|
184
184
|
"validation": {
|
|
185
185
|
"password": {
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
export async function latLngHook (body, options) {
|
|
2
|
+
const { isSet } = this.app.lib.aneka
|
|
3
|
+
const { round } = this.app.lib.aneka
|
|
4
|
+
if (!isSet(body[options.field])) return
|
|
5
|
+
body[options.field] = round(body[options.field], options.scale)
|
|
6
|
+
}
|
|
2
7
|
|
|
3
8
|
async function latLng (opts = {}) {
|
|
4
9
|
const { merge } = this.app.lib._
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
async function status (opts = {}) {
|
|
2
2
|
opts.field = opts.field ?? 'status'
|
|
3
3
|
opts.required = opts.required ?? true
|
|
4
|
-
opts.
|
|
4
|
+
opts.default = opts.default ?? 'ACTIVE'
|
|
5
|
+
opts.values = opts.values ?? ['ACTIVE', 'INACTIVE']
|
|
5
6
|
return {
|
|
6
7
|
properties: [{
|
|
7
8
|
name: opts.field ?? 'status',
|
|
8
9
|
type: 'string',
|
|
9
10
|
maxLength: 50,
|
|
10
11
|
index: true,
|
|
12
|
+
default: opts.default,
|
|
11
13
|
required: opts.required,
|
|
12
14
|
values: opts.values
|
|
13
15
|
}],
|
package/extend/dobo/model.js
CHANGED
|
@@ -3,142 +3,102 @@ const buildEnd = async function (model) {
|
|
|
3
3
|
if (prop) prop.values = this.getModelNames(true)
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
-
const mgProperties = [
|
|
7
|
-
{
|
|
8
|
-
name: 'models',
|
|
9
|
-
type: 'array',
|
|
10
|
-
required: true
|
|
11
|
-
},
|
|
12
|
-
'column,,50,true,true',
|
|
13
|
-
{
|
|
14
|
-
name: 'negation',
|
|
15
|
-
type: 'boolean',
|
|
16
|
-
required: true,
|
|
17
|
-
default: false
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
name: 'status',
|
|
21
|
-
type: 'sumba:status',
|
|
22
|
-
values: ['ACTIVE', 'INACTIVE'],
|
|
23
|
-
default: 'ACTIVE'
|
|
24
|
-
},
|
|
25
|
-
'value,array,,,true',
|
|
26
|
-
'siteId,sumba:siteId',
|
|
27
|
-
'teamIds,sumba:teamIds'
|
|
28
|
-
]
|
|
29
|
-
|
|
30
6
|
const options = {
|
|
31
7
|
attachment: false,
|
|
32
8
|
cache: { ttlDur: 0 }
|
|
33
9
|
}
|
|
34
10
|
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
name: 'models',
|
|
42
|
-
type: 'array',
|
|
43
|
-
required: true
|
|
44
|
-
},
|
|
45
|
-
'hiddenCols,array',
|
|
46
|
-
'siteId,sumba:siteId',
|
|
47
|
-
'teamIds,sumba:teamIds'
|
|
48
|
-
]
|
|
49
|
-
|
|
50
|
-
const agFeatures = [
|
|
51
|
-
{
|
|
52
|
-
name: 'sumba:status',
|
|
53
|
-
values: ['ACTIVE', 'INACTIVE'],
|
|
54
|
-
default: 'ACTIVE'
|
|
55
|
-
},
|
|
56
|
-
'dobo:updatedAt'
|
|
57
|
-
]
|
|
58
|
-
|
|
59
|
-
export const rgProperties = [
|
|
60
|
-
'path,,255,true,true',
|
|
61
|
-
{
|
|
62
|
-
name: 'methods',
|
|
63
|
-
type: 'array',
|
|
64
|
-
required: true,
|
|
65
|
-
default: ['GET', 'POST', 'UPDATE', 'DELETE'],
|
|
66
|
-
values: ['GET', 'POST', 'UPDATE', 'DELETE']
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
name: 'weight',
|
|
70
|
-
type: 'smallint',
|
|
71
|
-
default: 0
|
|
72
|
-
}, {
|
|
73
|
-
name: 'negation',
|
|
74
|
-
type: 'boolean',
|
|
75
|
-
required: true,
|
|
76
|
-
default: false
|
|
77
|
-
}, {
|
|
78
|
-
name: 'anonymous',
|
|
79
|
-
type: 'boolean',
|
|
80
|
-
required: true,
|
|
81
|
-
default: false
|
|
82
|
-
},
|
|
83
|
-
'siteId,sumba:siteId',
|
|
84
|
-
'teamIds,sumba:teamIds'
|
|
85
|
-
]
|
|
11
|
+
const allTeams = {
|
|
12
|
+
name: 'allTeams',
|
|
13
|
+
type: 'boolean',
|
|
14
|
+
default: true,
|
|
15
|
+
required: true
|
|
16
|
+
}
|
|
86
17
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
18
|
+
const routeGuard = {
|
|
19
|
+
properties: [
|
|
20
|
+
{
|
|
21
|
+
name: 'path',
|
|
22
|
+
maxLength: 255,
|
|
23
|
+
required: true
|
|
24
|
+
},
|
|
25
|
+
allTeams,
|
|
26
|
+
'teamIds,sumba:teamIds',
|
|
27
|
+
{
|
|
28
|
+
name: 'weight',
|
|
29
|
+
type: 'smallint',
|
|
30
|
+
index: true,
|
|
31
|
+
default: 0
|
|
32
|
+
},
|
|
33
|
+
'siteId,sumba:siteId'
|
|
34
|
+
],
|
|
35
|
+
features: [
|
|
36
|
+
'sumba:status',
|
|
37
|
+
'dobo:updatedAt',
|
|
38
|
+
'dobo:immutable'
|
|
39
|
+
],
|
|
40
|
+
indexes: [{
|
|
41
|
+
type: 'unique',
|
|
42
|
+
fields: ['siteId', 'path']
|
|
43
|
+
}],
|
|
44
|
+
options: { ...options }
|
|
45
|
+
}
|
|
95
46
|
|
|
96
47
|
async function model () {
|
|
97
|
-
const {
|
|
48
|
+
const { merge, cloneDeep } = this.app.lib._
|
|
98
49
|
return [{
|
|
99
|
-
baseName: 'route-guard',
|
|
100
|
-
properties: rgProperties,
|
|
101
|
-
features: rgFeatures,
|
|
102
|
-
options
|
|
103
|
-
}, {
|
|
104
|
-
baseName: 'x-route-guard',
|
|
105
|
-
properties: rgProperties.filter(prop => {
|
|
106
|
-
if (!isString(prop)) return true
|
|
107
|
-
return !(prop.startsWith('teamIds') || prop.startsWith('siteId'))
|
|
108
|
-
}).concat('siteIds,sumba:siteIds'),
|
|
109
|
-
features: rgFeatures,
|
|
110
|
-
options
|
|
111
|
-
}, {
|
|
112
50
|
baseName: 'attrib-guard',
|
|
113
|
-
properties:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
51
|
+
properties: [
|
|
52
|
+
{
|
|
53
|
+
name: 'models',
|
|
54
|
+
type: 'array',
|
|
55
|
+
required: true
|
|
56
|
+
},
|
|
57
|
+
'hiddenFields,array',
|
|
58
|
+
allTeams,
|
|
59
|
+
'teamIds,sumba:teamIds',
|
|
60
|
+
'siteId,sumba:siteId'
|
|
61
|
+
],
|
|
62
|
+
features: [
|
|
63
|
+
'sumba:status',
|
|
64
|
+
'dobo:updatedAt',
|
|
65
|
+
'dobo:immutable'
|
|
66
|
+
],
|
|
67
|
+
options: { ...options },
|
|
125
68
|
buildEnd
|
|
126
69
|
}, {
|
|
127
70
|
baseName: 'model-guard',
|
|
128
|
-
properties:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
71
|
+
properties: [
|
|
72
|
+
{
|
|
73
|
+
name: 'models',
|
|
74
|
+
type: 'array',
|
|
75
|
+
required: true
|
|
76
|
+
},
|
|
77
|
+
'field,,50,true,true',
|
|
78
|
+
{
|
|
79
|
+
name: 'behavior',
|
|
80
|
+
type: 'string',
|
|
81
|
+
maxLength: 20,
|
|
82
|
+
required: true,
|
|
83
|
+
values: ['IN', 'NIN'],
|
|
84
|
+
default: 'IN'
|
|
85
|
+
},
|
|
86
|
+
'value,array,,,true',
|
|
87
|
+
allTeams,
|
|
88
|
+
'teamIds,sumba:teamIds',
|
|
89
|
+
'siteId,sumba:siteId'
|
|
90
|
+
],
|
|
91
|
+
features: [
|
|
92
|
+
'sumba:status',
|
|
93
|
+
'dobo:updatedAt',
|
|
94
|
+
'dobo:immutable'
|
|
95
|
+
],
|
|
96
|
+
options: { ...options },
|
|
140
97
|
buildEnd
|
|
141
|
-
},
|
|
98
|
+
},
|
|
99
|
+
merge(cloneDeep(routeGuard), { baseName: 'anonymous-guard' }),
|
|
100
|
+
merge(cloneDeep(routeGuard), { baseName: 'secure-guard' }),
|
|
101
|
+
{
|
|
142
102
|
buildLevel: 2,
|
|
143
103
|
baseName: 'user',
|
|
144
104
|
properties: [{
|
package/extend/dobo/model.json
CHANGED
|
@@ -88,10 +88,7 @@
|
|
|
88
88
|
"sumba:personInCharge",
|
|
89
89
|
"sumba:address",
|
|
90
90
|
"sumba:social",
|
|
91
|
-
|
|
92
|
-
"name": "sumba:status",
|
|
93
|
-
"default": "ACTIVE"
|
|
94
|
-
},
|
|
91
|
+
"sumba:status",
|
|
95
92
|
"dobo:createdAt",
|
|
96
93
|
"dobo:updatedAt",
|
|
97
94
|
"dobo:immutable"
|
|
@@ -128,6 +125,7 @@
|
|
|
128
125
|
"sumba:siteId",
|
|
129
126
|
"sumba:userId",
|
|
130
127
|
"sumba:teamId",
|
|
128
|
+
"sumba:status",
|
|
131
129
|
"dobo:immutable"
|
|
132
130
|
]
|
|
133
131
|
}, {
|
|
@@ -146,11 +144,7 @@
|
|
|
146
144
|
"dobo:updatedAt",
|
|
147
145
|
"dobo:immutable",
|
|
148
146
|
"sumba:siteId",
|
|
149
|
-
|
|
150
|
-
"name": "sumba:status",
|
|
151
|
-
"default": "ENABLED",
|
|
152
|
-
"values": ["ENABLED", "DISABLED"]
|
|
153
|
-
},
|
|
147
|
+
"sumba:status",
|
|
154
148
|
"dobo:immutable"
|
|
155
149
|
]
|
|
156
150
|
}, {
|
|
@@ -2,7 +2,7 @@ async function teamUser () {
|
|
|
2
2
|
return {
|
|
3
3
|
common: {
|
|
4
4
|
layout: [
|
|
5
|
-
{ name: 'meta', fields: ['id', 'createdAt', 'updatedAt'] },
|
|
5
|
+
{ name: 'meta', fields: ['id:3-md', 'createdAt:3-md', 'updatedAt:3-md', 'status:3-md'] },
|
|
6
6
|
{ name: 'general', fields: ['userId:6-md', 'teamId:6-md'] }
|
|
7
7
|
],
|
|
8
8
|
widget: {
|
|
@@ -20,7 +20,7 @@ async function teamUser () {
|
|
|
20
20
|
},
|
|
21
21
|
view: {
|
|
22
22
|
list: {
|
|
23
|
-
fields: ['userId', 'teamId', 'createdAt', 'updatedAt'],
|
|
23
|
+
fields: ['userId', 'teamId', 'status', 'createdAt', 'updatedAt'],
|
|
24
24
|
stat: {
|
|
25
25
|
aggregate: [
|
|
26
26
|
{ fields: ['userId'], group: 'userId', aggregate: ['count'] },
|