w-web-api 1.0.41 → 1.0.43

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.
@@ -0,0 +1,51 @@
1
+ import map from 'lodash-es/map.js'
2
+ import ds from './src/schema/index.mjs'
3
+ import provideTabs from './server/provideTabs.mjs'
4
+
5
+
6
+ async function provide() {
7
+
8
+ let url = `http://localhost:11005/syncAndReplaceTabs?token=sys&keyTable=apis`
9
+
10
+ let rs = [
11
+ {
12
+ id: 'id-for-test',
13
+ // order: 0,
14
+ name: '取得天竺鼠清單資訊',
15
+ description: '取得天竺鼠清單資訊',
16
+ url: '指api網址, 例如 http://localhost:11005/getDogsList',
17
+ method: 'get',
18
+ version: 'v1',
19
+ // group: '寵物',
20
+ levels: '寵物.天竺鼠',
21
+ keywords: 'pets;guineapigs',
22
+ state: 'ok',
23
+ creator: 'pets-system',
24
+ dataSource: 'pets-data',
25
+ mdInputParams: '輸入方式說明, markdown格式',
26
+ inputExample: '輸入範例數據',
27
+ mdOutputParams: '輸出方式說明, markdown格式',
28
+ outputExample: '輸出範例數據, json格式',
29
+ },
30
+ ]
31
+ rs = map(rs, (v, k) => {
32
+ let vv = ds.apis.funNew(v)
33
+ vv.id = v.id
34
+ return vv
35
+ })
36
+ console.log('rs', rs)
37
+
38
+ let keyTable = 'apis'
39
+ let group = '寵物'
40
+ let r = await provideTabs(url, keyTable, group, rs)
41
+ console.log('r', r)
42
+
43
+ }
44
+
45
+ provide()
46
+ .catch((err) => {
47
+ console.log('provide catch', err)
48
+ })
49
+
50
+
51
+ //node g.provideApis.mjs
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-web-api",
3
- "version": "1.0.41",
3
+ "version": "1.0.43",
4
4
  "main": "dist/w-web-api.umd.js",
5
5
  "dependencies": {
6
6
  "@mdi/js": "^7.4.47",
@@ -2,6 +2,7 @@ import path from 'path'
2
2
  import fs from 'fs'
3
3
  import get from 'lodash-es/get.js'
4
4
  import each from 'lodash-es/each.js'
5
+ import map from 'lodash-es/map.js'
5
6
  import keys from 'lodash-es/keys.js'
6
7
  import j2o from 'wsemi/src/j2o.mjs'
7
8
  import iseobj from 'wsemi/src/iseobj.mjs'
@@ -18,6 +19,7 @@ import strright from 'wsemi/src/strright.mjs'
18
19
  import strdelright from 'wsemi/src/strdelright.mjs'
19
20
  import pm2resolve from 'wsemi/src/pm2resolve.mjs'
20
21
  import b642str from 'wsemi/src/b642str.mjs'
22
+ import ltdtmapping from 'wsemi/src/ltdtmapping.mjs'
21
23
  import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
22
24
  import fsIsFile from 'wsemi/src/fsIsFile.mjs'
23
25
  import replace from 'wsemi/src/replace.mjs'
@@ -316,175 +318,200 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
316
318
  }
317
319
 
318
320
 
