w-web-perm 1.0.3 → 1.0.5

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 (57) hide show
  1. package/README.md +9 -4
  2. package/dist/css/app.c07ac905.css +1 -0
  3. package/dist/index.tmp +1 -1
  4. package/dist/js/app-legacy.08662a52.js +2 -0
  5. package/dist/js/app-legacy.08662a52.js.map +1 -0
  6. package/dist/js/app.08662a52.js +2 -0
  7. package/dist/js/app.08662a52.js.map +1 -0
  8. package/dist/js/chunk-vendors-legacy.01754e13.js +13 -0
  9. package/dist/js/chunk-vendors-legacy.01754e13.js.map +1 -0
  10. package/dist/js/chunk-vendors.01754e13.js +13 -0
  11. package/dist/js/chunk-vendors.01754e13.js.map +1 -0
  12. package/dist/w-web-perm.umd.js +2 -2
  13. package/dist/w-web-perm.umd.js.map +1 -1
  14. package/docs/WWebPerm.html +41 -5
  15. package/docs/WWebPerm.mjs.html +346 -23
  16. package/docs/index.html +1 -1
  17. package/{g.mDb.mjs → g.backupDb.mjs} +1 -1
  18. package/g.initialData.mjs +111 -0
  19. package/{g.mInitialTestData.mjs → g.initialTestData.mjs} +1 -1
  20. package/g.provideRuleGroups.mjs +56 -0
  21. package/g.provideTargets.mjs +57 -0
  22. package/g.provideUsers.mjs +45 -0
  23. package/package.json +4 -9
  24. package/public/index.html +1 -1
  25. package/server/WWebPerm.mjs +345 -22
  26. package/server/provideRuleGroups.mjs +65 -0
  27. package/server/provideTargets.mjs +59 -0
  28. package/server/provideUsers.mjs +68 -0
  29. package/src/App.vue +2 -10
  30. package/src/components/Common/CheckYes.vue +2 -2
  31. package/src/components/Common/CheckYesNo.vue +3 -3
  32. package/src/components/Common/LoadingWinBar.vue +1 -1
  33. package/src/components/LayoutContent.vue +35 -62
  34. package/src/components/LayoutContentGroups.vue +64 -61
  35. package/src/components/LayoutContentTargets.vue +52 -53
  36. package/src/components/LayoutContentUsers.vue +62 -60
  37. package/src/components/VeUser.vue +18 -26
  38. package/src/components/ruleGroup.vue +11 -11
  39. package/src/main.js +0 -2
  40. package/src/schema/tables/ruleGroups.mjs +11 -11
  41. package/src/schema/tables/targets.mjs +6 -9
  42. package/src/schema/tables/users.mjs +5 -5
  43. package/src/store/mutations.mjs +324 -69
  44. package/srv.mjs +9 -10
  45. package/tableTags-web-perm.json +1 -1
  46. package/dist/css/app.79b4b59b.css +0 -1
  47. package/dist/css/chunk-vendors.1c6c57f9.css +0 -5
  48. package/dist/js/app-legacy.317c7b7b.js +0 -2
  49. package/dist/js/app-legacy.317c7b7b.js.map +0 -1
  50. package/dist/js/app.317c7b7b.js +0 -2
  51. package/dist/js/app.317c7b7b.js.map +0 -1
  52. package/dist/js/chunk-vendors-legacy.a074d0c0.js +0 -13
  53. package/dist/js/chunk-vendors-legacy.a074d0c0.js.map +0 -1
  54. package/dist/js/chunk-vendors.a074d0c0.js +0 -13
  55. package/dist/js/chunk-vendors.a074d0c0.js.map +0 -1
  56. package/g.mInitialData.mjs +0 -147
  57. package/src/plugins/mVuetify.mjs +0 -12
@@ -64,7 +64,7 @@
64
64
 
65
65
 
66
66
 
