w-web-api 1.0.29 → 1.0.31

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/docs/WWebApi.html CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
 
66
66
 
67
- <h4 class="name" id="WWebApi"><span class="type-signature"></span>new WWebApi<span class="signature">(WOrm, url, db, getUserByToken, verifyUser, opt<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {Object}</span></h4>
67
+ <h4 class="name" id="WWebApi"><span class="type-signature"></span>new WWebApi<span class="signature">(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {Object}</span></h4>
68
68
 
69
69
 
70
70
 
@@ -80,7 +80,7 @@
80
80
 
81
81
  <dt class="tag-source">Source:</dt>
82
82
  <dd class="tag-source"><ul class="dummy"><li>
83
- <a href="WWebApi.mjs.html">WWebApi.mjs</a>, <a href="WWebApi.mjs.html#line115">line 115</a>
83
+ <a href="WWebApi.mjs.html">WWebApi.mjs</a>, <a href="WWebApi.mjs.html#line128">line 128</a>
84
84
  </li></ul></dd>
85
85
 
86
86
 
@@ -127,7 +127,7 @@
127
127
 
128
128
  <h5 class="h5-examples">Example</h5>
129
129
 
130
- <pre class="prettyprint"><code>import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
131
130
  bCheckUser: false,
132
131
  getUserById: null,
133
132
  bExcludeWhenNotAdmin: false,
134
133
  serverPort: 11005,
135
134
  subfolder: '', //mapi
136
135
  webName: {
137
136
  'eng': 'API Service',
138
137
  'cht': 'API管理系統',
139
138
  },
140
139
  webDescription: {
141
140
  'eng': 'A web service package as methods to send requests to and receive responses from an API.',
142
141
  'cht': 'A web service package as methods to send requests to and receive responses from an API.',
143
142
  },
144
143
  webLogo: 'data:image/svg+xml;base64,...',
145
144
  // return {} //測試無法登入
146
145
  if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
147
146
  return {
148
147
  id: 'id-for-application',
149
148
  name: 'application',
150
149
  email: 'admin@example.com',
151
150
  isAdmin: 'y',
152
151
  }
153
152
  }
154
153
  if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
155
154
  return {
156
155
  id: 'id-for-admin',
157
156
  name: '測試者',
158
157
  email: 'admin@example.com',
159
158
  isAdmin: 'y',
160
159
  }
161
160
  }
162
161
  console.log('invalid token', token)
163
162
  console.log('於生產環境時得加入SSO等驗證token機制')
164
163
  return {}
165
164
  console.log('於生產環境時得加入驗證user機制')
166
165
  return user.isAdmin === 'y' //測試僅系統管理者使用
167
166
  console.log(err)
167
+ <pre class="prettyprint"><code>import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
168
168
  bCheckUser: false,
169
169
  getUserById: null,
170
170
  bExcludeWhenNotAdmin: false,
171
171
  serverPort: 11005,
172
172
  subfolder: '', //mapi
173
173
  urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11005/
174
174
  webName: {
175
175
  'eng': 'API Service',
176
176
  'cht': 'API管理系統',
177
177
  },
178
178
  webDescription: {
179
179
  'eng': 'A web service package as methods to send requests to and receive responses from an API.',
180
180
  'cht': 'A web service package as methods to send requests to and receive responses from an API.',
181
181
  },
182
182
  webLogo: 'data:image/svg+xml;base64,...',
183
183
  // return {} //測試無法登入
184
184
  if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
185
185
  return {
186
186
  id: 'id-for-application',
187
187
  name: 'application',
188
188
  email: 'application@example.com',
189
189
  isAdmin: 'y',
190
190
  }
191
191
  }
192
192
  if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
193
193
  return {
194
194
  id: 'id-for-admin',
195
195
  name: '測試者',
196
196
  email: 'admin@example.com',
197
197
  isAdmin: 'y',
198
198
  }
199
199
  }
200
200
  console.log('invalid token', token)
201
201
  console.log('於生產環境時得加入SSO等驗證token機制')
202
202
  return {}
203
203
  console.log('verifyBrowserUser/user', user)
204
204
  // return false //測試無法登入
205
205
  console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
206
206
  return user.isAdmin === 'y' //測試僅系統管理者使用
207
207
  console.log('verifyAppUser/user', user)
208
208
  // return false //測試無法登入
209
209
  console.log('於生產環境時得加入限制應用程式使用者身份機制')
