w-web-api 1.0.51 → 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} +118 -41
- 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 +115 -38
- package/server/procApis.mjs +62 -0
- package/server/procLang.mjs +724 -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 +33 -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 +58 -71
- package/src/schema/tables/apis.mjs +30 -0
- package/src/store/mutations.mjs +1 -1
- 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.fbfba810.js +0 -1
- package/dist/js/app.fbfba810.js +0 -1
- package/dist/js/chunk-vendors-legacy.735ec7d6.js +0 -13
- package/dist/js/chunk-vendors.735ec7d6.js +0 -13
- package/src/plugins/mLang.mjs +0 -250
- 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
|
|
|
@@ -72,6 +72,11 @@ import fsIsFile from 'wsemi/src/fsIsFile.mjs'
|
|
|
72
72
|
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
|
+
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'
|
|
75
80
|
import ds from '../src/schema/index.mjs'
|
|
76
81
|
|
|
77
82
|
|
|
@@ -269,6 +274,20 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
269
274
|
let urlRedirect = get(opt, 'urlRedirect', '')
|
|
270
275
|
|
|
271
276
|
|
|
277
|
+
//params
|
|
278
|
+
let showLanguage = get(opt, 'showLanguage', 'y')
|
|
279
|
+
let language = get(opt, 'language', 'eng')
|
|
280
|
+
let logFd = get(opt, 'logFd', './_logs') //srLog 寫入 + staEvent 統計共用之 log 資料夾
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
//kpLangExt
|
|
284
|
+
let kpLangExt = get(opt, 'kpLangExt', {})
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
//kpLang
|
|
288
|
+
let kpLang = procLang({ kpLangExt, webName, webDescription })
|
|
289
|
+
|
|
290
|
+
|
|
272
291
|
//WServOrm
|
|
273
292
|
let optWServOrm = {
|
|
274
293
|
useCheckUser,
|
|
@@ -285,12 +304,47 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
285
304
|
let { woItems, procOrm } = wp
|
|
286
305
|
|
|
287
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
|
+
|
|
288
336
|
//getWebInfor
|
|
289
337
|
let getWebInfor = (userId) => {
|
|
290
338
|
return {
|
|
291
|
-
|
|
292
|
-
|
|
339
|
+
|
|
340
|
+
// webName, //已併入kpLang
|
|
341
|
+
// webDescription, //已併入kpLang
|
|
293
342
|
webLogo,
|
|
343
|
+
|
|
344
|
+
showLanguage,
|
|
345
|
+
language,
|
|
346
|
+
kpLang,
|
|
347
|
+
|
|
294
348
|
}
|
|
295
349
|
}
|
|
296
350
|
|
|
@@ -301,26 +355,26 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
301
355
|
if (!isestr(id)) {
|
|
302
356
|
console.log('user', user)
|
|
303
357
|
console.log('can not get the userId')
|
|
304
|
-
return Promise.reject(
|
|
358
|
+
return Promise.reject('errUserIdMissing')
|
|
305
359
|
}
|
|
306
360
|
let email = get(user, 'email', '')
|
|
307
361
|
if (!isestr(email)) {
|
|
308
362
|
console.log('user', user)
|
|
309
363
|
console.log('can not get the email of user')
|
|
310
|
-
return Promise.reject(
|
|
364
|
+
return Promise.reject('errUserEmailMissing')
|
|
311
365
|
}
|
|
312
366
|
let name = get(user, 'name', '')
|
|
313
367
|
if (!isestr(name)) {
|
|
314
368
|
console.log('user', user)
|
|
315
369
|
console.log('can not get userName')
|
|
316
|
-
return Promise.reject(
|
|
370
|
+
return Promise.reject('errUserNameMissing')
|
|
317
371
|
}
|
|
318
372
|
let isAdmin = get(user, 'isAdmin', '')
|
|
319
373
|
if (isAdmin !== 'y' && isAdmin !== 'n') {
|
|
320
374
|
console.log('user', user)
|
|
321
375
|
console.log('user.isAdmin is not y or n', user.isAdmin)
|
|
322
376
|
console.log('can not get the role of user')
|
|
323
|
-
return Promise.reject(
|
|
377
|
+
return Promise.reject('errUserRoleMissing')
|
|
324
378
|
}
|
|
325
379
|
return true
|
|
326
380
|
}
|
|
@@ -340,7 +394,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
340
394
|
// if (!iseobj(userSelf)) {
|
|
341
395
|
// console.log(`token`, token)
|
|
342
396
|
// console.log(`can not find the user from token`)
|
|
343
|
-
// return Promise.reject(
|
|
397
|
+
// return Promise.reject('errUserNotFound')
|
|
344
398
|
// }
|
|
345
399
|
await checkUser(userSelf)
|
|
346
400
|
}
|
|
@@ -382,9 +436,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
382
436
|
if (!b) {
|
|
383
437
|
console.log('user', user)
|
|
384
438
|
console.log(`user does not have permission`)
|
|
385
|
-
return Promise.reject(
|
|
439
|
+
return Promise.reject('errUserNoPermission')
|
|
386
440
|
}
|
|
387
441
|
|
|
442
|
+
srLog.info({ event: 'verifyClientUser', from, userId: get(user, 'id', '') }) //瀏覽使用者驗證通過
|
|
388
443
|
return user
|
|
389
444
|
}
|
|
390
445
|
|
|
@@ -407,7 +462,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
407
462
|
if (!iseobj(user)) {
|
|
408
463
|
console.log(`token`, token)
|
|
409
464
|
console.log(`can not find the user from token`)
|
|
410
|
-
return Promise.reject(
|
|
465
|
+
return Promise.reject('errUserNotFound')
|
|
411
466
|
}
|
|
412
467
|
|
|
413
468
|
//verifyAppUser
|
|
@@ -420,9 +475,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
420
475
|
if (!b) {
|
|
421
476
|
console.log('user', user)
|
|
422
477
|
console.log(`user does not have permission`)
|
|
423
|
-
return Promise.reject(
|
|
478
|
+
return Promise.reject('errUserNoPermission')
|
|
424
479
|
}
|
|
425
480
|
|
|
481
|
+
srLog.info({ event: 'verifyAppUser', from, userId: get(user, 'id', '') }) //應用程式使用者驗證通過
|
|
426
482
|
return user
|
|
427
483
|
}
|
|
428
484
|
|
|
@@ -449,7 +505,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
449
505
|
if (!iseobj(payload)) {
|
|
450
506
|
console.log('payload', payload)
|
|
451
507
|
console.log(`invalid payload in req`)
|
|
452
|
-
return Promise.reject(
|
|
508
|
+
return Promise.reject('errPayloadInvalid')
|
|
453
509
|
}
|
|
454
510
|
|
|
455
511
|
//group
|
|
@@ -459,7 +515,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
459
515
|
if (!isestr(group)) {
|
|
460
516
|
console.log('payload', payload)
|
|
461
517
|
console.log(`invalid group in payload`)
|
|
462
|
-
return Promise.reject(
|
|
518
|
+
return Promise.reject('errGroupInvalid')
|
|
463
519
|
}
|
|
464
520
|
|
|
465
521
|
//rows
|
|
@@ -469,7 +525,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
469
525
|
if (!isearr(rows)) {
|
|
470
526
|
console.log('payload', payload)
|
|
471
527
|
console.log(`invalid rows in payload`)
|
|
472
|
-
return Promise.reject(
|
|
528
|
+
return Promise.reject('errRowsInvalid')
|
|
473
529
|
}
|
|
474
530
|
|
|
475
531
|
//r
|
|
@@ -509,7 +565,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
509
565
|
console.log('inp', inp)
|
|
510
566
|
console.log('group', group)
|
|
511
567
|
console.log(`invalid group`)
|
|
512
|
-
return Promise.reject(
|
|
568
|
+
return Promise.reject('errGroupInvalid')
|
|
513
569
|
}
|
|
514
570
|
|
|
515
571
|
//rows
|
|
@@ -520,7 +576,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
520
576
|
if (!isearr(rows)) {
|
|
521
577
|
console.log('inp', inp)
|
|
522
578
|
console.log('keyTable', keyTable)
|
|
523
|
-
return Promise.reject(
|
|
579
|
+
return Promise.reject('errRowsInvalid')
|
|
524
580
|
}
|
|
525
581
|
|
|
526
582
|
//save from
|
|
@@ -591,6 +647,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
591
647
|
c = replace(c, '/mapi/', '{sfd}/') //方法同genEntry
|
|
592
648
|
c = replace(c, '{sfd}', subfolder)
|
|
593
649
|
c = replace(c, '{urlRedirect}', urlRedirect)
|
|
650
|
+
c = replace(c, '{language}', language) //注入初始語系 → window.___pmwperm___.language(前端 getLang 之來源之一)
|
|
594
651
|
fs.writeFileSync(fpEntryOut, c, 'utf8')
|
|
595
652
|
}
|
|
596
653
|
catch (err) {
|
|
@@ -619,7 +676,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
619
676
|
console.log('token', token)
|
|
620
677
|
console.log('[API]getUserByToken/check token: invalid token')
|
|
621
678
|
console.log(`token does not have permission`)
|
|
622
|
-
return Promise.reject(
|
|
679
|
+
return Promise.reject('errTokenNoPermission')
|
|
623
680
|
}
|
|
624
681
|
|
|
625
682
|
//getAndVerifyClientUser
|
|
@@ -630,9 +687,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
630
687
|
console.log('token', token)
|
|
631
688
|
console.log('[API]getUserByToken/check user: invalid user')
|
|
632
689
|
console.log(`token does not have permission`)
|
|
633
|
-
return Promise.reject(
|
|
690
|
+
return Promise.reject('errTokenNoPermission')
|
|
634
691
|
}
|
|
635
692
|
|
|
693
|
+
srLog.info({ event: 'api/getUserByToken', userId: get(user, 'id', '') })
|
|
636
694
|
return user
|
|
637
695
|
}
|
|
638
696
|
|
|
@@ -664,7 +722,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
664
722
|
// console.log('token', token)
|
|
665
723
|
// console.log('[API]getAPIsList/check token: invalid token')
|
|
666
724
|
// console.log(`token does not have permission`)
|
|
667
|
-
// return Promise.reject(
|
|
725
|
+
// return Promise.reject('errTokenNoPermission')
|
|
668
726
|
// }
|
|
669
727
|
|
|
670
728
|
// //getAndVerifyClientUser
|
|
@@ -675,7 +733,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
675
733
|
// console.log('token', token)
|
|
676
734
|
// console.log('[API]getAPIsList/check user: invalid user')
|
|
677
735
|
// console.log(`token does not have permission`)
|
|
678
|
-
// return Promise.reject(
|
|
736
|
+
// return Promise.reject('errTokenNoPermission')
|
|
679
737
|
// }
|
|
680
738
|
|
|
681
739
|
// //getAPIsList
|
|
@@ -713,7 +771,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
713
771
|
// console.log('token', token)
|
|
714
772
|
// console.log('[API]updateAPIs/check token: invalid token')
|
|
715
773
|
// console.log(`token does not have permission`)
|
|
716
|
-
// return Promise.reject(
|
|
774
|
+
// return Promise.reject('errTokenNoPermission')
|
|
717
775
|
// }
|
|
718
776
|
|
|
719
777
|
// //getAndVerifyClientUser
|
|
@@ -724,7 +782,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
724
782
|
// console.log('token', token)
|
|
725
783
|
// console.log('[API]updateAPIs/check user: invalid user')
|
|
726
784
|
// console.log(`token does not have permission`)
|
|
727
|
-
// return Promise.reject(
|
|
785
|
+
// return Promise.reject('errTokenNoPermission')
|
|
728
786
|
// }
|
|
729
787
|
|
|
730
788
|
// //parsePayload
|
|
@@ -765,7 +823,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
765
823
|
console.log('token', token)
|
|
766
824
|
console.log('[API]syncAndReplaceTabs/check token: invalid token')
|
|
767
825
|
console.log(`token does not have permission`)
|
|
768
|
-
return Promise.reject(
|
|
826
|
+
return Promise.reject('errTokenNoPermission')
|
|
769
827
|
}
|
|
770
828
|
|
|
771
829
|
//keyTable
|
|
@@ -777,14 +835,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
777
835
|
console.log('keyTable', keyTable)
|
|
778
836
|
console.log('[API]syncAndReplaceTabs/check keyTable: invalid keyTable')
|
|
779
837
|
console.log(`token does not have permission`)
|
|
780
|
-
return Promise.reject(
|
|
838
|
+
return Promise.reject('errTokenNoPermission')
|
|
781
839
|
}
|
|
782
840
|
|
|
783
841
|
//check keyTable
|
|
784
842
|
let allowedTables = ['apis']
|
|
785
843
|
if (!allowedTables.includes(keyTable)) {
|
|
786
844
|
console.log('[API]syncAndReplaceTabs/check keyTable: unexpected keyTable', keyTable)
|
|
787
|
-
return Promise.reject(
|
|
845
|
+
return Promise.reject('errKeyTableInvalid')
|
|
788
846
|
}
|
|
789
847
|
|
|
790
848
|
//getAndVerifyAppUser
|
|
@@ -795,7 +853,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
795
853
|
console.log('token', token)
|
|
796
854
|
console.log('[API]syncAndReplaceTabs/check user: invalid user')
|
|
797
855
|
console.log(`token does not have permission`)
|
|
798
|
-
return Promise.reject(
|
|
856
|
+
return Promise.reject('errTokenNoPermission')
|
|
799
857
|
}
|
|
800
858
|
|
|
801
859
|
//userId
|
|
@@ -807,7 +865,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
807
865
|
console.log('user', user)
|
|
808
866
|
console.log('[API]syncAndReplaceTabs/check userId: invalid userId')
|
|
809
867
|
console.log(`token does not have permission`)
|
|
810
|
-
return Promise.reject(
|
|
868
|
+
return Promise.reject('errTokenNoPermission')
|
|
811
869
|
}
|
|
812
870
|
|
|
813
871
|
//parsePayload
|
|
@@ -816,6 +874,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
816
874
|
//syncAndReplaceTabs
|
|
817
875
|
let r = await syncAndReplaceTabs(userId, inp, keyTable)
|
|
818
876
|
|
|
877
|
+
srLog.info({ event: 'api/syncAndReplaceTabs', userId, keyTable })
|
|
819
878
|
return r
|
|
820
879
|
}
|
|
821
880
|
|
|
@@ -867,19 +926,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
867
926
|
let b = await p.checkToken(token)
|
|
868
927
|
// console.log('b', b)
|
|
869
928
|
|
|
929
|
+
srLog.info({ event: 'verifyConn', apiType }) //連線驗證通過(checkToken 失敗時會 throw 不到此)
|
|
870
930
|
return b
|
|
871
931
|
},
|
|
872
932
|
getUserIdByToken: async (token) => { //可使用async或sync函數
|
|
873
933
|
// console.log('getUserIdByToken', token)
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
// return Promise.reject(`can not find user.id`)
|
|
881
|
-
// }
|
|
882
|
-
// return userId
|
|
934
|
+
if (!isestr(token)) {
|
|
935
|
+
return ''
|
|
936
|
+
}
|
|
937
|
+
let user = await getUserByToken(token)
|
|
938
|
+
let userId = get(user, 'id', '')
|
|
939
|
+
return userId
|
|
883
940
|
},
|
|
884
941
|
useDbOrm: true,
|
|
885
942
|
kpOrm: woItems,
|
|
@@ -887,9 +944,29 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
|
|
|
887
944
|
tableNamesExec,
|
|
888
945
|
methodsExec: ['select', 'insert', 'save', 'del'], //mix需於procOrm內註冊以提供
|
|
889
946
|
tableNamesSync,
|
|
890
|
-
kpFunExt: { //接收參數第1個為userId,
|
|
891
|
-
|
|
892
|
-
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
|
+
}),
|
|
893
970
|
|
|
894
971
|
// getAPIsList: (userId, query = {}) => { //待提供api管理系統界面使用
|
|
895
972
|
// return getAPIsList(query)
|
|
@@ -922,7 +999,7 @@ export default WWebApi
|
|
|
922
999
|
<br class="clear">
|
|
923
1000
|
|
|
924
1001
|
<footer>
|
|
925
|
-
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.
|
|
926
1003
|
</footer>
|
|
927
1004
|
|
|
928
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>
|