67
- <h4 class="name" id="WWebPerm"><span class="type-signature"></span>new WWebPerm<span class="signature">(WOrm, url, db, getUserByToken, opt<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {Object}</span></h4>
67
+ <h4 class="name" id="WWebPerm"><span class="type-signature"></span>new WWebPerm<span class="signature">(WOrm, url, db, getUserByToken, verifyUser, opt<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {Object}</span></h4>
68
68
 
69
69
 
70
70
 
@@ -74,13 +74,13 @@
74
74
  <dl class="details">
75
75
 
76
76
  <dt class="tag-description">Description:</dt>
77
- <dd class="tag-description"><ul class="dummy"><li><p>基於hapi之API伺服器</p></li></ul></dd>
77
+ <dd class="tag-description"><ul class="dummy"><li><p>權限伺服器</p></li></ul></dd>
78
78
 
79
79
 
80
80
 
81
81
  <dt class="tag-source">Source:</dt>
82
82
  <dd class="tag-source"><ul class="dummy"><li>
83
- <a href="WWebPerm.mjs.html">WWebPerm.mjs</a>, <a href="WWebPerm.mjs.html#line45">line 45</a>
83
+ <a href="WWebPerm.mjs.html">WWebPerm.mjs</a>, <a href="WWebPerm.mjs.html#line113">line 113</a>
84
84
  </li></ul></dd>
85
85
 
86
86
 
@@ -127,7 +127,7 @@
127
127
 
128
128
  <h5 class="h5-examples">Example</h5>
129
129
 
130
- <pre class="prettyprint"><code></code></pre>
130
+ <pre class="prettyprint"><code>import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
131
131
  bCheckUser: false,
132
132
  getUserById: null,
133
133
  bExcludeWhenNotAdmin: false,
134
134
  serverPort: 11006,
135
135
  subfolder: '', //mperm
136
136
  webName: {
137
137
  'eng': 'Permission Service',
138
138
  'cht': '權限管理系統',
139
139
  },
140
140
  webDescription: {
141
141
  'eng': 'A web service package for user permissions and management targets.',
142
142
  'cht': 'A web service package for user permissions and management targets.',
143
143
  },
144
144
  webLogo: 'data:image/svg+xml;base64,...',
145
145
  // return {} //測試無法登入
146
146
  if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
147
147
  return {
148
148
  id: 'id-for-application',
149
149
  name: 'application',
150
150
  email: 'admin@example.com',
151
151
  isAdmin: 'y',
152
152
  }
153
153
  }
154
154
  if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
155
155
  return {
156
156
  id: 'id-for-admin',
157
157
  name: 'tester',
158
158
  email: 'admin@example.com',
159
159
  isAdmin: 'y',
160
160
  }
161
161
  }
162
162
  console.log('invalid token', token)
163
163
  console.log('於生產環境時得加入SSO等驗證token機制')
164
164
  return {}
165
165
  console.log('於生產環境時得加入驗證user機制')
166
166
  return user.isAdmin === 'y' //測試僅系統管理者使用
167
167
  console.log(err)
168
168
 
169
169
 
170
170
 
@@ -303,6 +303,42 @@
303
303
 
304
304
 
305
305
 
306
+ <tr>
307
+
308
+ <td class="name"><code>verifyUser</code></td>
309
+
310
+
311
+ <td class="type">
312
+
313
+
314
+ <span class="param-type">function</span>
315
+
316
+
317
+
318
+
319
+ </td>
320
+
321
+
322
+ <td class="attributes">
323
+
324
+
325
+
326
+
327
+
328
+ </td>
329
+
330
+
331
+
332
+ <td class="default">
333
+
334
+ </td>
335
+
336
+
337
+ <td class="description last"><p>輸入處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false</p></td>
338
+ </tr>
339
+
340
+
341
+
306
342
  <tr>
307
343
 
308
344
  <td class="name"><code>opt</code></td>
@@ -813,7 +849,7 @@
813
849
  <br class="clear">
814
850
 
815
851
  <footer>
816
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Jul 31 2023 10:16:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
852
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 10:30:51 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
817
853
  </footer>
818
854
 
819
855
  <script>prettyPrint();</script>
@@ -48,13 +48,16 @@
48
48
  <pre class="prettyprint source linenums"><code>import path from 'path'
49
49
  import fs from 'fs'
50
50
  import get from 'lodash/get'
51
+ import each from 'lodash/each'
51
52
  import keys from 'lodash/keys'
52
53
  import iseobj from 'wsemi/src/iseobj.mjs'
53
54
  import isestr from 'wsemi/src/isestr.mjs'
54
55
  import ispint from 'wsemi/src/ispint.mjs'
56
+ import isearr from 'wsemi/src/isearr.mjs'
55
57
  import isfun from 'wsemi/src/isfun.mjs'
56
58
  import ispm from 'wsemi/src/ispm.mjs'
57
59
  import cint from 'wsemi/src/cint.mjs'