210
210
  return user.isAdmin === 'y' //測試僅系統管理者使用
211
211
  console.log(err)
212
212
 
213
213
 
214
214
 
@@ -305,7 +305,7 @@
305
305
 
306
306
  <tr>
307
307
 
308
- <td class="name"><code>verifyUser</code></td>
308
+ <td class="name"><code>verifyBrowserUser</code></td>
309
309
 
310
310
 
311
311
  <td class="type">
@@ -334,7 +334,43 @@
334
334
  </td>
335
335
 
336
336
 
337
- <td class="description last"><p>輸入處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false</p></td>
337
+ <td class="description last"><p>輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false</p></td>
338
+ </tr>
339
+
340
+
341
+
342
+ <tr>
343
+
344
+ <td class="name"><code>verifyAppUser</code></td>
345
+
346
+
347
+ <td class="type">
348
+
349
+
350
+ <span class="param-type">function</span>
351
+
352
+
353
+
354
+
355
+ </td>
356
+
357
+
358
+ <td class="attributes">
359
+
360
+
361
+
362
+
363
+
364
+ </td>
365
+
366
+
367
+
368
+ <td class="default">
369
+
370
+ </td>
371
+
372
+
373
+ <td class="description last"><p>輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false</p></td>
338
374
  </tr>
339
375
 
340
376
 
@@ -721,6 +757,46 @@
721
757
  </tr>
722
758
 
723
759
 
760
+
761
+ <tr>
762
+
763
+ <td class="name"><code>urlRedirect</code></td>
764
+
765
+
766
+ <td class="type">
767
+
768
+
769
+ <span class="param-type">String</span>
770
+
771
+
772
+
773
+
774
+ </td>
775
+
776
+
777
+ <td class="attributes">
778
+
779
+ &lt;optional><br>
780
+
781
+
782
+
783
+
784
+
785
+ </td>
786
+
787
+
788
+
789
+ <td class="default">
790
+
791
+ <code>''</code>
792
+
793
+ </td>
794
+
795
+
796
+ <td class="description last"><p>輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''</p></td>
797
+ </tr>
798
+
799
+
724
800
  </tbody>
725
801
  </table>
726
802
 
@@ -809,7 +885,7 @@
809
885
  <br class="clear">
810
886
 
811
887
  <footer>
812
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 11:10:20 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
888
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 12:07:15 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
813
889
  </footer>
814
890
 
815
891
  <script>prettyPrint();</script>
@@ -48,10 +48,8 @@
48
48
  <pre class="prettyprint source linenums"><code>import path from 'path'
49
49
  import fs from 'fs'
50
50
  import get from 'lodash/get'
51
- // import map from 'lodash/map'
52
51
  import each from 'lodash/each'
53
52
  import keys from 'lodash/keys'
54
- // import cloneDeep from 'lodash/cloneDeep'
55
53
  import j2o from 'wsemi/src/j2o.mjs'
56
54
  import iseobj from 'wsemi/src/iseobj.mjs'
57
55
  import isestr from 'wsemi/src/isestr.mjs'
@@ -67,6 +65,7 @@ import strdelright from 'wsemi/src/strdelright.mjs'
67
65
  import pm2resolve from 'wsemi/src/pm2resolve.mjs'
68
66
  import b642str from 'wsemi/src/b642str.mjs'
69
67
  import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
68
+ import fsIsFile from 'wsemi/src/fsIsFile.mjs'
70
69
  import replace from 'wsemi/src/replace.mjs'
71
70
  import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
72
71
  import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
@@ -81,7 +80,8 @@ import ds from '../src/schema/index.mjs'
81
80
  * @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
82
81
  * @param {String} db 輸入資料庫名稱字串
83
82
  * @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
84
- * @param {Function} verifyUser 輸入處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
83
+ * @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
84
+ * @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
85
85
  * @param {Object} [opt={}] 輸入設定物件,預設{}
86
86
  * @param {Integer} [opt.serverPort=11005] 輸入伺服器通訊port,預設11005
87
87
  * @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
@@ -91,12 +91,15 @@ import ds from '../src/schema/index.mjs'
91
91
  * @param {Object} [opt.webDescription={}] 輸入站台描述物件,至少包含語系eng與cht鍵的名稱,預設{}
92
92
  * @param {String} [opt.webLogo=''] 輸入站台logo字串,採base64格式,預設''
