w-web-perm 1.0.48 → 1.0.49

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 (95) hide show
  1. package/.github/workflows/ci-test.yml +2 -2
  2. package/_gh-pages-deploy/.nojekyll +0 -0
  3. package/_gh-pages-deploy/WWebPerm.html +938 -0
  4. package/_gh-pages-deploy/WWebPerm.mjs.html +1228 -0
  5. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  6. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  7. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  8. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  9. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  10. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  11. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  12. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  13. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  14. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  15. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  16. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  17. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  18. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  19. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  20. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  21. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  22. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  23. package/_gh-pages-deploy/index.html +84 -0
  24. package/_gh-pages-deploy/scripts/collapse.js +39 -0
  25. package/_gh-pages-deploy/scripts/commonNav.js +28 -0
  26. package/_gh-pages-deploy/scripts/linenumber.js +25 -0
  27. package/_gh-pages-deploy/scripts/nav.js +12 -0
  28. package/_gh-pages-deploy/scripts/polyfill.js +4 -0
  29. package/_gh-pages-deploy/scripts/prettify/Apache-License-2.0.txt +202 -0
  30. package/_gh-pages-deploy/scripts/prettify/lang-css.js +2 -0
  31. package/_gh-pages-deploy/scripts/prettify/prettify.js +28 -0
  32. package/_gh-pages-deploy/scripts/search.js +99 -0
  33. package/_gh-pages-deploy/styles/jsdoc.css +776 -0
  34. package/_gh-pages-deploy/styles/prettify.css +80 -0
  35. package/dist/css/app.d8b16216.css +1 -0
  36. package/dist/css/{chunk-vendors.f149e124.css → chunk-vendors.2d3ef2ba.css} +1 -1
  37. package/dist/index.tmp +2 -2
  38. package/dist/js/app-legacy.fb48310a.js +1 -0
  39. package/dist/js/app.fb48310a.js +1 -0
  40. package/dist/js/chunk-vendors-legacy.8fdd4435.js +21 -0
  41. package/dist/js/chunk-vendors.8fdd4435.js +21 -0
  42. package/dist/w-web-perm.umd.js +2 -2
  43. package/dist/w-web-perm.umd.js.map +1 -1
  44. package/docs/WWebPerm.html +2 -2
  45. package/docs/WWebPerm.mjs.html +138 -199
  46. package/docs/index.html +1 -1
  47. package/package.json +15 -11
  48. package/public/index.html +2 -2
  49. package/server/WWebPerm.mjs +137 -198
  50. package/server/procCore.mjs +169 -0
  51. package/server/procLang.mjs +197 -0
  52. package/server/procStaInfor.mjs +118 -0
  53. package/server/provideTabs.mjs +1 -1
  54. package/server/srLog.mjs +30 -0
  55. package/server/staLogs/staEvent.callWorker.mjs +46 -0
  56. package/server/staLogs/staEvent.mjs +116 -0
  57. package/server/staLogs/staEvent.shellWorker.mjs +19 -0
  58. package/server/staLogs/staEventTable.mjs +100 -0
  59. package/server/staLogs/test_staEvent.mjs +22 -0
  60. package/settings.json +40 -0
  61. package/src/components/Common/CheckYes.vue +18 -1
  62. package/src/components/Layout.vue +1 -1
  63. package/src/components/LayoutContent.vue +13 -1
  64. package/src/components/LayoutContentGrups.vue +32 -23
  65. package/src/components/LayoutContentPemis.vue +32 -23
  66. package/src/components/LayoutContentStaInfor.vue +536 -0
  67. package/src/components/LayoutContentTargets.vue +32 -23
  68. package/src/components/LayoutContentUsers.vue +32 -23
  69. package/src/components/LayoutState.vue +5 -0
  70. package/src/components/VeCgrups.vue +12 -3
  71. package/src/components/VeCpemis.vue +12 -3
  72. package/src/components/VeCrules.vue +12 -3
  73. package/src/components/VeGrupBlngUsers.vue +18 -6
  74. package/src/components/VePemiBlngGrups.vue +18 -6
  75. package/src/getPerm.mjs +7 -17
  76. package/src/getPermUserInfor.mjs +8 -18
  77. package/src/main.js +1 -0
  78. package/src/plugins/mShare.mjs +8 -13
  79. package/src/plugins/mUI.mjs +11 -0
  80. package/srv.mjs +76 -101
  81. package/tableTags.json +1 -1
  82. package/db/wperm/grups/data.mdb +0 -0
  83. package/db/wperm/grups/lock.mdb +0 -0
  84. package/db/wperm/pemis/data.mdb +0 -0
  85. package/db/wperm/pemis/lock.mdb +0 -0
  86. package/db/wperm/targets/data.mdb +0 -0
  87. package/db/wperm/targets/lock.mdb +0 -0
  88. package/db/wperm/users/data.mdb +0 -0
  89. package/db/wperm/users/lock.mdb +0 -0
  90. package/dist/css/app.30e81bfe.css +0 -1
  91. package/dist/js/app-legacy.3324392e.js +0 -1
  92. package/dist/js/app.3324392e.js +0 -1
  93. package/dist/js/chunk-vendors-legacy.e8703728.js +0 -21
  94. package/dist/js/chunk-vendors.e8703728.js +0 -21
  95. package/test/getUserRules.test.mjs +0 -899