60
+ import j2o from 'wsemi/src/j2o.mjs'
58
61
  import strleft from 'wsemi/src/strleft.mjs'
59
62
  import strright from 'wsemi/src/strright.mjs'
60
63
  import strdelright from 'wsemi/src/strdelright.mjs'
@@ -68,13 +71,14 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
68
71
 
69
72
 
70
73
  /**
71
- * 基於hapi之API伺服器
74
+ * 權限伺服器
72
75
  *
73
76
  * @class
74
77
  * @param {Function} WOrm 輸入資料庫ORM函數
75
78
  * @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
76
79
  * @param {String} db 輸入資料庫名稱字串
77
80
  * @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
81
+ * @param {Function} verifyUser 輸入處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
78
82
  * @param {Object} [opt={}] 輸入設定物件,預設{}
79
83
  * @param {Integer} [opt.serverPort=11006] 輸入伺服器通訊port,預設11006
80
84
  * @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
@@ -87,9 +91,73 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
87
91
  * @param {String} [opt.mappingBy='email'] 輸入外部系統識別使用者token後所提供之資料物件,與權限系統之使用者資料物件,兩者間查找之對應欄位,可選'id'、'email'、'name',預設'email'
88
92
  * @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
89
93
  * @example
90
-
94
+ * import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
95
+ * import WWebPerm from './server/WWebPerm.mjs'
96
+ * import getSettings from './g.getSettings.mjs'
97
+ *
98
+ * //st
99
+ * let st = getSettings()
100
+ *
101
+ * let url = `mongodb://${st.dbUsername}:${st.dbPassword}@${st.dbIP}:${st.dbPort}` //使用Mongodb測試
102
+ * let db = st.dbName
103
+ * let opt = {
104
+ *
105
+ * bCheckUser: false,
106
+ * getUserById: null,
107
+ * bExcludeWhenNotAdmin: false,
108
+ *
109
+ * serverPort: 11006,
110
+ * subfolder: '', //mperm
111
+ *
112
+ * webName: {
113
+ * 'eng': 'Permission Service',
114
+ * 'cht': '權限管理系統',
115
+ * },
116
+ * webDescription: {
117
+ * 'eng': 'A web service package for user permissions and management targets.',
118
+ * 'cht': 'A web service package for user permissions and management targets.',
119
+ * },
120
+ * webLogo: 'data:image/svg+xml;base64,...',
121
+ *
122
+ * }
123
+ *
124
+ * let getUserByToken = async (token) => {
125
+ * // return {} //測試無法登入
126
+ * if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
127
+ * return {
128
+ * id: 'id-for-application',
129
+ * name: 'application',
130
+ * email: 'admin@example.com',
131
+ * isAdmin: 'y',
132
+ * }
133
+ * }
134
+ * if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
135
+ * return {
136
+ * id: 'id-for-admin',
137
+ * name: 'tester',
138
+ * email: 'admin@example.com',
139
+ * isAdmin: 'y',
140
+ * }
141
+ * }
142
+ * console.log('invalid token', token)
143
+ * console.log('於生產環境時得加入SSO等驗證token機制')
144
+ * return {}
145
+ * }
146
+ *
147
+ * let verifyUser = (user) => {
148
+ * console.log('於生產環境時得加入驗證user機制')
149
+ * return user.isAdmin === 'y' //測試僅系統管理者使用
150
+ * }
151
+ *
152
+ * //WWebPerm
153
+ * let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt)
154
+ *
155
+ * instWWebPerm.on('error', (err) => {
156
+ * console.log(err)
157
+ * })
158
+ *
91
159
  */
92
- function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
160
+ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
93
161
  let instWServHapiServer = null
94
162
 
95
163
 
@@ -121,6 +189,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
121
189
  }
122
190
 
123
191
 
192
+ //check verifyUser
193
+ if (!isfun(verifyUser)) {
194
+ console.log('invalid verifyUser', verifyUser)
195
+ throw new Error('invalid verifyUser')
196
+ }
197
+
198
+
124
199
  //serverPort
125
200
  let serverPort = get(opt, 'serverPort')
