w-web-api 1.0.0
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/.editorconfig +9 -0
- package/.eslintignore +3 -0
- package/.eslintrc.js +54 -0
- package/.jsdoc +25 -0
- package/LICENSE +21 -0
- package/README.md +62 -0
- package/SECURITY.md +5 -0
- package/babel.config.js +14 -0
- package/dist/w-web-api.umd.js +7 -0
- package/dist/w-web-api.umd.js.map +1 -0
- package/docs/WWebApi.html +551 -0
- package/docs/WWebApi.mjs.html +335 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/docs/index.html +81 -0
- package/docs/scripts/collapse.js +20 -0
- package/docs/scripts/linenumber.js +25 -0
- package/docs/scripts/nav.js +12 -0
- package/docs/scripts/polyfill.js +4 -0
- package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/docs/scripts/prettify/lang-css.js +2 -0
- package/docs/scripts/prettify/prettify.js +28 -0
- package/docs/scripts/search.js +83 -0
- package/docs/styles/jsdoc.css +765 -0
- package/docs/styles/prettify.css +79 -0
- package/package.json +81 -0
- package/public/connecting.svg +10 -0
- package/public/deny.png +0 -0
- package/public/disconnect.png +0 -0
- package/public/index.html +23 -0
- package/public/logout.png +0 -0
- package/server/WWebApi.mjs +283 -0
- package/server/getSettings.mjs +17 -0
- package/server/mDb.mjs +76 -0
- package/server/mInitialTestData.mjs +40 -0
- package/server/mOrm.mjs +22 -0
- package/src/App.vue +91 -0
- package/src/components/Layout.vue +131 -0
- package/src/components/LayoutContent.vue +67 -0
- package/src/components/LayoutContentList.vue +573 -0
- package/src/components/MdPanel.vue +152 -0
- package/src/main.js +98 -0
- package/src/plugins/mDataSelectorSchema.mjs +30 -0
- package/src/plugins/mDataSupport.mjs +78 -0
- package/src/plugins/mShare.mjs +235 -0
- package/src/plugins/mUI.mjs +141 -0
- package/src/plugins/mVuetify.mjs +12 -0
- package/src/schema/gi.mjs +8 -0
- package/src/schema/index.mjs +16 -0
- package/src/schema/tables/apis.mjs +918 -0
- package/src/store/actions.mjs +1 -0
- package/src/store/getters.mjs +1 -0
- package/src/store/index.mjs +25 -0
- package/src/store/mutations.mjs +185 -0
- package/src/store/types.mjs +14 -0
- package/srv.mjs +33 -0
- package/tableTags.json +1 -0
- package/toolg/addVersion.mjs +4 -0
- package/toolg/cleanFolder.mjs +4 -0
- package/toolg/gDistRollup.mjs +34 -0
- package/toolg/modifyReadme.mjs +4 -0
- package/vue.config.js +15 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>WWebApi.mjs - 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
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
18
|
+
</head>
|
|
19
|
+
<body>
|
|
20
|
+
|
|
21
|
+
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
|
|
22
|
+
<label for="nav-trigger" class="navicon-button x">
|
|
23
|
+
<div class="navicon"></div>
|
|
24
|
+
</label>
|
|
25
|
+
|
|
26
|
+
<label for="nav-trigger" class="overlay"></label>
|
|
27
|
+
|
|
28
|
+
<nav >
|
|
29
|
+
|
|
30
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WWebApi.html">WWebApi</a></li></ul>
|
|
31
|
+
</nav>
|
|
32
|
+
|
|
33
|
+
<div id="main">
|
|
34
|
+
|
|
35
|
+
<h1 class="page-title">WWebApi.mjs</h1>
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
<section>
|
|
44
|
+
<article>
|
|
45
|
+
<pre class="prettyprint source linenums"><code>import get from 'lodash/get'
|
|
46
|
+
import map from 'lodash/map'
|
|
47
|
+
import keys from 'lodash/keys'
|
|
48
|
+
import cloneDeep from 'lodash/cloneDeep'
|
|
49
|
+
import j2o from 'wsemi/src/j2o.mjs'
|
|
50
|
+
import iseobj from 'wsemi/src/iseobj'
|
|
51
|
+
import isestr from 'wsemi/src/isestr'
|
|
52
|
+
import ispint from 'wsemi/src/ispint'
|
|
53
|
+
import fsIsFolder from 'wsemi/src/fsIsFolder'
|
|
54
|
+
import cint from 'wsemi/src/cint'
|
|
55
|
+
import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
|
|
56
|
+
import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs'
|
|
57
|
+
import ds from '../src/schema/index.mjs'
|
|
58
|
+
import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 基於hapi之API伺服器
|
|
63
|
+
*
|
|
64
|
+
* @class
|
|
65
|
+
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
66
|
+
* @param {String} [opt.url=''] 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
|
|
67
|
+
* @param {String} [opt.db=''] 輸入資料庫名稱字串,預設''
|
|
68
|
+
* @param {Integer} [opt.serverPort=8080] 輸入伺服器通訊port,預設8080
|
|
69
|
+
* @param {Function} [opt.getUserById=null] 輸入當bCheckUser=true時依照使用者ID取得使用者資訊物件函數,預設null
|
|
70
|
+
* @param {Boolean} [opt.bCheckUser=true] 輸入是否檢查使用者資訊布林值,預設true
|
|
71
|
+
* @param {Boolean} [opt.bExcludeWhenNotAdmin=true] 輸入使用ORM的select方法時是否自動刪除數據內isActive欄位之布林值,預設true
|
|
72
|
+
* @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
|
|
73
|
+
* @example
|
|
74
|
+
*
|
|
75
|
+
|
|
76
|
+
*
|
|
77
|
+
*/
|
|
78
|
+
async function WWebApi(st = {}) {
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
//url
|
|
82
|
+
let url = get(st, 'url')
|
|
83
|
+
if (!isestr(url)) {
|
|
84
|
+
console.log('invalid url', url)
|
|
85
|
+
throw new Error('invalid url')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
//db
|
|
90
|
+
let db = get(st, 'db')
|
|
91
|
+
if (!isestr(db)) {
|
|
92
|
+
console.log('invalid db', db)
|
|
93
|
+
throw new Error('invalid db')
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
//serverPort
|
|
98
|
+
let serverPort = get(st, 'serverPort')
|
|
99
|
+
if (!ispint(serverPort)) {
|
|
100
|
+
console.log('invalid serverPort', serverPort)
|
|
101
|
+
throw new Error('invalid serverPort')
|
|
102
|
+
}
|
|
103
|
+
serverPort = cint(serverPort)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
//WServOrm
|
|
107
|
+
let opt = {
|
|
108
|
+
// url: `mongodb://${st.dbUsername}:${st.dbPassword}@${st.dbIP}:${st.dbPort}`,
|
|
109
|
+
// db: st.dbName,
|
|
110
|
+
// getUserById: null,
|
|
111
|
+
// bCheckUser: false,
|
|
112
|
+
// bExcludeWhenNotAdmin: false,
|
|
113
|
+
url,
|
|
114
|
+
db,
|
|
115
|
+
getUserById: get(st, 'getUserById', null),
|
|
116
|
+
bCheckUser: get(st, 'bCheckUser', false),
|
|
117
|
+
bExcludeWhenNotAdmin: get(st, 'bExcludeWhenNotAdmin', false),
|
|
118
|
+
}
|
|
119
|
+
let wp = {}
|
|
120
|
+
try {
|
|
121
|
+
wp = WServOrm(ds, WOrm, opt)
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
console.log(err)
|
|
125
|
+
}
|
|
126
|
+
let { woItems, procOrm } = wp
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
//getWebInfor
|
|
130
|
+
let getWebInfor = (userId) => {
|
|
131
|
+
return {
|
|
132
|
+
webName: get(st, 'webName', {})
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
//getAPIsList
|
|
138
|
+
let getAPIsList = async (userId, token) => {
|
|
139
|
+
let rs = await woItems.apis.select()
|
|
140
|
+
return rs
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
//parsePayload
|
|
145
|
+
let parsePayload = (req) => {
|
|
146
|
+
let inp = get(req, 'payload')
|
|
147
|
+
if (isestr(inp)) {
|
|
148
|
+
inp = j2o(inp)
|
|
149
|
+
}
|
|
150
|
+
if (!iseobj(inp)) {
|
|
151
|
+
inp = null
|
|
152
|
+
}
|
|
153
|
+
return inp
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
//updateAPIs
|
|
158
|
+
let updateAPIs = async (userId, params = {}) => {
|
|
159
|
+
|
|
160
|
+
//spread params
|
|
161
|
+
let { apis: rsApis } = params
|
|
162
|
+
// console.log('levels', levels)
|
|
163
|
+
// console.log('rsApis', rsApis)
|
|
164
|
+
|
|
165
|
+
//save
|
|
166
|
+
let r = await woItems.apis.save(rsApis)
|
|
167
|
+
|
|
168
|
+
return r
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
//replaceAPIsByLevels
|
|
173
|
+
let replaceAPIsByLevels = async (userId, params = {}) => {
|
|
174
|
+
|
|
175
|
+
//spread params
|
|
176
|
+
let { levels, apis: rsApis } = params
|
|
177
|
+
// console.log('levels', levels)
|
|
178
|
+
// console.log('rsApis', rsApis)
|
|
179
|
+
|
|
180
|
+
//delAll levels
|
|
181
|
+
await woItems.apis.delAll({ levels })
|
|
182
|
+
|
|
183
|
+
//rsApisTemp
|
|
184
|
+
let rsApisTemp = cloneDeep(rsApis)
|
|
185
|
+
rsApisTemp = map(rsApisTemp, (v) => {
|
|
186
|
+
v.levels = levels
|
|
187
|
+
return v
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
//insert
|
|
191
|
+
let r = await woItems.apis.insert(rsApisTemp)
|
|
192
|
+
|
|
193
|
+
return r
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
//pathStaticFiles
|
|
198
|
+
let pathStaticFiles = 'dist'
|
|
199
|
+
let npmPathStaticFiles = './node_modules/w-web-api/dist'
|
|
200
|
+
if (fsIsFolder(npmPathStaticFiles)) {
|
|
201
|
+
pathStaticFiles = npmPathStaticFiles
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
//apis
|
|
206
|
+
let apis = [
|
|
207
|
+
// {
|
|
208
|
+
// method: 'GET',
|
|
209
|
+
// path: '/api/someAPI',
|
|
210
|
+
// handler: async function (req, res) {
|
|
211
|
+
|
|
212
|
+
// // //token
|
|
213
|
+
// // let token = get(req, 'query.token', '')
|
|
214
|
+
|
|
215
|
+
// return 'someAPI'
|
|
216
|
+
// },
|
|
217
|
+
// },
|
|
218
|
+
{
|
|
219
|
+
method: 'GET',
|
|
220
|
+
path: '/getWebInfor',
|
|
221
|
+
handler: async function (req, res) {
|
|
222
|
+
return getWebInfor()
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
method: 'GET',
|
|
227
|
+
path: '/getAPIsList',
|
|
228
|
+
handler: async function (req, res) {
|
|
229
|
+
|
|
230
|
+
//token
|
|
231
|
+
let token = get(req, 'query.token', '')
|
|
232
|
+
|
|
233
|
+
//getAPIsList
|
|
234
|
+
let r = await getAPIsList('', token)
|
|
235
|
+
|
|
236
|
+
return r
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
method: 'POST',
|
|
241
|
+
path: '/updateAPIs',
|
|
242
|
+
handler: async function (req, res) {
|
|
243
|
+
// console.log(req, res)
|
|
244
|
+
// console.log('payload', req.payload)
|
|
245
|
+
|
|
246
|
+
//parsePayload
|
|
247
|
+
let inp = parsePayload(req)
|
|
248
|
+
|
|
249
|
+
//updateAPIs
|
|
250
|
+
let r = await updateAPIs('', inp)
|
|
251
|
+
|
|
252
|
+
return r
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
method: 'POST',
|
|
257
|
+
path: '/replaceAPIsByLevels',
|
|
258
|
+
handler: async function (req, res) {
|
|
259
|
+
// console.log(req, res)
|
|
260
|
+
// console.log('payload', req.payload)
|
|
261
|
+
|
|
262
|
+
//parsePayload
|
|
263
|
+
let inp = parsePayload(req)
|
|
264
|
+
|
|
265
|
+
//replaceAPIsByLevels
|
|
266
|
+
let r = await replaceAPIsByLevels('', inp)
|
|
267
|
+
|
|
268
|
+
return r
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
]
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
//tableNamesExec, tableNamesSync
|
|
275
|
+
let tableNamesExec = keys(ds)
|
|
276
|
+
// let tableNamesSync = filter(tableNamesExec, (v) => {
|
|
277
|
+
// return strright(v, 5) !== 'Items'//不同步數據
|
|
278
|
+
// })
|
|
279
|
+
let tableNamesSync = tableNamesExec
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
//WServHapiServer
|
|
283
|
+
let wshs = WServHapiServer({
|
|
284
|
+
port: st.serverPort,
|
|
285
|
+
pathStaticFiles,
|
|
286
|
+
apis,
|
|
287
|
+
getUserIDFromToken: async (token) => { //可使用async或sync函數
|
|
288
|
+
return 'id-for-admin'
|
|
289
|
+
},
|
|
290
|
+
useDbORM: true,
|
|
291
|
+
dbORMs: woItems,
|
|
292
|
+
operORM: procOrm, //procOrm的輸入為: userId, tableName, methodName, input
|
|
293
|
+
tableNamesExec,
|
|
294
|
+
methodsExec: ['select', 'insert', 'save', 'del'], //mix需於procOrm內註冊以提供
|
|
295
|
+
tableNamesSync,
|
|
296
|
+
extFuncs: { //接收參數第1個為userId, 之後才是前端給予參數
|
|
297
|
+
getWebInfor,
|
|
298
|
+
getAPIsList,
|
|
299
|
+
//...
|
|
300
|
+
},
|
|
301
|
+
hookBefores: null,
|
|
302
|
+
hookAfters: null,
|
|
303
|
+
})
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
return wshs
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
export default WWebApi
|
|
311
|
+
</code></pre>
|
|
312
|
+
</article>
|
|
313
|
+
</section>
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
</div>
|
|
321
|
+
|
|
322
|
+
<br class="clear">
|
|
323
|
+
|
|
324
|
+
<footer>
|
|
325
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.10</a> on Thu Apr 14 2022 12:34:37 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
326
|
+
</footer>
|
|
327
|
+
|
|
328
|
+
<script>prettyPrint();</script>
|
|
329
|
+
<script src="scripts/polyfill.js"></script>
|
|
330
|
+
<script src="scripts/linenumber.js"></script>
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
</body>
|
|
335
|
+
</html>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|