93
93
  * @param {String} [opt.subfolder=''] 輸入站台所在子目錄字串,提供站台位於內網採反向代理進行服務時,故需支援位於子目錄情形,預設''
94
+ * @param {String} [opt.urlRedirect=''] 輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''
94
95
  * @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
95
96
  * @example
97
+ *
96
98
  * import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
97
99
  * import WWebApi from './server/WWebApi.mjs'
98
100
  * import getSettings from './g.getSettings.mjs'
99
101
  *
102
+ *
100
103
  * //st
101
104
  * let st = getSettings()
102
105
  *
@@ -110,6 +113,7 @@ import ds from '../src/schema/index.mjs'
110
113
  *
111
114
  * serverPort: 11005,
112
115
  * subfolder: '', //mapi
116
+ * urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11005/
113
117
  *
114
118
  * webName: {
115
119
  * 'eng': 'API Service',
@@ -123,13 +127,13 @@ import ds from '../src/schema/index.mjs'
123
127
  *
124
128
  * }
125
129
  *
126
- * let getUserByToken = (token) => {
130
+ * let getUserByToken = async (token) => {
127
131
  * // return {} //測試無法登入
128
132
  * if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
129
133
  * return {
130
134
  * id: 'id-for-application',
131
135
  * name: 'application',
132
- * email: 'admin@example.com',
136
+ * email: 'application@example.com',
133
137
  * isAdmin: 'y',
134
138
  * }
135
139
  * }
@@ -146,20 +150,29 @@ import ds from '../src/schema/index.mjs'
146
150
  * return {}
147
151
  * }
148
152
  *
149
- * let verifyUser = (user) => {
150
- * console.log('於生產環境時得加入驗證user機制')
153
+ * let verifyBrowserUser = (user, caller) => {
154
+ * console.log('verifyBrowserUser/user', user)
155
+ * // return false //測試無法登入
156
+ * console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
157
+ * return user.isAdmin === 'y' //測試僅系統管理者使用
158
+ * }
159
+ *
160
+ * let verifyAppUser = (user, caller) => {
161
+ * console.log('verifyAppUser/user', user)
162
+ * // return false //測試無法登入
163
+ * console.log('於生產環境時得加入限制應用程式使用者身份機制')
151
164
  * return user.isAdmin === 'y' //測試僅系統管理者使用
152
165
  * }
153
166
  *
154
167
  * //WWebApi
155
- * let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt)
168
+ * let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
156
169
  *
157
170
  * instWWebApi.on('error', (err) => {
158
171
  * console.log(err)
159
172
  * })
160
173
  *
161
174
  */
162
- function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
175
+ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt = {}) {
163
176
  let instWServHapiServer = null
164
177
 
165
178
 
@@ -191,10 +204,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
191
204
  }
192
205
 
193
206
 
194
- //check verifyUser
195
- if (!isfun(verifyUser)) {
196
- console.log('invalid verifyUser', verifyUser)
197
- throw new Error('invalid verifyUser')
207
+ //check verifyBrowserUser
208
+ if (!isfun(verifyBrowserUser)) {
209
+ console.log('invalid verifyBrowserUser', verifyBrowserUser)
210
+ throw new Error('invalid verifyBrowserUser')
211
+ }
212
+
213
+
214
+ //check verifyAppUser
215
+ if (!isfun(verifyAppUser)) {
216
+ console.log('invalid verifyAppUser', verifyAppUser)
217
+ throw new Error('invalid verifyAppUser')
198
218
  }
199
219
 
200
220
 
@@ -242,6 +262,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
242
262
  }
243
263
 
244
264
 
265
+ //urlRedirect
266
+ let urlRedirect = get(opt, 'urlRedirect', '')
267
+
268
+
245
269
  //WServOrm
246
270
  let optWServOrm = {
247
271
  bCheckUser,
@@ -268,8 +292,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
268
292
  }
269
293
 
270
294
 