126
201
  if (!ispint(serverPort)) {
@@ -170,6 +245,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
170
245
  if (mappingBy !== 'id' &amp;&amp; mappingBy !== 'email' &amp;&amp; mappingBy !== 'name') {
171
246
  mappingBy = 'email'
172
247
  }
248
+ // console.log('mappingBy', mappingBy)
173
249
 
174
250
 
175
251
  //WServOrm
@@ -245,31 +321,32 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
245
321
 
246
322
  //check
247
323
  if (!iseobj(userSelf)) {
248
- console.log('invalid userSelf')
249
- return null
324
+ console.log(`can not find the user from token`, token)
325
+ return Promise.reject(`can not find the user from token`)
250
326
  }
251
327
 
252
328
  //check userSelf
253
329
  if (true) {
254
330
  let id = get(userSelf, 'id', '')
255
331
  if (!isestr(id)) {
256
- console.log('invalid userSelf.id')
257
- return null
332
+ console.log('userSelf', userSelf)
333
+ return Promise.reject(`can not get the userId`)
258
334
  }
259
335
  let email = get(userSelf, 'email', '')
260
336
  if (!isestr(email)) {
261
- console.log('invalid userSelf.email')
262
- return null
337
+ console.log('userSelf', userSelf)
338
+ return Promise.reject(`can not get the email of user`)
263
339
  }
264
340
  let name = get(userSelf, 'name', '')
265
341
  if (!isestr(name)) {
266
- console.log('invalid userSelf.name')
267
- return null
342
+ console.log('userSelf', userSelf)
343
+ return Promise.reject(`can not get userName`)
268
344
  }
269
345
  let isAdmin = get(userSelf, 'isAdmin', '')
270
346
  if (isAdmin !== 'y' &amp;&amp; isAdmin !== 'n') {
271
- console.log('userSelf.isAdmin is not y or n')
272
- return null
347
+ console.log('userSelf', userSelf)
348
+ console.log('userSelf.isAdmin is not y or n', userSelf.isAdmin)
349
+ return Promise.reject(`can not get the role of user`)
273
350
  }
274
351
  }
275
352
 
@@ -279,8 +356,9 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
279
356
 
280
357
  //check
281
358
  if (!isestr(vSelf)) {
282
- console.log('invalid vSelf')
283
- return null
359
+ console.log('userSelf', userSelf)
360
+ console.log('mappingBy', mappingBy)
361
+ return Promise.reject(`can not get the prop of user by mappingBy`)
284
362
  }
285
363
 
286
364
  //userFind
@@ -288,6 +366,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
288
366
  userFind = get(userFind, 0, null)
289
367
  // console.log('userFind', userFind)
290
368
 
369
+ //check
370
+ if (!iseobj(userFind)) {
371
+ console.log('userSelf', userSelf)
372
+ console.log('mappingBy', mappingBy)
373
+ return Promise.reject(`can not get the user from perm`)
374
+ }
375
+
291
376
  //複寫isAdmin
292
377
  let isAdminSrc = get(userSelf, 'isAdmin', '')
293
378
  let isAdminSelf = get(userFind, 'isAdmin', '')
@@ -296,10 +381,112 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
296
381
  }
297
382
  // console.log('userFind(isAdmin)', userFind)
298
383
 
384
+ //verifyUser
385
+ let b = verifyUser(userFind)
386
+ if (ispm(b)) {
387
+ b = await b
388
+ }
389
+
390
+ //check
391
+ if (!b) {
392
+ console.log('userSelf', userSelf)
393
+ console.log('verifyUser/userFind', userFind)
394
+ return Promise.reject(`user does not have permission`)
395
+ }
396
+
299
397
  return userFind
300
398
  }
301
399
 
302
400
 