@@ -23,15 +23,16 @@ import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
23
23
  import fsIsFile from 'wsemi/src/fsIsFile.mjs'
24
24
  import replace from 'wsemi/src/replace.mjs'
25
25
  import strdelleft from 'wsemi/src/strdelleft.mjs'
26
- import haskey from 'wsemi/src/haskey.mjs'
27
- import arrHas from 'wsemi/src/arrHas.mjs'
28
- import ltdtDiffByKey from 'wsemi/src/ltdtDiffByKey.mjs'
29
26
  import ltdtmapping from 'wsemi/src/ltdtmapping.mjs'
27
+ import pmKeyMutex from 'wsemi/src/pmKeyMutex.mjs'
30
28
  import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
31
29
  import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
32
30
  import ds from '../src/schema/index.mjs'
33
31
  import { getUserRules } from '../src/plugins/mShare.mjs'
32
+ import procCore from './procCore.mjs'
34
33
  import procLang from './procLang.mjs'
34
+ import srLogInit from './srLog.mjs'
35
+ import procStaInfor from './procStaInfor.mjs'
35
36
 
36
37
 
37
38
  /**
@@ -268,6 +269,10 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
268
269
  let kpLang = procLang({ kpLangExt, webName, webDescription })
269
270
 
270
271
 
272
+ //srLog
273
+ let srLog = srLogInit(opt)
274
+
275
+
271
276
  //WServOrm
272
277
  let optWServOrm = {
273
278
  useCheckUser,
@@ -284,8 +289,25 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
284
289
  let { woItems, procOrm } = wp
285
290
 
286
291
 
292
+ //pmKeyMutex: per-key in-memory mutex, 同 key 序列化、不同 key 並行.
293
+ //perm 為「整表批次 diff」寫入, key 粒度為 {op}:{keyTable}, 防同表並行 race (lost update).
294
+ let kmx = pmKeyMutex()
295
+
296
+
297
+ //procCore: 整表批次 diff 寫入邏輯 (updateTabItems + updateTargets/Pemis/Grups/Users)
298
+ let pc = procCore(woItems, procOrm, { srLog, kmx })
299
+
300
+
301
+ //procStaInfor: 統計資訊, fdLog 對齊 srLog 使用同一目錄; mock 由 settings.staEventMock 注入(e2e 統計圖穩定用)
302
+ let psi = procStaInfor({ fdLog: './_logs', mock: get(opt, 'staEventMock', false) })
303
+
304
+
287
305
  //getWebInfor
288
306
  let getWebInfor = (userId) => {
307
+
308
+ //info
309
+ srLog.info({ event: 'getWebInfor-success', userId })
310
+
289
311
  return {
290
312
 
291
313
  // webName, //已併入kpLang
@@ -348,162 +370,32 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
348
370
  // }
349
371
 
350
372
 
351
- //updateTabItems
352
- let updateTabItems = async (keyTable, userId, rows, keyDetect) => {
353
- // console.log('updateTabItems', keyTable, userId, rows.length, keyDetect)
354
-
355
- //ltdtmapping
356
- rows = ltdtmapping(rows, ds[keyTable].keys)
357
- // console.log('ltdtmapping rows', rows)
358
-
359
- //重給order
360
- rows = map(rows, (r, k) => {
361
- r.order = k + 1
362
- return r
363
- })
364
-
365
- //ckKey
366
- let ckKey = (rows, key) => {
367
- let err = null
368
-
369
- //check
370
- let kp = {}
371
- each(rows, (v, k) => {
372
-
373
- //value
374
- let value = get(v, key, '')
375
-
376
- //check
377
- if (!isestr(value)) {
378
- err = `rows[${k}].${key} is not an effective string`
379
- return false //跳出
380
- }
381
-
382
- //check
383
- if (haskey(kp, value)) {
384
- err = `rows[${k}].${key}[${value}] is duplicate`
385
- return false //跳出
386
- }
387
-
388
- //kp
389
- kp[value] = true
390
-
391
- })
392
-
393
- return err
394
- }
395
-
396
- //偵測未給予或重複
397
- let err = null
398
- if (true) {
399
- if (arrHas(keyTable, ['targets'])) {
400
- err = ckKey(rows, 'id')
401
- if (err !== null) {
402
- return Promise.reject(err)
403
- }
404
- }
405
- if (arrHas(keyTable, ['pemis', 'grups'])) { //users可重複name故不列入
406
- err = ckKey(rows, 'name')
407
- if (err !== null) {
408
- return Promise.reject(err)
409
- }
410
- }
411
- if (arrHas(keyTable, ['users'])) {
412
- err = ckKey(rows, 'email')
413
- if (err !== null) {
414
- return Promise.reject(err)
415
- }
416
- }
417
- }
418
-
419
- //ltdtDiffByKey
420
- let ltdtOld = await woItems[keyTable].select()
421
- let ltdtNew = rows
422
- let r = ltdtDiffByKey(ltdtOld, ltdtNew, keyDetect)
423
- // console.log('ltdtDiffByKey r', r)
424
-
425
- //del
426
- if (size(r.del) > 0) {
427
- await procOrm(userId, keyTable, 'del', r.del) //須使用procOrm才有辦法自動給予相關欄位
428
- // .catch((err) => {
429
- // console.log('woItems[keyTable].del err', err)
430
- // })
431
- }
432
-
433
- //add
434
- if (size(r.add) > 0) {
435
- await procOrm(userId, keyTable, 'insert', r.add) //須使用procOrm才有辦法自動給予相關欄位
436
- // .catch((err) => {
437
- // console.log('woItems[keyTable].insert err', err)
438
- // })
439
- }
440
-
441
- //diff
442
- if (size(r.diff) > 0) {
443
- await procOrm(userId, keyTable, 'save', r.diff) //須使用procOrm才有辦法自動給予相關欄位
444
- // .catch((err) => {
445
- // console.log('woItems[keyTable].save err', err)
446
- // })
447
- }
448
-
449
- return ltdtNew
450
- }
451
-
452
-
453
- //updateTargets
454
- let updateTargets = async (userId, rows) => {
455
- rows = await updateTabItems('targets', userId, rows, 'id')
456
- return rows
457
- }
458
-
459
-
460
- //updatePemis
461
- let updatePemis = async (userId, rows) => {
462
- rows = await updateTabItems('pemis', userId, rows, 'name')
463
- return rows
464
- }
465
-
466
-
467
- //updateGrups
468
- let updateGrups = async (userId, rows) => {
469
- rows = await updateTabItems('grups', userId, rows, 'name')
470
- return rows
471
- }
472
-
473
-
474
- //updateUsers
475
- let updateUsers = async (userId, rows) => {
476
- rows = await updateTabItems('users', userId, rows, 'id')
477
- return rows
478
- }
479
-
480
-
481
373
  //checkUser
482
374
  let checkUser = async(user) => {
483
375
  let id = get(user, 'id', '')
484
376
  if (!isestr(id)) {
485
377
  console.log('user', user)
486
- console.log('can not get the userId')
487
- return Promise.reject(`can not get the userId`)
378
+ srLog.error({ event: 'checkUser-error', msg: 'cannotGetUserId' })
379
+ return Promise.reject(`cannotGetUserId`)
488
380
  }
489
381
  let email = get(user, 'email', '')
490
382
  if (!isestr(email)) {
491
383
  console.log('user', user)
492
- console.log('can not get the email of user')
493
- return Promise.reject(`can not get the email of user`)
384
+ srLog.error({ event: 'checkUser-error', msg: 'cannotGetUserEmail' })
385
+ return Promise.reject(`cannotGetUserEmail`)
494
386
  }
495
387
  let name = get(user, 'name', '')
496
388
  if (!isestr(name)) {
497
389
  console.log('user', user)
498
- console.log('can not get userName')
499
- return Promise.reject(`can not get userName`)
390
+ srLog.error({ event: 'checkUser-error', msg: 'cannotGetUserName' })
391
+ return Promise.reject(`cannotGetUserName`)
500
392
  }
501
393
  let isAdmin = get(user, 'isAdmin', '')
502
394
  if (isAdmin !== 'y' && isAdmin !== 'n') {
503
395
  console.log('user', user)
504
396
  console.log('user.isAdmin is not y or n', user.isAdmin)
505
- console.log('can not get the role of user')
506
- return Promise.reject(`can not get the role of user`)
397
+ srLog.error({ event: 'checkUser-error', msg: 'cannotGetUserRole' })
398
+ return Promise.reject(`cannotGetUserRole`)
507
399
  }
508
400
  return true
509
401
  }
@@ -526,8 +418,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
526
418
  //check
527
419
  if (!iseobj(userSelf)) {
528
420
  console.log(`token`, token)
529
- console.log(`can not find the user from token`)
530
- return Promise.reject(`can not find the user from token`)
421
+ srLog.error({ event: 'getTokenUser-error', msg: 'cannotFindUserFromToken' })
422
+ return Promise.reject(`cannotFindUserFromToken`)
531
423
  }
532
424
 
533
425
  //check userSelf
@@ -541,8 +433,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
541
433
  if (!isestr(vSelf)) {
542
434
  console.log('userSelf', userSelf)
543
435
  console.log('mappingBy', mappingBy)
544
- console.log('can not get the prop of user by mappingBy')
545
- return Promise.reject(`can not get the prop of user by mappingBy`)
436
+ srLog.error({ event: 'getTokenUser-error', msg: 'cannotGetUserProp', mappingBy })
437
+ return Promise.reject(`cannotGetUserProp`)
546
438
  }
547
439
 
548
440
  //userFind
@@ -554,8 +446,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
554
446
  if (!iseobj(userFind)) {
555
447
  console.log('userSelf', userSelf)
556
448
  console.log('mappingBy', mappingBy)
557
- console.log('can not get the user from perm')
558
- return Promise.reject(`can not get the user from perm`)
449
+ srLog.error({ event: 'getTokenUser-error', msg: 'cannotGetUserFromPerm', mappingBy })
450
+ return Promise.reject(`cannotGetUserFromPerm`)
559
451
  }
560
452
 
561
453
  //複寫isAdmin
@@ -602,8 +494,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
602
494
  //check
603
495
  if (!b) {
604
496
  console.log('user', user)
605
- console.log(`user does not have permission`)
606
- return Promise.reject(`user does not have permission`)
497
+ srLog.error({ event: 'getAndVerifyClientUser-error', msg: 'userNoPermission', from })
498
+ return Promise.reject(`userNoPermission`)
607
499
  }
608
500
 
609
501
  return user
@@ -627,8 +519,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
627
519
  //check
628
520
  if (!iseobj(user)) {
629
521
  console.log(`token`, token)
630
- console.log(`can not find the user from token`)
631
- return Promise.reject(`can not find the user from token`)
522
+ srLog.error({ event: 'getAndVerifyAppUser-error', msg: 'cannotFindUserFromToken' })
523
+ return Promise.reject(`cannotFindUserFromToken`)
632
524
  }
633
525
 
634
526
  //verifyAppUser
@@ -640,8 +532,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
640
532
  //check
641
533
  if (!b) {
642
534
  console.log('user', user)
643
- console.log(`user does not have permission`)
644
- return Promise.reject(`user does not have permission`)
535
+ srLog.error({ event: 'getAndVerifyAppUser-error', msg: 'userNoPermission', from })
536
+ return Promise.reject(`userNoPermission`)
645
537
  }
646
538
 
647
539
  return user
@@ -662,8 +554,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
662
554
  //check
663
555
  if (!iseobj(payload)) {
664
556
  console.log('payload', payload)
665
- console.log('invalid payload in req')
666
- return Promise.reject(`invalid payload in req`)
557
+ srLog.error({ event: 'parsePayload-error', msg: 'invalidPayload' })
558
+ return Promise.reject(`invalidPayload`)
667
559
  }
668
560
 
669
561
  //from
@@ -672,8 +564,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
672
564
  //check
673
565
  if (!isestr(from)) {
674
566
  console.log('payload', payload)
675
- console.log('invalid from in payload')
676
- return Promise.reject(`invalid from in payload`)
567
+ srLog.error({ event: 'parsePayload-error', msg: 'invalidFromInPayload' })
568
+ return Promise.reject(`invalidFromInPayload`)
677
569
  }
678
570
 
679
571
  //rows
@@ -682,8 +574,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
682
574
  //check
683
575
  if (!isearr(rows)) {
684
576
  console.log('payload', payload)
685
- console.log(`invalid rows in payload`)
686
- return Promise.reject(`invalid rows in payload`)
577
+ srLog.error({ event: 'parsePayload-error', msg: 'invalidRowsInPayload' })
578
+ return Promise.reject(`invalidRowsInPayload`)
687
579
  }
688
580
 
689
581
  //inp
@@ -699,6 +591,9 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
699
591
  //syncAndReplaceTabs
700
592
  let syncAndReplaceTabs = async (userId, inp, keyTable) => {
701
593
 
594
+ //序列化同表之並行整表 delAll+insert: 防 lost update (同 keyTable 序列化, 不同表並行)
595
+ return await kmx('syncAndReplaceTabs:' + keyTable, async () => {
596
+
702
597
  //from
703
598
  let from = get(inp, 'from', '')
704
599
  // console.log('from', from)
@@ -706,8 +601,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
706
601
  //check
707
602
  if (!isestr(from)) {
708
603
  console.log('inp', inp)
709
- console.log(`invalid from`)
710
- return Promise.reject(`invalid from`)
604
+ srLog.error({ event: 'syncAndReplaceTabs-error', msg: 'invalidFrom', keyTable })
605
+ return Promise.reject(`invalidFrom`)
711
606
  }
712
607
 
713
608
  //rows
@@ -718,7 +613,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
718
613
  if (!isearr(rows)) {
719
614
  console.log('inp', inp)
720
615
  console.log('keyTable', keyTable)
721
- return Promise.reject(`invalid rows`)
616
+ srLog.error({ event: 'syncAndReplaceTabs-error', msg: 'invalidRows', keyTable })
617
+ return Promise.reject(`invalidRows`)
722
618
  }
723
619
 
724
620
  //save from
@@ -741,6 +637,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
741
637
  // console.log('r', r)
742
638
 
743
639
  return r
640
+
641
+ })
744
642
  }
745
643
 
746
644
 
@@ -801,8 +699,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
801
699
  //check
802
700
  if (!iseobj(kur)) {
803
701
  console.log('userId', userId)
804
- console.log(`can not get rules of user`)
805
- return Promise.reject(`can not get rules of user`)
702
+ srLog.error({ event: 'getGenUserAndRulesByUserId-error', msg: 'cannotGetUserRules', userId })
703
+ return Promise.reject(`cannotGetUserRules`)
806
704
  }
807
705
 
808
706
  //grupsNames
@@ -876,8 +774,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
876
774
  console.log('req.query', get(req, 'query'))
877
775
  console.log('token', token)
878
776
  console.log('[API]getUserByToken/check token: invalid token')
879
- console.log(`token does not have permission`)
880
- return Promise.reject(`token does not have permission`)
777
+ srLog.error({ event: 'api/getUserByToken-error', msg: 'tokenNoPermission' })
778
+ return Promise.reject(`tokenNoPermission`)
881
779
  }
882
780
 
883
781
  //getAndVerifyClientUser
@@ -888,10 +786,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
888
786
  if (!iseobj(user)) {
889
787
  console.log('token', token)
890
788
  console.log('[API]getUserByToken/check user: invalid user')
891
- console.log(`token does not have permission`)
892
- return Promise.reject(`token does not have permission`)
789
+ srLog.error({ event: 'api/getUserByToken-error', msg: 'tokenNoPermission' })
790
+ return Promise.reject(`tokenNoPermission`)
893
791
  }
894
792
 
793
+ //info
794
+ srLog.info({ event: 'api/getUserByToken-success', userId: get(user, 'id', '') })
795
+
895
796
  return user
896
797
  }
897
798
 
@@ -923,8 +824,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
923
824
  console.log('req.query', get(req, 'query'))
924
825
  console.log('token', token)
925
826
  console.log('[API]getPerm/check token: invalid token')
926
- console.log(`token does not have permission`)
927
- return Promise.reject(`token does not have permission`)
827
+ srLog.error({ event: 'api/getPerm-error', msg: 'tokenNoPermission' })
828
+ return Promise.reject(`tokenNoPermission`)
928
829
  }
929
830
 
930
831
  //getAndVerifyClientUser, 發起token的所屬使用者, 驗證僅對client使用者, 不得使用app使用者
@@ -935,8 +836,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
935
836
  if (!iseobj(userSelf)) {
936
837
  console.log('token', token)
937
838
  console.log('[API]getPerm/check userSelf: invalid userSelf')
938
- console.log(`token does not have permission`)
939
- return Promise.reject(`token does not have permission`)
839
+ srLog.error({ event: 'api/getPerm-error', msg: 'tokenNoPermission' })
840
+ return Promise.reject(`tokenNoPermission`)
940
841
  }
941
842
 
942
843
  //userIdSelf, client使用者的userId
@@ -948,8 +849,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
948
849
  console.log('token', token)
949
850
  console.log('userSelf', userSelf)
950
851
  console.log('[API]getPerm/check userIdSelf: invalid userIdSelf')
951
- console.log(`token does not have permission`)
952
- return Promise.reject(`token does not have permission`)
852
+ srLog.error({ event: 'api/getPerm-error', msg: 'tokenNoPermission' })
853
+ return Promise.reject(`tokenNoPermission`)
953
854
  }
954
855
 
955
856
  //getGenUserAndRulesByUserId, 查找到的client使用者與權限
@@ -962,10 +863,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
962
863
  console.log('userSelf', userSelf)
963
864
  console.log('userIdSelf', userIdSelf)
964
865
  console.log('[API]getPerm/check userWithRulesSelf: invalid userWithRulesSelf')
965
- console.log(`token does not have permission`)
966
- return Promise.reject(`token does not have permission`)
866
+ srLog.error({ event: 'api/getPerm-error', msg: 'tokenNoPermission' })
867
+ return Promise.reject(`tokenNoPermission`)
967
868
  }
968
869
 
870
+ //info
871
+ srLog.info({ event: 'api/getPerm-success', userId: userIdSelf })
872
+
969
873
  return userWithRulesSelf
970
874
  }
971
875
 
@@ -996,8 +900,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
996
900
  if (!isestr(tokenSelf)) {
997
901
  console.log('req.query', get(req, 'query'))
998
902
  console.log('[API]getPermUserInfor/check tokenSelf: invalid tokenSelf')
999
- console.log(`token does not have permission`)
1000
- return Promise.reject(`token does not have permission`)
903
+ srLog.error({ event: 'api/getPermUserInfor-error', msg: 'tokenNoPermission' })
904
+ return Promise.reject(`tokenNoPermission`)
1001
905
  }
1002
906
 
1003
907
  //getAndVerifyAppUser, 發起token的所屬使用者, 驗證須為app使用者
@@ -1009,8 +913,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1009
913
  console.log('req.query', get(req, 'query'))
1010
914
  console.log('tokenSelf', tokenSelf)
1011
915
  console.log('[API]getPermUserInfor/check userSelf: invalid userSelf')
1012
- console.log(`token does not have permission`)
1013
- return Promise.reject(`token does not have permission`)
916
+ srLog.error({ event: 'api/getPermUserInfor-error', msg: 'tokenNoPermission' })
917
+ return Promise.reject(`tokenNoPermission`)
1014
918
  }
1015
919
 
1016
920
  //userIdFind, 欲查找使用者的userId
@@ -1022,8 +926,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1022
926
  console.log('req.query', get(req, 'query'))
1023
927
  console.log('tokenSelf', tokenSelf)
1024
928
  console.log('[API]getPermUserInfor/check userIdFind: invalid userIdFind')
1025
- console.log(`token does not have permission`)
1026
- return Promise.reject(`token does not have permission`)
929
+ srLog.error({ event: 'api/getPermUserInfor-error', msg: 'tokenNoPermission' })
930
+ return Promise.reject(`tokenNoPermission`)
1027
931
  }
1028
932
 
1029
933
  //getGenUserAndRulesByUserId, 查找到的使用者與權限
@@ -1034,10 +938,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1034
938
  if (!iseobj(userWithRulesFind)) {
1035
939
  console.log('userIdFind', userIdFind)
1036
940
  console.log('[API]getPermUserInfor/check userWithRulesFind: invalid userWithRulesFind')
1037
- console.log(`userId does not have permrules`)
1038
- return Promise.reject(`userId does not have permrules`)
941
+ srLog.error({ event: 'api/getPermUserInfor-error', msg: 'userIdNoPermrules' })
942
+ return Promise.reject(`userIdNoPermrules`)
1039
943
  }
1040
944
 
945
+ //info
946
+ srLog.info({ event: 'api/getPermUserInfor-success', userId: userIdFind })
947
+
1041
948
  return userWithRulesFind
1042
949
  }
1043
950
 
@@ -1069,8 +976,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1069
976
  console.log('req.query', get(req, 'query'))
1070
977
  console.log('token', token)
1071
978
  console.log('[API]syncAndReplaceTabs/check token: invalid token')
1072
- console.log(`token does not have permission`)
1073
- return Promise.reject(`token does not have permission`)
979
+ srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'tokenNoPermission' })
980
+ return Promise.reject(`tokenNoPermission`)
1074
981
  }
1075
982
 
1076
983
  //keyTable
@@ -1081,15 +988,16 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1081
988
  console.log('req.query', get(req, 'query'))
1082
989
  console.log('keyTable', keyTable)
1083
990
  console.log('[API]syncAndReplaceTabs/check keyTable: invalid keyTable')
1084
- console.log(`token does not have permission`)
1085
- return Promise.reject(`token does not have permission`)
991
+ srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'tokenNoPermission' })
992
+ return Promise.reject(`tokenNoPermission`)
1086
993
  }
1087
994
 
1088
995
  //check keyTable
1089
996
  let allowedTables = ['targets', 'pemis', 'grups', 'users']
1090
997
  if (!allowedTables.includes(keyTable)) {
1091
998
  console.log('[API]syncAndReplaceTabs/check keyTable: unexpected keyTable', keyTable)
1092
- return Promise.reject(`invalid keyTable: ${keyTable}`)
999
+ srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'invalidKeyTable', keyTable })
1000
+ return Promise.reject(`invalidKeyTable`)
1093
1001
  }
1094
1002
 
1095
1003
  //getAndVerifyAppUser
@@ -1099,8 +1007,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1099
1007
  if (!iseobj(user)) {
1100
1008
  console.log('token', token)
1101
1009
  console.log('[API]syncAndReplaceTabs/check user: invalid user')
1102
- console.log(`token does not have permission`)
1103
- return Promise.reject(`token does not have permission`)
1010
+ srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'tokenNoPermission' })
1011
+ return Promise.reject(`tokenNoPermission`)
1104
1012
  }
1105
1013
 
1106
1014
  //userId
@@ -1111,8 +1019,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1111
1019
  console.log('token', token)
1112
1020
  console.log('user', user)
1113
1021
  console.log('[API]syncAndReplaceTabs/check userId: invalid userId')
1114
- console.log(`token does not have permission`)
1115
- return Promise.reject(`token does not have permission`)
1022
+ srLog.error({ event: 'api/syncAndReplaceTabs-error', msg: 'tokenNoPermission' })
1023
+ return Promise.reject(`tokenNoPermission`)
1116
1024
  }
1117
1025
 
1118
1026
  //parsePayload
@@ -1121,6 +1029,9 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1121
1029
  //syncAndReplaceTabs
1122
1030
  let r = await syncAndReplaceTabs(userId, inp, keyTable)
1123
1031
 
1032
+ //info
1033
+ srLog.info({ event: 'api/syncAndReplaceTabs-success', userId, keyTable })
1034
+
1124
1035
  return r
1125
1036
  }
1126
1037
 
@@ -1171,6 +1082,21 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1171
1082
  let b = await p.checkToken(token)
1172
1083
  // console.log('b', b)
1173
1084
 
1085
+ //ip, 對齊sso慣例x-forwarded-for取第1個, fallback到req remoteAddress, 取不到則略過
1086
+ let ip = get(headers, 'x-forwarded-for', '').split(',')[0].trim()
1087
+ if (!isestr(ip)) {
1088
+ ip = get(req, 'info.remoteAddress', '') || get(req, 'socket.remoteAddress', '') || get(req, 'connection.remoteAddress', '')
1089
+ }
1090
+
1091
+ //origin
1092
+ let origin = get(headers, 'origin', '')
1093
+
1094
+ //referer
1095
+ let referer = get(headers, 'referer', '')
1096
+
1097
+ //info
1098
+ srLog.info({ event: 'verifyConn', ok: b, apiType, ip, origin, referer })
1099
+
1174
1100
  return b
1175
1101
  },
1176
1102
  getUserIdByToken: async (token) => { //可使用async或sync函數
@@ -1180,7 +1106,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1180
1106
  if (!isestr(userId)) {
1181
1107
  console.log('token', token)
1182
1108
  console.log('userId', userId)
1183
- return Promise.reject(`can not find user.id`)
1109
+ srLog.error({ event: 'getUserIdByToken-error', msg: 'cannotFindUserId' })
1110
+ return Promise.reject(`cannotFindUserId`)
1184
1111
  }
1185
1112
  return userId
1186
1113
  },
@@ -1200,10 +1127,22 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser
1200
1127
  // getGrupsList,
1201
1128
  // getUsersList,
1202
1129
 
1203
- updateTargets,
1204
- updatePemis,
1205
- updateGrups,
1206
- updateUsers,
1130
+ updateTargets: pc.updateTargets,
1131
+ updatePemis: pc.updatePemis,
1132
+ updateGrups: pc.updateGrups,
1133
+ updateUsers: pc.updateUsers,
1134
+
1135
+ getStaEvent: async (userId, timeLength, timeInterval) => {
1136
+ let rs = await psi.getStaEvent(userId, timeLength, timeInterval)
1137
+ srLog.info({ event: 'getStaEvent-success', userId })
1138
+ return rs
1139
+ },
1140
+
1141
+ getStaEventTable: async (userId) => {
1142
+ let rs = await psi.getStaEventTable(userId)
1143
+ srLog.info({ event: 'getStaEventTable-success', userId })
1144
+ return rs
1145
+ },
1207
1146
 
1208
1147
  },
1209
1148
  fnTableTags: 'tableTags-web-perm.json',