271
- //getTokenUserForSelf
272
- let getTokenUserForSelf = async (token) => {
295
+ //getTokenUser
296
+ let getTokenUser = async (token) => {
273
297
 
274
298
  //getUserByToken
275
299
  let userSelf = getUserByToken(token)
@@ -279,12 +303,46 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
279
303
 
280
304
  //check
281
305
  if (!iseobj(userSelf)) {
282
- console.log(`can not find the user from token`, token)
306
+ console.log(`token`, token)
307
+ console.log(`can not find the user from token`)
283
308
  return Promise.reject(`can not find the user from token`)
284
309
  }
285
310
 
286
- //verifyUser
287
- let b = verifyUser(userSelf)
311
+ return userSelf
312
+ }
313
+
314
+
315
+ //getAndVerifyBrowserTokenUser
316
+ let getAndVerifyBrowserTokenUser = async (token, caller = '') => {
317
+
318
+ //getTokenUser
319
+ let userSelf = await getTokenUser(token)
320
+
321
+ //verifyBrowserUser
322
+ let b = verifyBrowserUser(userSelf, caller)
323
+ if (ispm(b)) {
324
+ b = await b
325
+ }
326
+
327
+ //check
328
+ if (!b) {
329
+ console.log('userSelf', userSelf)
330
+ console.log(`user does not have permission`)
331
+ return Promise.reject(`user does not have permission`)
332
+ }
333
+
334
+ return userSelf
335
+ }
336
+
337
+
338
+ //getAndVerifyAppTokenUser
339
+ let getAndVerifyAppTokenUser = async (token, caller = '') => {
340
+
341
+ //getTokenUser
342
+ let userSelf = await getTokenUser(token)
343
+
344
+ //verifyAppUser
345
+ let b = verifyAppUser(userSelf, caller)
288
346
  if (ispm(b)) {
289
347
  b = await b
290
348
  }
@@ -292,6 +350,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
292
350
  //check
293
351
  if (!b) {
294
352
  console.log('userSelf', userSelf)
353
+ console.log(`user does not have permission`)
295
354
  return Promise.reject(`user does not have permission`)
296
355
  }
297
356
 
@@ -308,6 +367,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
308
367
 
309
368
  //parsePayload
310
369
  let parsePayload = async (req) => {
370
+
371
+ //inp
311
372
  let inp = get(req, 'payload')
312
373
 
313
374
  //to obj
@@ -318,6 +379,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
318
379
  //check
319
380
  if (!iseobj(inp)) {
320
381
  console.log('inp', inp)
382
+ console.log(`invalid inp from req`)
321
383
  return Promise.reject(`invalid inp from req`)
322
384
  }
323
385
 
@@ -328,6 +390,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
328
390
  if (!isestr(group)) {
329
391
  console.log('inp', inp)
330
392
  console.log('group', group)
393
+ console.log(`invalid group from inp`)
331
394
  return Promise.reject(`invalid group from inp`)
332
395
  }
333
396
 
@@ -338,6 +401,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
338
401
  if (!isearr(apis)) {
339
402
  console.log('inp', inp)
340
403
  console.log('apis', apis)
404
+ console.log(`invalid apis from inp`)
341
405
  return Promise.reject(`invalid apis from inp`)
342
406
  }
343
407
 
@@ -396,6 +460,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
396
460
  if (!isestr(group)) {
397
461
  console.log('params', params)
398
462
  console.log('group', group)
463
+ console.log(`invalid group`)
399
464
  return Promise.reject(`invalid group`)
400
465
  }
401
466
 
@@ -407,6 +472,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
407
472
  if (!isearr(apis)) {
408
473
  console.log('params', params)
409
474
  console.log('apis', apis)
475
+ console.log(`invalid apis`)
410
476
  return Promise.reject(`invalid apis`)
411
477
  }
412
478
 
@@ -434,9 +500,18 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
434
500
  let fnEntryOut = 'index.html'
435
501
  try {
436
502
  let fpEntryIn = path.resolve(pathStaticFiles, fnEntryIn)
503
+ if (!fsIsFile(fpEntryIn)) {
504
+ fpEntryIn = path.resolve(pathStaticFiles, fnEntryOut) //本機開發另使用html替代tmp
505
+ }
506
+ if (!fsIsFile(fpEntryIn)) {
507
+ console.log('fpEntryIn', fpEntryIn)
508
+ throw new Error(`invalid fpEntryIn`)
509
+ }
437
510
  let fpEntryOut = path.resolve(pathStaticFiles, fnEntryOut)
438
511
  let c = fs.readFileSync(fpEntryIn, 'utf8')
512
+ c = replace(c, '/mapi/', '{sfd}/') //方法同genEntry
439
513
  c = replace(c, '{sfd}', subfolder)
514
+ c = replace(c, '{urlRedirect}', urlRedirect)
440
515
  fs.writeFileSync(fpEntryOut, c, 'utf8')
441
516
  }
442
517
  catch (err) {
@@ -476,13 +551,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
476
551
  //token
477
552
  let token = get(req, 'query.token', '')
478
553
 
479
- //getTokenUserForSelf
480
- let user = await getTokenUserForSelf(token)
554
+ //getAndVerifyBrowserTokenUser
555
+ let user = await getAndVerifyBrowserTokenUser(token, 'getUserByToken')
481
556
 
482
557
  //check
483
558
  if (!iseobj(user)) {
484
559
  console.log('token', token)
485
560
  console.log('[API]getUserByToken/check user: invalid user')
561
+ console.log(`token does not have permission`)
486
562
  return Promise.reject(`token does not have permission`)
487
563
  }
488
564
 
@@ -507,13 +583,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
507
583
  //token
508
584
  let token = get(req, 'query.token', '')
509
585
 
510
- //getTokenUserForSelf
511
- let user = await getTokenUserForSelf(token)
586
+ //getAndVerifyBrowserTokenUser
587
+ let user = await getAndVerifyBrowserTokenUser(token, 'getAPIsList')
512
588
 
513
589
  //check
514
590
  if (!iseobj(user)) {
515
591
  console.log('token', token)
516
592
  console.log('[API]getAPIsList/check user: invalid user')
593
+ console.log(`token does not have permission`)
517
594
  return Promise.reject(`token does not have permission`)
518
595
  }
519
596
 
@@ -542,13 +619,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
542
619
  //token
543
620
  let token = get(req, 'query.token', '')
544
621
 
545
- //getTokenUserForSelf
546
- let user = await getTokenUserForSelf(token)
622
+ //getAndVerifyBrowserTokenUser
623
+ let user = await getAndVerifyBrowserTokenUser(token, 'updateAPIs')
547
624
 
548
625
  //check
549
626
  if (!iseobj(user)) {
550
627
  console.log('token', token)
551
628
  console.log('[API]updateAPIs/check user: invalid user')
629
+ console.log(`token does not have permission`)
552
630
  return Promise.reject(`token does not have permission`)
553
631
  }
554
632
 
@@ -580,13 +658,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
580
658
  //token
581
659
  let token = get(req, 'query.token', '')
582
660
 
583
- //getTokenUserForSelf
584
- let user = await getTokenUserForSelf(token)
661
+ //getAndVerifyAppTokenUser
662
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceApis')
585
663
 
586
664
  //check
587
665
  if (!iseobj(user)) {
588
666
  console.log('token', token)
589
667
  console.log('[API]syncAndReplaceApis/check user: invalid user')
668
+ console.log(`token does not have permission`)
590
669
  return Promise.reject(`token does not have permission`)
591
670
  }
592
671
 
@@ -663,7 +742,7 @@ export default WWebApi
663
742
  <br class="clear">
664
743
 
665
744
  <footer>
666
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 11:10:20 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
745
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 12:07:15 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
667
746
  </footer>
668
747
 
669
748
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -71,7 +71,7 @@
71
71
  <br class="clear">
72
72
 
73
73
  <footer>
74
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 11:10:20 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 12:07:15 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-web-api",
3
- "version": "1.0.29",
3
+ "version": "1.0.31",
4
4
  "main": "dist/w-web-api.umd.js",
5
5
  "dependencies": {
6
6
  "@mdi/js": "^7.2.96",
@@ -11,7 +11,7 @@
11
11
  "w-data-collector": "^1.0.19",
12
12
  "w-serv-hapi": "^1.0.11",
13
13
  "w-serv-orm": "^1.0.7",
14
- "w-ui-loginout": "^1.0.4",
14
+ "w-ui-loginout": "^1.0.5",
15
15
  "wsemi": "^1.7.38"
16
16
  },
17
17
  "devDependencies": {
package/public/index.html CHANGED
@@ -12,6 +12,13 @@
12
12
  <!-- fontawesome -->
13
13
  <link href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.2/css/all.min.css" rel="stylesheet">
14
14
 
15
+ <!-- ___pmwapi___ -->
16
+ <script>
17
+ window.___pmwapi___={
18
+ urlRedirect: '{urlRedirect}',
19
+ }
20
+ </script>
21
+
15
22
  </head>
16
23
  <body style="font-family:'Microsoft JhengHei','Avenir','Helvetica', 'Arial', 'sans-serif'; padding:0px; margin:0px;">
17
24
  <noscript>