401
+ //parsePayload
402
+ let parsePayload = async (req, key) => {
403
+ let inp = get(req, 'payload')
404
+
405
+ //to obj
406
+ if (isestr(inp)) {
407
+ inp = j2o(inp)
408
+ }
409
+
410
+ //check
411
+ if (!iseobj(inp)) {
412
+ console.log('inp', inp)
413
+ return Promise.reject(`invalid inp from req`)
414
+ }
415
+
416
+ //from
417
+ let from = get(inp, 'from', '')
418
+
419
+ //check
420
+ if (!isestr(from)) {
421
+ console.log('inp', inp)
422
+ console.log('from', from)
423
+ return Promise.reject(`invalid from from inp`)
424
+ }
425
+
426
+
427
+ //vs
428
+ let vs = get(inp, key, [])
429
+ //users
430
+ //targets
431
+ //ruleGroups
432
+
433
+ //check
434
+ if (!isearr(vs)) {
435
+ console.log('inp', inp)
436
+ console.log(key, vs)
437
+ return Promise.reject(`invalid ${key} from inp`)
438
+ }
439
+
440
+ //resave
441
+ inp = {
442
+ from,
443
+ [key]: vs,
444
+ }
445
+
446
+ return inp
447
+ }
448
+
449
+
450
+ //syncAndReplaceRows
451
+ let syncAndReplaceRows = async (params, key) => {
452
+
453
+ //from
454
+ let from = get(params, 'from', '')
455
+ // console.log('from', from)
456
+
457
+ //check
458
+ if (!isestr(from)) {
459
+ console.log('params', params)
460
+ console.log('from', from)
461
+ return Promise.reject(`invalid from`)
462
+ }
463
+
464
+ //vs
465
+ let vs = get(params, key, [])
466
+ // console.log(key, vs)
467
+
468
+ //check
469
+ if (!isearr(vs)) {
470
+ console.log('params', params)
471
+ console.log(key, vs)
472
+ return Promise.reject(`invalid ${key}`)
473
+ }
474
+
475
+ //save from
476
+ each(vs, (v, k) => {
477
+ vs[k].from = from
478
+ })
479
+
480
+ //delAll from
481
+ await woItems[key].delAll({ from })
482
+
483
+ //insert
484
+ let r = await woItems[key].insert(vs)
485
+
486
+ return r
487
+ }
488
+
489
+
303
490
  //getGenUserByKV
304
491
  let getGenUserByKV = async(keyUser, valueUser) => {
305
492
 
@@ -429,10 +616,17 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
429
616
  // console.log('userSelf', userSelf)
430
617
 
431
618
  //check
432
- if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
433
- return Promise.reject(`user does not have permission`)
619
+ if (!iseobj(userSelf)) {
620
+ console.log('token', token)
621
+ console.log('[API]getUserByToken/check userSelf: invalid userSelf')
622
+ return Promise.reject(`token does not have permission`)
434
623
  }
435
624
 
625
+ // //check
626
+ // if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
627
+ // return Promise.reject(`user does not have permission`)
628
+ // }
629
+
436
630
  return userSelf
437
631
  }
438
632
 
@@ -462,7 +656,9 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
462
656
 
463
657
  //check
464
658
  if (!iseobj(userLogin)) {
465
- return Promise.reject(`user does not have permission`)
659
+ console.log('token', token)
660
+ console.log('[API]getPerm/check userLogin: invalid userLogin')
661
+ return Promise.reject(`token does not have permission`)
466
662
  }
467
663
 
468
664
  //parseUserId
@@ -471,7 +667,9 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
471
667
 
472
668
  //check
473
669
  if (!isestr(userId)) {
474
- return Promise.reject(`invalid user`)
670
+ console.log('userLogin', userLogin)
671
+ console.log('[API]getPerm/check userId: invalid userId')
672
+ return Promise.reject(`token does not have permission`)
475
673
  }
476
674
 
477
675
  //getGenUserAndRulesByUserId
@@ -480,7 +678,9 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
480
678
 
481
679
  //check
482
680
  if (!iseobj(r)) {
483
- return Promise.reject(`user does not have permrules`)
681
+ console.log('userLogin', userLogin)
682
+ console.log('[API]getPerm/getGenUserAndRulesByUserId: user does not have permrules')
683
+ return Promise.reject(`token does not have permission`)
484
684
  }
485
685
 
486
686
  return r
@@ -511,10 +711,17 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
511
711
  // console.log('userSelf', userSelf)
512
712
 
513
713
  //check
514
- if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
515
- return Promise.reject(`user does not have permission`)
714
+ if (!iseobj(userSelf)) {
715
+ console.log('token', token)
716
+ console.log('[API]getPermById/check userSelf: invalid userSelf')
717
+ return Promise.reject(`token does not have permission`)
516
718
  }
517
719
 
720
+ // //check
721
+ // if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
722
+ // return Promise.reject(`user does not have permission`)
723
+ // }
724
+
518
725
  //userId
519
726
  let userId = get(req, 'query.userId', '')
520
727
  // console.log('userId', userId)
@@ -525,6 +732,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
525
732
 
526
733
  //check
527
734
  if (!iseobj(r)) {
735
+ console.log('userSelf', userSelf)
736
+ console.log('[API]getPermById/getGenUserAndRulesByUserId: user does not have permrules')
528
737
  return Promise.reject(`user does not have permrules`)
529
738
  }
530
739
 
@@ -535,6 +744,120 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
535
744
  let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 須另提取state進行判斷
536
745
  // console.log('getUserByToken', r)
