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/README.md +16 -5
- package/dist/index.tmp +3 -1
- package/dist/js/app-legacy.9b4e9f9b.js +2 -0
- package/dist/js/app-legacy.9b4e9f9b.js.map +1 -0
- package/dist/js/app.9b4e9f9b.js +2 -0
- package/dist/js/app.9b4e9f9b.js.map +1 -0
- package/dist/js/{chunk-vendors.c0c4267e.js → chunk-vendors-legacy.7033510d.js} +2 -2
- package/dist/js/chunk-vendors-legacy.7033510d.js.map +1 -0
- package/dist/js/{chunk-vendors-legacy.c0c4267e.js → chunk-vendors.7033510d.js} +2 -2
- package/dist/js/chunk-vendors.7033510d.js.map +1 -0
- package/dist/w-web-api.umd.js +2 -2
- package/dist/w-web-api.umd.js.map +1 -1
- package/docs/WWebApi.html +82 -6
- package/docs/WWebApi.mjs.html +106 -27
- package/docs/index.html +1 -1
- package/package.json +2 -2
- package/public/index.html +7 -0
- package/server/WWebApi.mjs +105 -26
- package/src/App.vue +17 -2
- package/src/store/mutations.mjs +6 -13
- package/srv.mjs +15 -5
- package/tableTags-web-api.json +1 -1
- package/dist/js/app-legacy.86198344.js +0 -2
- package/dist/js/app-legacy.86198344.js.map +0 -1
- package/dist/js/app.86198344.js +0 -2
- package/dist/js/app.86198344.js.map +0 -1
- package/dist/js/chunk-vendors-legacy.c0c4267e.js.map +0 -1
- package/dist/js/chunk-vendors.c0c4267e.js.map +0 -1
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,
|
|
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"> → {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#
|
|
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>
|
|
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
|
|
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
|
+
<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
|
|
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>
|
package/docs/WWebApi.mjs.html
CHANGED
|
@@ -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}
|
|
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: '
|
|
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
|
|
150
|
-
* console.log('
|
|
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,
|
|
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,
|
|
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
|
|
195
|
-
if (!isfun(
|
|
196
|
-
console.log('invalid
|
|
197
|
-
throw new Error('invalid
|
|
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
|
-
//
|
|
272
|
-
let
|
|
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(`
|
|
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
|
-
|
|
287
|
-
|
|
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
|
-
//
|
|
480
|
-
let user = await
|
|
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
|
-
//
|
|
511
|
-
let user = await
|
|
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
|
-
//
|
|
546
|
-
let user = await
|
|
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
|
-
//
|
|
584
|
-
let user = await
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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>
|