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.
Files changed (38) hide show
  1. package/extend/bajo/hook.js +48 -51
  2. package/extend/bajo/intl/en-US.json +5 -5
  3. package/extend/bajo/intl/id.json +5 -5
  4. package/extend/dobo/feature/lat-lng.js +6 -1
  5. package/extend/dobo/feature/lat.js +1 -1
  6. package/extend/dobo/feature/lng.js +1 -1
  7. package/extend/dobo/feature/status.js +3 -1
  8. package/extend/dobo/fixture/site.json +1 -1
  9. package/extend/dobo/fixture/team-user.json +1 -1
  10. package/extend/dobo/fixture/team.json +2 -2
  11. package/extend/dobo/fixture/user.json +1 -1
  12. package/extend/dobo/model.js +82 -122
  13. package/extend/dobo/model.json +3 -9
  14. package/extend/sumba/route/anonymous.json +5 -0
  15. package/extend/sumba/route/secure.json +8 -0
  16. package/extend/waibuDb/schema/anonymous-guard.js +15 -0
  17. package/extend/waibuDb/schema/{route-guard.js → secure-guard.js} +2 -2
  18. package/extend/waibuDb/schema/team-user.js +2 -2
  19. package/extend/waibuDb/schema/team.json +1 -1
  20. package/extend/waibuMpa/extend/waibuAdmin/route/{x/model-guard → anonymous-guard}/@action.js +2 -3
  21. package/extend/waibuMpa/extend/waibuAdmin/route/{route-guard → secure-guard}/@action.js +2 -2
  22. package/extend/waibuMpa/route/access-token.js +3 -1
  23. package/extend/waibuRestApi/route/manage/anonymous-guard/model-builder.json +4 -0
  24. package/extend/waibuRestApi/route/manage/{route-guard → secure-guard}/model-builder.json +1 -1
  25. package/index.js +302 -98
  26. package/lib/get-site.js +1 -3
  27. package/lib/get-user.js +2 -6
  28. package/package.json +1 -1
  29. package/wiki/CHANGES.md +13 -0
  30. package/extend/dobo/fixture/x-route-guard.js +0 -24
  31. package/extend/waibuDb/schema/x-attrib-guard.js +0 -15
  32. package/extend/waibuDb/schema/x-model-guard.js +0 -15
  33. package/extend/waibuDb/schema/x-route-guard.js +0 -15
  34. package/extend/waibuMpa/extend/waibuAdmin/route/index.json +0 -3
  35. package/extend/waibuMpa/extend/waibuAdmin/route/x/attrib-guard/@action.js +0 -12
  36. package/extend/waibuMpa/extend/waibuAdmin/route/x/index.json +0 -3
  37. package/extend/waibuMpa/extend/waibuAdmin/route/x/route-guard/@action.js +0 -12
  38. package/lib/util.js +0 -201
@@ -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, intersection, without } = this.app.lib._
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 columns = model.getNonVirtualProperties().map(prop => prop.name)
30
+ const fields = model.getNonVirtualProperties().map(prop => prop.name)
32
31
  const filterFn = item => {
33
- const bySiteId = item.siteIds ? item.siteIds.includes(req.site.id + '') : true
32
+ const bySiteId = item.siteId === req.site.id + ''
34
33
  const byModel = item.models.includes(model.name)
35
- const byTeamId = item.teamIds ? includes(item.teamIds, teamIds) : true
36
- const byColumn = columns.includes(item.column)
37
- return bySiteId && byModel && byTeamId && byColumn
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
- guards.global = orderBy(guards.global.filter(filterFn), ['column'])
41
- guards.local = orderBy(guards.local.filter(filterFn), ['column'])
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
- let items = guards.global.filter(item => item.column === col && !item.negation)
42
+ const items = rules.filter(item => item.field === field)
45
43
  for (const item of items) {
46
- values.push(...item.value)
44
+ if (item.behavior === 'NIN') values = without(values, ...item.value)
45
+ else if (item.behavior === 'IN') values.push(...item.value)
47
46
  }
48
- items = guards.global.filter(item => item.column === col && item.negation)
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.siteIds ? item.siteIds.includes(req.site.id + '') : true
63
+ const bySiteId = item.siteId === req.site.id + ''
80
64
  const byModel = item.models.includes(model.name)
81
- const byTeamId = item.teamIds ? includes(item.teamIds, teamIds) : true
65
+ const byTeamId = includes(item.teamIds, teamIds)
82
66
  return bySiteId && byModel && byTeamId
83
67
  }
84
68
 