537
746
 
747
+ return r
748
+ },
749
+ },
750
+ {
751
+ method: 'POST',
752
+ path: '/syncAndReplaceUsers',
753
+ handler: async function (req, res) {
754
+ // console.log('syncAndReplaceUsers', req)
755
+ // console.log('payload', req.payload)
756
+
757
+ async function core() {
758
+
759
+ //token
760
+ let token = get(req, 'query.token', '')
761
+
762
+ //getTokenUserForSelf
763
+ let user = await getTokenUserForSelf(token)
764
+
765
+ //check
766
+ if (!iseobj(user)) {
767
+ console.log('token', token)
768
+ console.log('[API]syncAndReplaceUsers/check user: invalid user')
769
+ return Promise.reject(`token does not have permission`)
770
+ }
771
+
772
+ //parsePayload
773
+ let inp = await parsePayload(req, 'users')
774
+
775
+ //syncAndReplaceRows
776
+ let r = await syncAndReplaceRows(inp, 'users')
777
+
778
+ return r
779
+ }
780
+
781
+ //pm2resolve core
782
+ let r = await pm2resolve(core)()
783
+ // console.log('verifyIdentity', r)
784
+
785
+ return r
786
+ },
787
+ },
788
+ {
789
+ method: 'POST',
790
+ path: '/syncAndReplaceTargets',
791
+ handler: async function (req, res) {
792
+ // console.log('syncAndReplaceTargets', req)
793
+ // console.log('payload', req.payload)
794
+
795
+ async function core() {
796
+
797
+ //token
798
+ let token = get(req, 'query.token', '')
799
+
800
+ //getTokenUserForSelf
801
+ let user = await getTokenUserForSelf(token)
802
+
803
+ //check
804
+ if (!iseobj(user)) {
805
+ console.log('token', token)
806
+ console.log('[API]syncAndReplaceTargets/check user: invalid user')
807
+ return Promise.reject(`token does not have permission`)
808
+ }
809
+
810
+ //parsePayload
811
+ let inp = await parsePayload(req, 'targets')
812
+
813
+ //syncAndReplaceRows
814
+ let r = await syncAndReplaceRows(inp, 'targets')
815
+
816
+ return r
817
+ }
818
+
819
+ //pm2resolve core
820
+ let r = await pm2resolve(core)()
821
+ // console.log('verifyIdentity', r)
822
+
823
+ return r
824
+ },
825
+ },
826
+ {
827
+ method: 'POST',
828
+ path: '/syncAndReplaceRuleGroups',
829
+ handler: async function (req, res) {
830
+ // console.log('syncAndReplaceRuleGroups', req)
831
+ // console.log('payload', req.payload)
832
+
833
+ async function core() {
834
+
835
+ //token
836
+ let token = get(req, 'query.token', '')
837
+
838
+ //getTokenUserForSelf
839
+ let user = await getTokenUserForSelf(token)
840
+
841
+ //check
842
+ if (!iseobj(user)) {
843
+ console.log('token', token)
844
+ console.log('[API]syncAndReplaceRuleGroups/check user: invalid user')
845
+ return Promise.reject(`token does not have permission`)
846
+ }
847
+
848
+ //parsePayload
849
+ let inp = await parsePayload(req, 'ruleGroups')
850
+
851
+ //syncAndReplaceRows
852
+ let r = await syncAndReplaceRows(inp, 'ruleGroups')
853
+
854
+ return r
855
+ }
856
+
857
+ //pm2resolve core
858
+ let r = await pm2resolve(core)()
859
+ // console.log('verifyIdentity', r)
860
+
538
861
  return r
539
862
  },
540
863
  },
@@ -595,7 +918,7 @@ export default WWebPerm
595
918
  <br class="clear">
596
919
 
597
920
  <footer>
598
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Jul 31 2023 10:16:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
921
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 10:30:51 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
599
922
  </footer>
600
923
 
601
924
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -71,7 +71,7 @@
71
71
  <br class="clear">
72
72
 
73
73
  <footer>
74
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Jul 31 2023 10:16:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 10:30:51 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
@@ -7,4 +7,4 @@ getDb.backup(woItems)
7
7
 
8
8
 
9
9
  //備份資料重與由備份資料重建資料庫
10
- //node --experimental-modules --es-module-specifier-resolution=node g.mDb.mjs
10
+ //node --experimental-modules --es-module-specifier-resolution=node g.backupDb.mjs