319
- //getAndVerifyBrowserTokenUser
320
- let getAndVerifyBrowserTokenUser = async (token, from = '') => {
321
+ //getAndVerifyClientUser
322
+ let getAndVerifyClientUser = async (token, from = '') => {
323
+ //基於token查找client使用者, 會基於外部getUserByToken以及perm內部users進行查找並比對
321
324
 
322
325
  //getTokenUser
323
- let userSelf = await getTokenUser(token)
326
+ let user = await getTokenUser(token)
324
327
 
325
328
  //verifyClientUser
326
- let b = verifyClientUser(userSelf, from)
329
+ let b = verifyClientUser(user, from)
327
330
  if (ispm(b)) {
328
331
  b = await b
329
332
  }
330
333
 
331
334
  //check
332
335
  if (!b) {
333
- console.log('userSelf', userSelf)
336
+ console.log('user', user)
334
337
  console.log(`user does not have permission`)
335
338
  return Promise.reject(`user does not have permission`)
336
339
  }
337
340
 
338
- return userSelf
341
+ return user
339
342
  }
340
343
 
341
344
 
342
- //getAndVerifyAppTokenUser
343
- let getAndVerifyAppTokenUser = async (token, from = '') => {
345
+ //getAndVerifyAppUser
346
+ let getAndVerifyAppUser = async (token, from = '') => {
347
+ //基於token查找app使用者, 會基於外部getUserByToken進行查找, 故只要getUserByToken提供使用者即可, 可支援getUserByToken給予針對應用程式所產生之虛擬使用者
344
348
 
345
- //getTokenUser
346
- let userSelf = await getTokenUser(token)
349
+ //user
350
+ let user = null
351
+ if (isestr(token)) {
352
+ user = getUserByToken(token)
353
+ if (ispm(user)) {
354
+ user = await user
355
+ }
356
+ }
357
+ // console.log('user', user)
358
+
359
+ //check
360
+ if (!iseobj(user)) {
361
+ console.log(`token`, token)
362
+ console.log(`can not find the user from token`)
363
+ return Promise.reject(`can not find the user from token`)
364
+ }
347
365
 
348
366
  //verifyAppUser
349
- let b = verifyAppUser(userSelf, from)
367
+ let b = verifyAppUser(user, from)
350
368
  if (ispm(b)) {
351
369
  b = await b
352
370
  }
353
371
 
354
372
  //check
355
373
  if (!b) {
356
- console.log('userSelf', userSelf)
374
+ console.log('user', user)
357
375
  console.log(`user does not have permission`)
358
376
  return Promise.reject(`user does not have permission`)
359
377
  }
360
378
 
361
- return userSelf
379
+ return user
362
380
  }
363
381
 
364
382
 
365
- //getAPIsList
366
- let getAPIsList = async (query = {}) => {
367
- let rs = await woItems.apis.select(query)
368
- return rs
369
- }
383
+ // //getAPIsList
384
+ // let getAPIsList = async (query = {}) => {
385
+ // let rs = await woItems.apis.select(query)
386
+ // return rs
387
+ // }
370
388
 
371
389
 
372
390
  //parsePayload
373
391
  let parsePayload = async (req) => {
374
392
 
375
- //inp
376
- let inp = get(req, 'payload')
393
+ //payload
394
+ let payload = get(req, 'payload')
377
395
 
378
396
  //to obj
379
- if (isestr(inp)) {
380
- inp = j2o(inp)
397
+ if (isestr(payload)) {
398
+ payload = j2o(payload)
381
399
  }
382
400
 
383
401
  //check
384
- if (!iseobj(inp)) {
385
- console.log('inp', inp)
386
- console.log(`invalid inp from req`)
387
- return Promise.reject(`invalid inp from req`)
402
+ if (!iseobj(payload)) {
403
+ console.log('payload', payload)
404
+ console.log(`invalid payload in req`)
405
+ return Promise.reject(`invalid payload in req`)
388
406
  }
389
407
 
390
408
  //group
391
- let group = get(inp, 'group', '')
409
+ let group = get(payload, 'group', '')
392
410
 
393
411
  //check
394
412
  if (!isestr(group)) {
395
- console.log('inp', inp)
396
- console.log('group', group)
397
- console.log(`invalid group from inp`)
398
- return Promise.reject(`invalid group from inp`)
413
+ console.log('payload', payload)
414
+ console.log(`invalid group in payload`)
415
+ return Promise.reject(`invalid group in payload`)
399
416
  }
400
417
 
401
- //apis
402
- let apis = get(inp, 'apis', [])
418
+ //rows
419
+ let rows = get(payload, 'rows', [])
403
420
 
404
421
  //check
405
- if (!isearr(apis)) {
406
- console.log('inp', inp)
407
- console.log('apis', apis)
408
- console.log(`invalid apis from inp`)
409
- return Promise.reject(`invalid apis from inp`)
422
+ if (!isearr(rows)) {
423
+ console.log('payload', payload)
424
+ console.log(`invalid rows in payload`)
425
+ return Promise.reject(`invalid rows in payload`)
410
426
  }
411
427
 
412
- //偵測b64自動恢復
413
- each(apis, (api, kapi) => {
414
- // console.log(kapi, api.name)
415
- each(api, (v, k) => {
416
- // console.log(k, v)
417
- if (isestr(v)) {
418
- if (strleft(v, 7) === 'base64:') {
419
- // console.log(k, 'get base64')
420
- v = strdelleft(v, 7)
421
- v = b642str(v)
422
- // console.log(v)
423
- apis[kapi][k] = v
424
- }
425
- }
426
- })
427
- })
428
-
429
- //save group
430
- each(apis, (api, kapi) => {
431
- apis[kapi].group = group
432
- })
433
-
434
- //resave
435
- inp = { group, apis }
428
+ //r
429
+ let r = {
430
+ group,
431
+ rows,
432
+ }
436
433
 
437
- return inp
434
+ return r
438
435
  }
439
436
 
440
437
 
441
- //updateAPIs
442
- let updateAPIs = async (params = {}) => {
438
+ // //updateAPIs
439
+ // let updateAPIs = async (inp = {}) => {
443
440
 
444
- //spread params
445
- let { apis: rsApis } = params
446
- // console.log('group', group)
447
- // console.log('rsApis', rsApis)
441
+ // //spread inp
442
+ // let { apis: rsApis } = inp
443
+ // // console.log('group', group)
444
+ // // console.log('rsApis', rsApis)
448
445
 
449
- //save
450
- let r = await woItems.apis.save(rsApis)
446
+ // //save
447
+ // let r = await woItems.apis.save(rsApis)
451
448
 
452
- return r
453
- }
449
+ // return r
450
+ // }
454
451
 
455
452
 
456
- //syncAndReplaceApis
457
- let syncAndReplaceApis = async (params) => {
453
+ //syncAndReplaceTabs
454
+ let syncAndReplaceTabs = async (userId, inp, keyTable) => {
458
455
 
459
456
  //group
460
- let group = get(params, 'group', '')
457
+ let group = get(inp, 'group', '')
461
458
  // console.log('group', group)
462
459
 
463
460
  //check
464
461
  if (!isestr(group)) {
465
- console.log('params', params)
462
+ console.log('inp', inp)
466
463
  console.log('group', group)
467
464
  console.log(`invalid group`)
468
465
  return Promise.reject(`invalid group`)
469
466
  }
470
467
 
471
- //apis
472
- let apis = get(params, 'apis', [])
473
- // console.log('apis', apis)
468
+ //rows
469
+ let rows = get(inp, 'rows', [])
470
+ // console.log('rows', rows)
474
471
 
475
472
  //check
476
- if (!isearr(apis)) {
477
- console.log('params', params)
478
- console.log('apis', apis)
479
- console.log(`invalid apis`)
480
- return Promise.reject(`invalid apis`)
473
+ if (!isearr(rows)) {
474
+ console.log('inp', inp)
475
+ console.log('keyTable', keyTable)
476
+ return Promise.reject(`invalid rows`)
481
477
  }
482
478
 
479
+ //save from
480
+ rows = map(rows, (v, k) => {
481
+ // v.order = k + 1 //order大部分由外部給予, 不能複寫
482
+ v.group = group
483
+ return v
484
+ })
485
+
486
+ //偵測b64自動恢復
487
+ if (keyTable === 'apis') {
488
+ each(rows, (row, krow) => {
489
+ // console.log(kapi, row.name)
490
+ each(row, (v, k) => {
491
+ // console.log(k, v)
492
+ if (isestr(v)) {
493
+ if (strleft(v, 7) === 'base64:') {
494
+ // console.log(k, 'get base64')
495
+ v = strdelleft(v, 7)
496
+ v = b642str(v)
497
+ // console.log(v)
498
+ rows[krow][k] = v
499
+ }
500
+ }
501
+ })
502
+ })
503
+ }
504
+
505
+ //ltdtmapping
506
+ rows = ltdtmapping(rows, ds[keyTable].keys)
507
+ // console.log('ltdtmapping rows', rows)
508
+
483
509
  //delAll group
484
- await woItems.apis.delAll({ group })
510
+ await woItems[keyTable].delAll({ group })
485
511
 
486
512
  //insert
487
- let r = await woItems.apis.insert(apis)
513
+ // let r = await woItems[keyTable].insert(rows)
514
+ let r = await procOrm(userId, keyTable, 'insert', rows) //須使用procOrm才有辦法自動給予相關欄位
488
515
 
489
516
  return r
490
517
  }
@@ -540,7 +567,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
540
567
 
541
568
  {
542
569
  method: 'GET',
543
- path: '/api/getUserByToken', //未登入界面需先檢測token是否為系統管理員, 確認後回傳為系統管理員資訊物件, getUserByToken為w-ui-loginout預設值, 若要更改兩邊須同時修改
570
+ path: '/api/getUserByToken', //未登入主頁時需先檢測token, getUserByToken為w-ui-loginout預設值, 若要更改兩邊須同時修改
544
571
  handler: async function (req, res) {
545
572
  // console.log('getUserByToken', req)
546
573
 
@@ -549,8 +576,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
549
576
  //token
550
577
  let token = get(req, 'query.token', '')
551
578
 
552
- //getAndVerifyBrowserTokenUser
553
- let user = await getAndVerifyBrowserTokenUser(token, 'getUserByToken')
579
+ //check
580
+ if (!isestr(token)) {
581
+ console.log('req.query', get(req, 'query'))
582
+ console.log('token', token)
583
+ console.log('[API]getUserByToken/check token: invalid token')
584
+ console.log(`token does not have permission`)
585
+ return Promise.reject(`token does not have permission`)
586
+ }
587
+
588
+ //getAndVerifyClientUser
589
+ let user = await getAndVerifyClientUser(token, 'getUserByToken')
554
590
 
555
591
  //check
556
592
  if (!iseobj(user)) {
@@ -573,105 +609,166 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
573
609
  return r
574
610
  },
575
611
  },
612
+
613
+ // {
614
+ // method: 'GET',
615
+ // path: '/getAPIsList',
616
+ // handler: async function (req, res) {
617
+ // // console.log('getAPIsList', req)
618
+
619
+ // async function core() {
620
+
621
+ // //token
622
+ // let token = get(req, 'query.token', '')
623
+
624
+ // //check
625
+ // if (!isestr(token)) {
626
+ // console.log('req.query', get(req, 'query'))
627
+ // console.log('token', token)
628
+ // console.log('[API]getAPIsList/check token: invalid token')
629
+ // console.log(`token does not have permission`)
630
+ // return Promise.reject(`token does not have permission`)
631
+ // }
632
+
633
+ // //getAndVerifyClientUser
634
+ // let user = await getAndVerifyClientUser(token, 'getAPIsList')
635
+
636
+ // //check
637
+ // if (!iseobj(user)) {
638
+ // console.log('token', token)
639
+ // console.log('[API]getAPIsList/check user: invalid user')
640
+ // console.log(`token does not have permission`)
641
+ // return Promise.reject(`token does not have permission`)
642
+ // }
643
+
644
+ // //getAPIsList
645
+ // let r = await getAPIsList({ isActive: 'y' })
646
+
647
+ // return r
648
+ // }
649
+
650
+ // //pm2resolve core
651
+ // let r = await pm2resolve(core)()
652
+ // if (isErr(r.msg)) {
653
+ // r.msg = r.msg.message
654
+ // }
655
+ // // console.log('getAPIsList', r)
656
+
657
+ // return r
658
+ // },
659
+ // },
660
+
661
+ // {
662
+ // method: 'POST',
663
+ // path: '/updateAPIs',
664
+ // handler: async function (req, res) {
665
+ // // console.log('updateAPIs', req)
666
+ // // console.log('payload', req.payload)
667
+
668
+ // async function core() {
669
+
670
+ // //token
671
+ // let token = get(req, 'query.token', '')
672
+
673
+ // //check
674
+ // if (!isestr(token)) {
675
+ // console.log('req.query', get(req, 'query'))
676
+ // console.log('token', token)
677
+ // console.log('[API]updateAPIs/check token: invalid token')
678
+ // console.log(`token does not have permission`)
679
+ // return Promise.reject(`token does not have permission`)
680
+ // }
681
+
682
+ // //getAndVerifyClientUser
683
+ // let user = await getAndVerifyClientUser(token, 'updateAPIs')
684
+
685
+ // //check
686
+ // if (!iseobj(user)) {
687
+ // console.log('token', token)
688
+ // console.log('[API]updateAPIs/check user: invalid user')
689
+ // console.log(`token does not have permission`)
690
+ // return Promise.reject(`token does not have permission`)
691
+ // }
692
+
693
+ // //parsePayload
694
+ // let inp = await parsePayload(req)
695
+
696
+ // //updateAPIs
697
+ // let r = await updateAPIs(inp)
698
+
699
+ // return r
700
+ // }
701
+
702
+ // //pm2resolve core
703
+ // let r = await pm2resolve(core)()
704
+ // if (isErr(r.msg)) {
705
+ // r.msg = r.msg.message
706
+ // }
707
+ // // console.log('updateAPIs', r)
708
+
709
+ // return r
710
+ // },
711
+ // },
712
+
576
713
  {
577
- method: 'GET',
578
- path: '/getAPIsList',
714
+ method: 'POST',
715
+ path: '/syncAndReplaceTabs',
579
716
  handler: async function (req, res) {
580
- // console.log('getAPIsList', req)
717
+ // console.log('syncAndReplaceTabs', req)
718
+ // console.log('payload', req.payload)
581
719
 
582
720
  async function core() {
583
721
 
584
722
  //token
585
723
  let token = get(req, 'query.token', '')
586
724
 
587
- //getAndVerifyBrowserTokenUser
588
- let user = await getAndVerifyBrowserTokenUser(token, 'getAPIsList')
589
-
590
725
  //check
591
- if (!iseobj(user)) {
726
+ if (!isestr(token)) {
727
+ console.log('req.query', get(req, 'query'))
592
728
  console.log('token', token)
593
- console.log('[API]getAPIsList/check user: invalid user')
729
+ console.log('[API]syncAndReplaceTabs/check token: invalid token')
594
730
  console.log(`token does not have permission`)
595
731
  return Promise.reject(`token does not have permission`)
596
732
  }
597
733
 
598
- //getAPIsList
599
- let r = await getAPIsList({ isActive: 'y' })
600
-
601
- return r
602
- }
603
-
604
- //pm2resolve core
605
- let r = await pm2resolve(core)()
606
- if (isErr(r.msg)) {
607
- r.msg = r.msg.message
608
- }
609
- // console.log('getAPIsList', r)
610
-
611
- return r
612
- },
613
- },
614
- {
615
- method: 'POST',
616
- path: '/updateAPIs',
617
- handler: async function (req, res) {
618
- // console.log('updateAPIs', req)
619
- // console.log('payload', req.payload)
734
+ //keyTable
735
+ let keyTable = get(req, 'query.keyTable', '')
620
736
 
621
- async function core() {
737
+ //check
738
+ if (!isestr(keyTable)) {
739
+ console.log('req.query', get(req, 'query'))
740
+ console.log('keyTable', keyTable)
741
+ console.log('[API]syncAndReplaceTabs/check keyTable: invalid keyTable')
742
+ console.log(`token does not have permission`)
743
+ return Promise.reject(`token does not have permission`)
744
+ }
622
745
 
623
- //token
624
- let token = get(req, 'query.token', '')
746
+ //check keyTable
747
+ let allowedTables = ['apis']
748
+ if (!allowedTables.includes(keyTable)) {
749
+ console.log('[API]syncAndReplaceTabs/check keyTable: unexpected keyTable', keyTable)
750
+ return Promise.reject(`invalid keyTable: ${keyTable}`)
751
+ }
625
752
 
626
- //getAndVerifyBrowserTokenUser
627
- let user = await getAndVerifyBrowserTokenUser(token, 'updateAPIs')
753
+ //getAndVerifyAppUser
754
+ let user = await getAndVerifyAppUser(token, 'syncAndReplaceTabs')
628
755
 
629
756
  //check
630
757
  if (!iseobj(user)) {
631
758
  console.log('token', token)
632
- console.log('[API]updateAPIs/check user: invalid user')
759
+ console.log('[API]syncAndReplaceTabs/check user: invalid user')
633
760
  console.log(`token does not have permission`)
634
761
  return Promise.reject(`token does not have permission`)
635
762
  }
636
763
 
637
- //parsePayload
638
- let inp = await parsePayload(req)
639
-
640
- //updateAPIs
641
- let r = await updateAPIs(inp)
642
-
643
- return r
644
- }
645
-
646
- //pm2resolve core
647
- let r = await pm2resolve(core)()
648
- if (isErr(r.msg)) {
649
- r.msg = r.msg.message
650
- }
651
- // console.log('updateAPIs', r)
652
-
653
- return r
654
- },
655
- },
656
- {
657
- method: 'POST',
658
- path: '/syncAndReplaceApis',
659
- handler: async function (req, res) {
660
- // console.log('syncAndReplaceApis', req)
661
- // console.log('payload', req.payload)
662
-
663
- async function core() {
664
-
665
- //token
666
- let token = get(req, 'query.token', '')
764
+ //userId
765
+ let userId = get(user, 'id', '')
667
766
 
668
- //getAndVerifyAppTokenUser
669
- let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceApis')
670
-
671
- //check
672
- if (!iseobj(user)) {
767
+ //check userId
768
+ if (!isestr(userId)) {
673
769
  console.log('token', token)
674
- console.log('[API]syncAndReplaceApis/check user: invalid user')
770
+ console.log('user', user)
771
+ console.log('[API]syncAndReplaceTabs/check userId: invalid userId')
675
772
  console.log(`token does not have permission`)
676
773
  return Promise.reject(`token does not have permission`)
677
774
  }
@@ -679,8 +776,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
679
776
  //parsePayload
680
777
  let inp = await parsePayload(req)
681
778
 
682
- //syncAndReplaceApis
683
- let r = await syncAndReplaceApis(inp)
779
+ //syncAndReplaceTabs
780
+ let r = await syncAndReplaceTabs(userId, inp, keyTable)
684
781
 
685
782
  return r
686
783
  }
@@ -690,11 +787,12 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
690
787
  if (isErr(r.msg)) {
691
788
  r.msg = r.msg.message
692
789
  }
693
- // console.log('syncAndReplaceApis', r)
790
+ // console.log('syncAndReplaceTabs', r)
694
791
 
695
792
  return r
696
793
  },
697
794
  },
795
+
698
796
  ]
699
797
 
700
798
 
@@ -756,11 +854,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
756
854
 
757
855
  getWebInfor,
758
856
 
759
- getAPIsList: (userId, query = {}) => {
760
- return getAPIsList(query)
761
- },
762
-
763
- // updateApis: (userId, rows) => {
857
+ // getAPIsList: (userId, query = {}) => { //待提供api管理系統界面使用
858
+ // return getAPIsList(query)
859
+ // },
860
+ // updateApis: (userId, rows) => { //待提供api管理系統界面使用
764
861
  // return updateApis(rows)
765
862
  // },
766
863