w-web-api 1.0.52 → 1.0.53
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/_gh-pages-deploy/.nojekyll +0 -0
- package/_gh-pages-deploy/WWebApi.html +898 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/_gh-pages-deploy/index.html +84 -0
- package/_gh-pages-deploy/scripts/collapse.js +39 -0
- package/_gh-pages-deploy/scripts/commonNav.js +28 -0
- package/_gh-pages-deploy/scripts/linenumber.js +25 -0
- package/_gh-pages-deploy/scripts/nav.js +12 -0
- package/_gh-pages-deploy/scripts/polyfill.js +4 -0
- package/_gh-pages-deploy/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/_gh-pages-deploy/scripts/prettify/lang-css.js +2 -0
- package/_gh-pages-deploy/scripts/prettify/prettify.js +28 -0
- package/_gh-pages-deploy/scripts/search.js +99 -0
- package/{docs/WWebApi.mjs.html → _gh-pages-deploy/server_WWebApi.mjs.html} +96 -39
- package/_gh-pages-deploy/src_components_Common_CheckYesNo.vue.html +187 -0
- package/_gh-pages-deploy/styles/jsdoc.css +776 -0
- package/_gh-pages-deploy/styles/prettify.css +80 -0
- package/dist/css/app.fe69497a.css +1 -0
- package/dist/index.tmp +4 -2
- package/dist/js/app-legacy.15819aa7.js +1 -0
- package/dist/js/app.15819aa7.js +1 -0
- package/dist/js/chunk-vendors-legacy.c1a32dd1.js +15 -0
- package/dist/js/chunk-vendors.c1a32dd1.js +15 -0
- package/dist/w-web-api.umd.js +2 -2
- package/dist/w-web-api.umd.js.map +1 -1
- package/docs/WWebApi.html +2 -2
- package/docs/index.html +1 -1
- package/docs/server_WWebApi.mjs.html +1012 -0
- package/docs/src_components_Common_CheckYesNo.vue.html +187 -0
- package/g.getSettings.mjs +3 -0
- package/package.json +15 -11
- package/public/index.html +9 -2
- package/server/WWebApi.mjs +93 -36
- package/server/procApis.mjs +62 -0
- package/server/procLang.mjs +386 -0
- package/server/procProxy.mjs +120 -0
- package/server/srLog.mjs +30 -0
- package/server/staLogs/staEvent.mjs +129 -0
- package/server/staLogs/test_staEvent.mjs +132 -0
- package/settings.json +14 -0
- package/src/App.vue +11 -7
- package/src/assets/scalar-ui.css +113 -0
- package/src/components/Common/CheckYes.vue +102 -0
- package/src/components/Common/CheckYesNo.vue +115 -0
- package/src/components/Common/LoadingWinBar.vue +114 -0
- package/src/components/Layout.vue +8 -7
- package/src/components/LayoutContent.vue +308 -333
- package/src/components/LayoutContentEdit.vue +577 -0
- package/src/components/LayoutContentStats.vue +485 -0
- package/src/components/LayoutContentTest.vue +799 -0
- package/src/components/MdPanel.vue +80 -58
- package/src/main.js +8 -0
- package/src/plugins/mUI.mjs +19 -4
- package/src/schema/tables/apis.mjs +30 -0
- package/srv.mjs +47 -19
- package/tableTags.json +1 -1
- package/.github/workflows/ci-test.yml +0 -24
- package/.vscode/launch.json +0 -18
- package/db/wapis/apis/data.mdb +0 -0
- package/db/wapis/apis/lock.mdb +0 -0
- package/dist/css/app.b5cf2ef5.css +0 -1
- package/dist/js/app-legacy.927b5679.js +0 -1
- package/dist/js/app.927b5679.js +0 -1
- package/dist/js/chunk-vendors-legacy.ffb0c6c5.js +0 -13
- package/dist/js/chunk-vendors.ffb0c6c5.js +0 -13
- package/tableTags-web-api.json +0 -1
- package/test/all.test.mjs +0 -10
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
|
|
5
5
|
<meta charset="utf-8">
|
|
6
|
-
<title>WWebApi.mjs - Documentation</title>
|
|
6
|
+
<title>server/WWebApi.mjs - Documentation</title>
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
<script src="scripts/prettify/prettify.js"></script>
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
|
|
36
36
|
<div id="main">
|
|
37
37
|
|
|
38
|
-
<h1 class="page-title">WWebApi.mjs</h1>
|
|
38
|
+
<h1 class="page-title">server/WWebApi.mjs</h1>
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
|
|
@@ -73,6 +73,10 @@ import replace from 'wsemi/src/replace.mjs'
|
|
|
73
73
|
import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
|
|
74
74
|
import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
|
|
75
75
|
import procLang from './procLang.mjs'
|
|
76
|
+
import procProxy from './procProxy.mjs'
|
|
77
|
+
import procApis from './procApis.mjs'
|
|
78
|
+
import staEvent from './staLogs/staEvent.mjs'
|
|
79
|
+
import srLogInit from './srLog.mjs'
|
|
76
80
|
import ds from '../src/schema/index.mjs'
|
|
77
81
|
|
|
78
82
|
|
|
@@ -273,6 +277,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
273
277
|
//params
|
|
274
278
|
let showLanguage = get(opt, 'showLanguage', 'y')
|
|
275
279
|
let language = get(opt, 'language', 'eng')
|
|
280
|
+
let logFd = get(opt, 'logFd', './_logs') //srLog 寫入 + staEvent 統計共用之 log 資料夾
|
|
276
281
|
|
|
277
282
|
|
|
278
283
|
//kpLangExt
|
|
@@ -299,6 +304,35 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
299
304
|
let { woItems, procOrm } = wp
|
|
300
305
|
|
|
301
306
|
|
|
307
|
+
//srLog(後端 log;錯誤一律 log err-key 供識別,對齊 w-web-sso)
|
|
308
|
+
let srLog = srLogInit(opt)
|
|
309
|
+
|
|
310
|
+
//kpFunExt 邊界統一處理:成功記 info(供 staEvent 統計呼叫頻率);catch 後端錯誤 → srLog 該 err-key →
|
|
311
|
+
//原樣 re-reject(前端依 key 查自己 lang 顯示)。event 統一加 'kpfun-' 前綴 → 專用事件、與 api/verifyConn 區分。
|
|
312
|
+
let wrapErrLog = (event, fn) => {
|
|
313
|
+
let ev = 'kpfun-' + event
|
|
314
|
+
return async (...args) => {
|
|
315
|
+
try {
|
|
316
|
+
let result = await fn(...args)
|
|
317
|
+
srLog.info({ event: ev }) //成功也記 info
|
|
318
|
+
return result
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
srLog.error({ event: ev, err })
|
|
322
|
+
return Promise.reject(err)
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
//procProxy
|
|
329
|
+
let { proxyRequest } = procProxy({ srLog })
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
//procApis
|
|
333
|
+
let { getApisList, saveApi, deleteApi } = procApis({ woItems, procOrm, ds })
|
|
334
|
+
|
|
335
|
+
|
|
302
336
|
//getWebInfor
|
|
303
337
|
let getWebInfor = (userId) => {
|
|
304
338
|
return {
|
|
@@ -321,26 +355,26 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
321
355
|
if (!isestr(id)) {
|
|
322
356
|
console.log('user', user)
|
|
323
357
|
console.log('can not get the userId')
|
|
324
|
-
return Promise.reject(
|
|
358
|
+
return Promise.reject('errUserIdMissing')
|
|
325
359
|
}
|
|
326
360
|
let email = get(user, 'email', '')
|
|
327
361
|
if (!isestr(email)) {
|
|
328
362
|
console.log('user', user)
|
|
329
363
|
console.log('can not get the email of user')
|
|
330
|
-
return Promise.reject(
|
|
364
|
+
return Promise.reject('errUserEmailMissing')
|
|
331
365
|
}
|
|
332
366
|
let name = get(user, 'name', '')
|
|
333
367
|
if (!isestr(name)) {
|
|
334
368
|
console.log('user', user)
|
|
335
369
|
console.log('can not get userName')
|
|
336
|
-
return Promise.reject(
|
|
370
|
+
return Promise.reject('errUserNameMissing')
|
|
337
371
|
}
|
|
338
372
|
let isAdmin = get(user, 'isAdmin', '')
|
|
339
373
|
if (isAdmin !== 'y' && isAdmin !== 'n') {
|
|
340
374
|
console.log('user', user)
|
|
341
375
|
console.log('user.isAdmin is not y or n', user.isAdmin)
|
|
342
376
|
console.log('can not get the role of user')
|
|
343
|
-
return Promise.reject(
|
|
377
|
+
return Promise.reject('errUserRoleMissing')
|
|
344
378
|
}
|
|
345
379
|
return true
|
|
346
380
|
}
|
|
@@ -360,7 +394,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
360
394
|
// if (!iseobj(userSelf)) {
|
|
361
395
|
// console.log(`token`, token)
|
|
362
396
|
// console.log(`can not find the user from token`)
|
|
363
|
-
// return Promise.reject(
|
|
397
|
+
// return Promise.reject('errUserNotFound')
|
|
364
398
|
// }
|
|
365
399
|
await checkUser(userSelf)
|
|
366
400
|
}
|
|
@@ -402,9 +436,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
402
436
|
if (!b) {
|
|
403
437
|
console.log('user', user)
|
|
404
438
|
console.log(`user does not have permission`)
|
|
405
|
-
return Promise.reject(
|
|
439
|
+
return Promise.reject('errUserNoPermission')
|
|
406
440
|
}
|
|
407
441
|
|
|
442
|
+
srLog.info({ event: 'verifyClientUser', from, userId: get(user, 'id', '') }) //瀏覽使用者驗證通過
|
|
408
443
|
return user
|
|
409
444
|
}
|
|
410
445
|
|
|
@@ -427,7 +462,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
427
462
|
if (!iseobj(user)) {
|
|
428
463
|
console.log(`token`, token)
|
|
429
464
|
console.log(`can not find the user from token`)
|
|
430
|
-
return Promise.reject(
|
|
465
|
+
return Promise.reject('errUserNotFound')
|
|
431
466
|
}
|
|
432
467
|
|
|
433
468
|
//verifyAppUser
|
|
@@ -440,9 +475,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
440
475
|
if (!b) {
|
|
441
476
|
console.log('user', user)
|
|
442
477
|
console.log(`user does not have permission`)
|
|
443
|
-
return Promise.reject(
|
|
478
|
+
return Promise.reject('errUserNoPermission')
|
|
444
479
|
}
|
|
445
480
|
|
|
481
|
+
srLog.info({ event: 'verifyAppUser', from, userId: get(user, 'id', '') }) //應用程式使用者驗證通過
|
|
446
482
|
return user
|
|
447
483
|
}
|
|
448
484
|
|
|
@@ -469,7 +505,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
469
505
|
if (!iseobj(payload)) {
|
|
470
506
|
console.log('payload', payload)
|
|
471
507
|
console.log(`invalid payload in req`)
|
|
472
|
-
return Promise.reject(
|
|
508
|
+
return Promise.reject('errPayloadInvalid')
|
|
473
509
|
}
|
|
474
510
|
|
|
475
511
|
//group
|
|
@@ -479,7 +515,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
479
515
|
if (!isestr(group)) {
|
|
480
516
|
console.log('payload', payload)
|
|
481
517
|
console.log(`invalid group in payload`)
|
|
482
|
-
return Promise.reject(
|
|
518
|
+
return Promise.reject('errGroupInvalid')
|
|
483
519
|
}
|
|
484
520
|
|
|
485
521
|
//rows
|
|
@@ -489,7 +525,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
489
525
|
if (!isearr(rows)) {
|
|
490
526
|
console.log('payload', payload)
|
|
491
527
|
console.log(`invalid rows in payload`)
|
|
492
|
-
return Promise.reject(
|
|
528
|
+
return Promise.reject('errRowsInvalid')
|
|
493
529
|
}
|
|
494
530
|
|
|
495
531
|
//r
|
|
@@ -529,7 +565,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
529
565
|
console.log('inp', inp)
|
|
530
566
|
console.log('group', group)
|
|
531
567
|
console.log(`invalid group`)
|
|
532
|
-
return Promise.reject(
|
|
568
|
+
return Promise.reject('errGroupInvalid')
|
|
533
569
|
}
|
|
534
570
|
|
|
535
571
|
//rows
|
|
@@ -540,7 +576,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
540
576
|
if (!isearr(rows)) {
|
|
541
577
|
console.log('inp', inp)
|
|
542
578
|
console.log('keyTable', keyTable)
|
|
543
|
-
return Promise.reject(
|
|
579
|
+
return Promise.reject('errRowsInvalid')
|
|
544
580
|
}
|
|
545
581
|
|
|
546
582
|
//save from
|
|
@@ -611,6 +647,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
611
647
|
c = replace(c, '/mapi/', '{sfd}/') //方法同genEntry
|
|
612
648
|
c = replace(c, '{sfd}', subfolder)
|
|
613
649
|
c = replace(c, '{urlRedirect}', urlRedirect)
|
|
650
|
+
c = replace(c, '{language}', language) //注入初始語系 → window.___pmwperm___.language(前端 getLang 之來源之一)
|
|
614
651
|
fs.writeFileSync(fpEntryOut, c, 'utf8')
|
|
615
652
|
}
|
|
616
653
|
catch (err) {
|
|
@@ -639,7 +676,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
639
676
|
console.log('token', token)
|
|
640
677
|
console.log('[API]getUserByToken/check token: invalid token')
|
|
641
678
|
console.log(`token does not have permission`)
|
|
642
|
-
return Promise.reject(
|
|
679
|
+
return Promise.reject('errTokenNoPermission')
|
|
643
680
|
}
|
|
644
681
|
|
|
645
682
|
//getAndVerifyClientUser
|
|
@@ -650,9 +687,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
650
687
|
console.log('token', token)
|
|
651
688
|
console.log('[API]getUserByToken/check user: invalid user')
|
|
652
689
|
console.log(`token does not have permission`)
|
|
653
|
-
return Promise.reject(
|
|
690
|
+
return Promise.reject('errTokenNoPermission')
|
|
654
691
|
}
|
|
655
692
|
|
|
693
|
+
srLog.info({ event: 'api/getUserByToken', userId: get(user, 'id', '') })
|
|
656
694
|
return user
|
|
657
695
|
}
|
|
658
696
|
|
|
@@ -684,7 +722,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
684
722
|
// console.log('token', token)
|
|
685
723
|
// console.log('[API]getAPIsList/check token: invalid token')
|
|
686
724
|
// console.log(`token does not have permission`)
|
|
687
|
-
// return Promise.reject(
|
|
725
|
+
// return Promise.reject('errTokenNoPermission')
|
|
688
726
|
// }
|
|
689
727
|
|
|
690
728
|
// //getAndVerifyClientUser
|
|
@@ -695,7 +733,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
695
733
|
// console.log('token', token)
|
|
696
734
|
// console.log('[API]getAPIsList/check user: invalid user')
|
|
697
735
|
// console.log(`token does not have permission`)
|
|
698
|
-
// return Promise.reject(
|
|
736
|
+
// return Promise.reject('errTokenNoPermission')
|
|
699
737
|
// }
|
|
700
738
|
|
|
701
739
|
// //getAPIsList
|
|
@@ -733,7 +771,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
733
771
|
// console.log('token', token)
|
|
734
772
|
// console.log('[API]updateAPIs/check token: invalid token')
|
|
735
773
|
// console.log(`token does not have permission`)
|
|
736
|
-
// return Promise.reject(
|
|
774
|
+
// return Promise.reject('errTokenNoPermission')
|
|
737
775
|
// }
|
|
738
776
|
|
|
739
777
|
// //getAndVerifyClientUser
|
|
@@ -744,7 +782,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
744
782
|
// console.log('token', token)
|
|
745
783
|
// console.log('[API]updateAPIs/check user: invalid user')
|
|
746
784
|
// console.log(`token does not have permission`)
|
|
747
|
-
// return Promise.reject(
|
|
785
|
+
// return Promise.reject('errTokenNoPermission')
|
|
748
786
|
// }
|
|
749
787
|
|
|
750
788
|
// //parsePayload
|
|
@@ -785,7 +823,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
785
823
|
console.log('token', token)
|
|
786
824
|
console.log('[API]syncAndReplaceTabs/check token: invalid token')
|
|
787
825
|
console.log(`token does not have permission`)
|
|
788
|
-
return Promise.reject(
|
|
826
|
+
return Promise.reject('errTokenNoPermission')
|
|
789
827
|
}
|
|
790
828
|
|
|
791
829
|
//keyTable
|
|
@@ -797,14 +835,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
797
835
|
console.log('keyTable', keyTable)
|
|
798
836
|
console.log('[API]syncAndReplaceTabs/check keyTable: invalid keyTable')
|
|
799
837
|
console.log(`token does not have permission`)
|
|
800
|
-
return Promise.reject(
|
|
838
|
+
return Promise.reject('errTokenNoPermission')
|
|
801
839
|
}
|
|
802
840
|
|
|
803
841
|
//check keyTable
|
|
804
842
|
let allowedTables = ['apis']
|
|
805
843
|
if (!allowedTables.includes(keyTable)) {
|
|
806
844
|
console.log('[API]syncAndReplaceTabs/check keyTable: unexpected keyTable', keyTable)
|
|
807
|
-
return Promise.reject(
|
|
845
|
+
return Promise.reject('errKeyTableInvalid')
|
|
808
846
|
}
|
|
809
847
|
|
|
810
848
|
//getAndVerifyAppUser
|
|
@@ -815,7 +853,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
815
853
|
console.log('token', token)
|
|
816
854
|
console.log('[API]syncAndReplaceTabs/check user: invalid user')
|
|
817
855
|
console.log(`token does not have permission`)
|
|
818
|
-
return Promise.reject(
|
|
856
|
+
return Promise.reject('errTokenNoPermission')
|
|
819
857
|
}
|
|
820
858
|
|
|
821
859
|
//userId
|
|
@@ -827,7 +865,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
827
865
|
console.log('user', user)
|
|
828
866
|
console.log('[API]syncAndReplaceTabs/check userId: invalid userId')
|
|
829
867
|
console.log(`token does not have permission`)
|
|
830
|
-
return Promise.reject(
|
|
868
|
+
return Promise.reject('errTokenNoPermission')
|
|
831
869
|
}
|
|
832
870
|
|
|
833
871
|
//parsePayload
|
|
@@ -836,6 +874,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
836
874
|
//syncAndReplaceTabs
|
|
837
875
|
let r = await syncAndReplaceTabs(userId, inp, keyTable)
|
|
838
876
|
|
|
877
|
+
srLog.info({ event: 'api/syncAndReplaceTabs', userId, keyTable })
|
|
839
878
|
return r
|
|
840
879
|
}
|
|
841
880
|
|
|
@@ -887,19 +926,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
887
926
|
let b = await p.checkToken(token)
|
|
888
927
|
// console.log('b', b)
|
|
889
928
|
|
|
929
|
+
srLog.info({ event: 'verifyConn', apiType }) //連線驗證通過(checkToken 失敗時會 throw 不到此)
|
|
890
930
|
return b
|
|
891
931
|
},
|
|
892
932
|
getUserIdByToken: async (token) => { //可使用async或sync函數
|
|
893
933
|
// console.log('getUserIdByToken', token)
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
// return Promise.reject(`can not find user.id`)
|
|
901
|
-
// }
|
|
902
|
-
// return userId
|
|
934
|
+
if (!isestr(token)) {
|
|
935
|
+
return ''
|
|
936
|
+
}
|
|
937
|
+
let user = await getUserByToken(token)
|
|
938
|
+
let userId = get(user, 'id', '')
|
|
939
|
+
return userId
|
|
903
940
|
},
|
|
904
941
|
useDbOrm: true,
|
|
905
942
|
kpOrm: woItems,
|
|
@@ -907,9 +944,29 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
907
944
|
tableNamesExec,
|
|
908
945
|
methodsExec: ['select', 'insert', 'save', 'del'], //mix需於procOrm內註冊以提供
|
|
909
946
|
tableNamesSync,
|
|
910
|
-
kpFunExt: { //接收參數第1個為userId,
|
|
911
|
-
|
|
912
|
-
getWebInfor,
|
|
947
|
+
kpFunExt: { //接收參數第1個為userId, 之後才是前端給予參數(皆經 wrapErrLog:錯誤 srLog err-key 後 re-reject)
|
|
948
|
+
|
|
949
|
+
getWebInfor: wrapErrLog('getWebInfor', getWebInfor),
|
|
950
|
+
|
|
951
|
+
proxyRequest: wrapErrLog('proxyRequest', (userId, reqSpec) => {
|
|
952
|
+
return proxyRequest(reqSpec)
|
|
953
|
+
}),
|
|
954
|
+
|
|
955
|
+
getApisList: wrapErrLog('getApisList', (userId) => {
|
|
956
|
+
return getApisList(userId)
|
|
957
|
+
}),
|
|
958
|
+
saveApi: wrapErrLog('saveApi', (userId, row) => {
|
|
959
|
+
return saveApi(userId, row)
|
|
960
|
+
}),
|
|
961
|
+
deleteApi: wrapErrLog('deleteApi', (userId, id) => {
|
|
962
|
+
return deleteApi(userId, id)
|
|
963
|
+
}),
|
|
964
|
+
|
|
965
|
+
//統計資訊頁:回傳各 event 之時段發生頻率(讀 logFd 之 log)。連線已由 verifyClientUser 限管理員,
|
|
966
|
+
//故此處不另檢查(同 getApisList)。timeLength 天數 / timeInterval 'hr'|'day'。
|
|
967
|
+
getStaEvent: wrapErrLog('getStaEvent', (userId, timeLength = 7, timeInterval = 'hr') => {
|
|
968
|
+
return staEvent(timeLength, timeInterval, { fdLog: logFd })
|
|
969
|
+
}),
|
|
913
970
|
|
|
914
971
|
// getAPIsList: (userId, query = {}) => { //待提供api管理系統界面使用
|
|
915
972
|
// return getAPIsList(query)
|
|
@@ -942,7 +999,7 @@ export default WWebApi
|
|
|
942
999
|
<br class="clear">
|
|
943
1000
|
|
|
944
1001
|
<footer>
|
|
945
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.
|
|
1002
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Jun 22 2026 15:42:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
946
1003
|
</footer>
|
|
947
1004
|
|
|
948
1005
|
<script>prettyPrint();</script>
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>src/components/Common/CheckYesNo.vue - Documentation</title>
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
<script src="scripts/prettify/prettify.js"></script>
|
|
10
|
+
<script src="scripts/prettify/lang-css.js"></script>
|
|
11
|
+
<!--[if lt IE 9]>
|
|
12
|
+
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
13
|
+
<![endif]-->
|
|
14
|
+
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
|
|
15
|
+
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
|
|
16
|
+
<script src="scripts/nav.js" defer></script>
|
|
17
|
+
|
|
18
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
|
|
22
|
+
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
|
|
23
|
+
<label for="nav-trigger" class="navicon-button x">
|
|
24
|
+
<div class="navicon"></div>
|
|
25
|
+
</label>
|
|
26
|
+
|
|
27
|
+
<label for="nav-trigger" class="overlay"></label>
|
|
28
|
+
|
|
29
|
+
<nav >
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WWebApi.html">WWebApi</a></li></ul>
|
|
33
|
+
|
|
34
|
+
</nav>
|
|
35
|
+
|
|
36
|
+
<div id="main">
|
|
37
|
+
|
|
38
|
+
<h1 class="page-title">src/components/Common/CheckYesNo.vue</h1>
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<section>
|
|
47
|
+
<article>
|
|
48
|
+
<pre class="prettyprint source linenums"><code><template>
|
|
49
|
+
<WConfirm
|
|
50
|
+
:show.sync="bShow"
|
|
51
|
+
:title="$t('systemMessage')"
|
|
52
|
+
:content="content"
|
|
53
|
+
:_contentColor="'white'"
|
|
54
|
+
:_contentIconColor="'white'"
|
|
55
|
+
:_contentBackgroundColor="'orange lighten-5'"
|
|
56
|
+
:_titleColor="'white'"
|
|
57
|
+
:headerBackgroundColor="'grey lighten-3'"
|
|
58
|
+
:noBtnText="$t('no')"
|
|
59
|
+
:yesBtnText="$t('yes')"
|
|
60
|
+
@click-no="clickBtn(false)"
|
|
61
|
+
@click-yes="clickBtn(true)"
|
|
62
|
+
></WConfirm>
|
|
63
|
+
</template>
|
|
64
|
+
|
|
65
|
+
<script>
|
|
66
|
+
import Vue from 'vue'
|
|
67
|
+
import genPm from 'wsemi/src/genPm.mjs'
|
|
68
|
+
import WConfirm from 'w-component-vue/src/components/WConfirm.vue'
|
|
69
|
+
|
|
70
|
+
export default {
|
|
71
|
+
components: {
|
|
72
|
+
WConfirm,
|
|
73
|
+
},
|
|
74
|
+
props: {
|
|
75
|
+
},
|
|
76
|
+
data: function() {
|
|
77
|
+
return {
|
|
78
|
+
|
|
79
|
+
bShow: false,
|
|
80
|
+
pm: null,
|
|
81
|
+
|
|
82
|
+
content: '',
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
mounted: function() {
|
|
87
|
+
//console.log('mounted')
|
|
88
|
+
|
|
89
|
+
let vo = this
|
|
90
|
+
|
|
91
|
+
//set
|
|
92
|
+
Vue.prototype.$dg.showCheckYesNo = vo.show
|
|
93
|
+
|
|
94
|
+
},
|
|
95
|
+
computed: {
|
|
96
|
+
},
|
|
97
|
+
methods: {
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* 顯示 Yes/No 確認對話框並回傳 Promise。
|
|
101
|
+
*
|
|
102
|
+
* **Contract** (caller 須遵守):
|
|
103
|
+
* - 使用者點 **Yes** → Promise `resolve()` (無值, 進 `.then()`)
|
|
104
|
+
* - 使用者點 **No** → Promise `reject('close')` (進 `.catch(err => err === 'close')`)
|
|
105
|
+
*
|
|
106
|
+
* 正確 caller pattern:
|
|
107
|
+
*
|
|
108
|
+
* vo.$dg.showCheckYesNo('確定要 X?')
|
|
109
|
+
* .then(() => {
|
|
110
|
+
* //使用者點 Yes
|
|
111
|
+
* doX()
|
|
112
|
+
* })
|
|
113
|
+
* .catch((err) => {
|
|
114
|
+
* //使用者點 No (err === 'close') 為正常路徑, 靜默處理
|
|
115
|
+
* if (err === 'close') return
|
|
116
|
+
* //非預期錯誤 (CheckYesNo 本身故障等)
|
|
117
|
+
* console.log('showCheckYesNo unexpected error', err)
|
|
118
|
+
* })
|
|
119
|
+
*
|
|
120
|
+
* @param {string} content - 顯示在 modal 中的訊息文字
|
|
121
|
+
* @returns {Promise<void>} Yes → resolve(); No → reject('close')
|
|
122
|
+
*/
|
|
123
|
+
show: function(content) {
|
|
124
|
+
//console.log('methods show', content)
|
|
125
|
+
|
|
126
|
+
let vo = this
|
|
127
|
+
|
|
128
|
+
//pm
|
|
129
|
+
vo.pm = genPm()
|
|
130
|
+
|
|
131
|
+
//save
|
|
132
|
+
vo.content = content
|
|
133
|
+
|
|
134
|
+
//show
|
|
135
|
+
vo.bShow = true
|
|
136
|
+
|
|
137
|
+
return vo.pm
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
clickBtn: function(mode) {
|
|
141
|
+
//console.log('methods clickBtn', mode)
|
|
142
|
+
|
|
143
|
+
let vo = this
|
|
144
|
+
|
|
145
|
+
if (mode) {
|
|
146
|
+
vo.pm.resolve()
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
vo.pm.reject('close')
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
//hide
|
|
153
|
+
vo.bShow = false
|
|
154
|
+
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
</script>
|
|
160
|
+
|
|
161
|
+
<style scoped>
|
|
162
|
+
</style>
|
|
163
|
+
</code></pre>
|
|
164
|
+
</article>
|
|
165
|
+
</section>
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<br class="clear">
|
|
175
|
+
|
|
176
|
+
<footer>
|
|
177
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Jun 22 2026 15:42:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
178
|
+
</footer>
|
|
179
|
+
|
|
180
|
+
<script>prettyPrint();</script>
|
|
181
|
+
<script src="scripts/polyfill.js"></script>
|
|
182
|
+
<script src="scripts/linenumber.js"></script>
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
</body>
|
|
187
|
+
</html>
|