85
- let item = guards.global.filter(filterFn)[0]
86
- if (item) results.push(...item.hiddenCols)
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', 'dobo.sumbaXAttribGuard: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', 'dobo.sumbaXModelGuard: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.sumbaRouteGuard:afterTransaction', 'dobo.sumbaXRouteGuard:afterTransaction'],
196
+ name: ['dobo.sumbaSecureGuard:afterTransaction'],
215
197
  handler: async function (action, ...args) {
216
198
  if (!['createRecord', 'updateRecord', 'removeRecord'].includes(action)) return
217
- await this.getRouteGuards(true)
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.getRouteGuards(true)
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.call(this, req, reply)
353
- await checkIconset.call(this, req, reply)
354
- const secure = await checkUserId.call(this, req, reply, 'waibuMpa')
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.call(this, req, reply, secure)
357
- await checkXSite.call(this, req, reply)
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 checkUserId.call(this, req, reply, 'waibuRestApi')
351
+ const secure = await this.checkUser(req, reply, 'waibuRestApi')
364
352
  if (!secure) return
365
- await checkTeam.call(this, req, reply, secure)
366
- await checkXSite.call(this, req, reply)
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 checkUserId.call(this, req, reply, 'waibuStatic')
360
+ const secure = await this.checkUser(req, reply, 'waibuStatic')
373
361
  if (!secure) return
374
- await checkTeam.call(this, req, reply, secure)
375
- await checkXSite.call(this, req, reply)
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.getRouteGuards(true)
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
- "routeGuard": "Route Guard",
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": {
@@ -138,15 +138,14 @@
138
138
  "statusClosed": "Tertutup",
139
139
  "allSites": "Semua Situs",
140
140
  "permission": "Permisi",
141
- "routeGuard": "Pelindung Rute",
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
- import { latLngHook } from '../../../lib/util.js'
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,4 +1,4 @@
1
- import { latLngHook } from '../../../lib/util.js'
1
+ import { latLngHook } from './lat-lng.js'
2
2
 
3
3
  async function lat (opts = {}) {
4
4
  opts.field = opts.field ?? 'lat'
@@ -1,4 +1,4 @@
1
- import { latLngHook } from '../../../lib/util.js'
1
+ import { latLngHook } from './lat-lng.js'
2
2
 
3
3
  async function lng (opts = {}) {
4
4
  opts.field = opts.field ?? 'lng'
@@ -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.values = opts.values ?? ['UNVERIFIED', 'ACTIVE', 'INACTIVE']
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
  }],
@@ -14,5 +14,5 @@
14
14
  "phone": "+001-000000001",
15
15
  "waPhone": "+001-111111111",
16
16
  "status": "ACTIVE",
17
- "_immutable": true
17
+ "_immutable": ["*"]
18
18
  }]
@@ -2,5 +2,5 @@
2
2
  "siteId": "?:SumbaSite::alias:default",
3
3
  "userId": "?:SumbaUser::username:'admin'+siteId:'{siteId}'",
4
4
  "teamId": "?:SumbaTeam::alias:'administrator'+siteId:'{siteId}'",
5
- "_immutable": true
5
+ "_immutable": ["*"]
6
6
  }]
@@ -2,6 +2,6 @@
2
2
  "alias": "administrator",
3
3
  "name": "Administrator",
4
4
  "siteId": "?:SumbaSite::alias:default",
5
- "status": "ENABLED",
6
- "_immutable": true
5
+ "status": "ACTIVE",
6
+ "_immutable": ["*"]
7
7
  }]
@@ -13,5 +13,5 @@
13
13
  "provider": "local",
14
14
  "siteId": "?:SumbaSite::alias:default",
15
15
  "status": "ACTIVE",
16
- "_immutable": true
16
+ "_immutable": ["*"]
17
17
  }]
@@ -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 mgFeatures = [
36
- 'dobo:updatedAt'
37
- ]
38
-
39
- const agProperties = [
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
- export const rgFeatures = [
88
- {
89
- name: 'sumba:status',
90
- values: ['ACTIVE', 'INACTIVE'],
91
- default: 'ACTIVE'
92
- },
93
- 'dobo:updatedAt'
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 { isString } = this.app.lib._
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: agProperties,
114
- features: agFeatures,
115
- options,
116
- buildEnd
117
- }, {
118
- baseName: 'x-attrib-guard',
119
- properties: agProperties.filter(prop => {
120
- if (!isString(prop)) return true
121
- return !(prop.startsWith('teamIds') || prop.startsWith('siteId'))
122
- }).concat('siteIds,sumba:siteIds'),
123
- features: agFeatures,
124
- options,
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: mgProperties,
129
- features: mgFeatures,
130
- options,
131
- buildEnd
132
- }, {
133
- baseName: 'x-model-guard',
134
- properties: mgProperties.filter(prop => {
135
- if (!isString(prop)) return true
136
- return !(prop.startsWith('teamIds') || prop.startsWith('siteId'))
137
- }).concat('siteIds,sumba:siteIds'),
138
- features: mgFeatures,
139
- options,
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: [{
@@ -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
  }, {
@@ -0,0 +1,5 @@
1
+ [
2
+ "/user/**/*",
3
+ "/signin",
4
+ "restapi:/user/access-token/**/*"
5
+ ]
@@ -0,0 +1,8 @@
1
+ [
2
+ "/your-stuff/**/*",
3
+ "/signout",
4
+ "/help/trouble-tickets/**/*",
5
+ "restapi:/user/api-key",
6
+ "restapi:/your-stuff/**/*",
7
+ "restapi:/manage/**/*"
8
+ ]
@@ -0,0 +1,15 @@
1
+ async function anonymousGuard () {
2
+ return {
3
+ common: {
4
+ widget: {
5
+ teamIds: {
6
+ attr: {
7
+ refUrl: 'waibuAdmin:/{prefix}/team/details?id={id}'
8
+ }
9
+ }
10
+ }
11
+ }
12
+ }
13
+ }
14
+
15
+ export default anonymousGuard
@@ -1,4 +1,4 @@
1
- async function routeGuard () {
1
+ async function secureGuard () {
2
2
  return {
3
3
  common: {
4
4
  widget: {
@@ -12,4 +12,4 @@ async function routeGuard () {
12
12
  }
13
13
  }
14
14
 
15
- export default routeGuard
15
+ export default secureGuard
@@ -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'] },
@@ -21,7 +21,7 @@
21
21
  "details": {
22
22
  },
23
23
  "add": {
24
- "hidden": ["id", "createdAt", "updatedAt", "status"]
24
+ "hidden": ["id", "createdAt", "updatedAt"]
25
25
  },
26
26
  "edit": {
27
27
  "readonly": ["id", "createdAt", "updatedAt"]