@vtecx/vtecxnext 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/README.md +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +17 -0
- package/dist/vtecxnext.d.ts +470 -0
- package/dist/vtecxnext.js +1632 -0
- package/package.json +33 -0
|
@@ -0,0 +1,1632 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setMessageQueue = exports.setMessageQueueStatus = exports.pushNotification = exports.sendMail = exports.checkSignature = exports.deleteSignature = exports.putSignatures = exports.putSignature = exports.toPdf = exports.getBQCsv = exports.getBQ = exports.deleteBQ = exports.postBQ = exports.getPage = exports.pagination = exports.getSessionLong = exports.getSessionString = exports.getSessionEntry = exports.getSessionFeed = exports.deleteSessionLong = exports.deleteSessionString = exports.deleteSessionEntry = exports.deleteSessionFeed = exports.incrementSession = exports.setSessionLong = exports.setSessionString = exports.setSessionEntry = exports.setSessionFeed = exports.getRangeids = exports.rangeids = exports.setids = exports.getids = exports.addids = exports.allocids = exports.deleteFolder = exports.deleteEntry = exports.put = exports.post = exports.count = exports.getFeed = exports.getEntry = exports.log = exports.isLoggedin = exports.whoami = exports.uid = exports.logout = exports.login = exports.sendMessage = exports.checkXRequestedWith = exports.hello = void 0;
|
|
4
|
+
exports.VtecxNextError = exports.leaveGroup = exports.joinGroup = exports.getMessageQueue = void 0;
|
|
5
|
+
var SqlString = require('sqlstring');
|
|
6
|
+
/**
|
|
7
|
+
* Hello world.
|
|
8
|
+
*/
|
|
9
|
+
const hello = () => {
|
|
10
|
+
console.log('Hello vtecxnext.');
|
|
11
|
+
};
|
|
12
|
+
exports.hello = hello;
|
|
13
|
+
/**
|
|
14
|
+
* X-Requested-With header check.
|
|
15
|
+
* If not specified, set status 417 to the response.
|
|
16
|
+
* @param req request
|
|
17
|
+
* @param res response
|
|
18
|
+
* @return false if no X-Requested-With header is specified
|
|
19
|
+
*/
|
|
20
|
+
const checkXRequestedWith = (req, res) => {
|
|
21
|
+
if (!req.headers['x-requested-with']) {
|
|
22
|
+
res.writeHead(417);
|
|
23
|
+
res.end();
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
};
|
|
28
|
+
exports.checkXRequestedWith = checkXRequestedWith;
|
|
29
|
+
/**
|
|
30
|
+
* Sends an feed response(including message) to the client using the specified status.
|
|
31
|
+
* @param res response
|
|
32
|
+
* @param statusCode status code
|
|
33
|
+
* @param message message
|
|
34
|
+
* @return true
|
|
35
|
+
*/
|
|
36
|
+
const sendMessage = (res, statusCode, message) => {
|
|
37
|
+
const resJson = { 'feed': { 'title': message } };
|
|
38
|
+
res.writeHead(statusCode);
|
|
39
|
+
res.end(JSON.stringify(resJson));
|
|
40
|
+
return true;
|
|
41
|
+
};
|
|
42
|
+
exports.sendMessage = sendMessage;
|
|
43
|
+
/**
|
|
44
|
+
* login.
|
|
45
|
+
* Request authentication with WSSE.
|
|
46
|
+
* If the login is successful, sets the authentication information in a cookie.
|
|
47
|
+
* @param req request
|
|
48
|
+
* @param res response
|
|
49
|
+
* @param wsse WSSE
|
|
50
|
+
* @param reCaptchaToken reCAPTCHA token
|
|
51
|
+
* @return true if log in has been successful.
|
|
52
|
+
*/
|
|
53
|
+
const login = async (req, res, wsse, reCaptchaToken) => {
|
|
54
|
+
//console.log('[vtecxnext login] start.')
|
|
55
|
+
// 入力チェック
|
|
56
|
+
checkNotNull(wsse, 'Authentication information');
|
|
57
|
+
// ログイン
|
|
58
|
+
// reCAPTCHA tokenは任意
|
|
59
|
+
const param = reCaptchaToken ? `&g-recaptcha-token=${reCaptchaToken}` : '';
|
|
60
|
+
const method = 'GET';
|
|
61
|
+
const url = `/d/?_login${param}`;
|
|
62
|
+
const headers = { 'X-WSSE': `${wsse}` };
|
|
63
|
+
const response = await fetchVtecx(method, url, headers);
|
|
64
|
+
const feed = await response.json();
|
|
65
|
+
// vte.cxからのset-cookieを転記
|
|
66
|
+
setCookie(response, res);
|
|
67
|
+
// レスポンスのエラーチェック
|
|
68
|
+
let isLoggedin;
|
|
69
|
+
if (response.status < 400) {
|
|
70
|
+
isLoggedin = true;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
isLoggedin = false;
|
|
74
|
+
}
|
|
75
|
+
//console.log(`[vtecxnext login] end. status=${response.status} message=${feed.title}`)
|
|
76
|
+
return isLoggedin;
|
|
77
|
+
};
|
|
78
|
+
exports.login = login;
|
|
79
|
+
/**
|
|
80
|
+
* logout.
|
|
81
|
+
* If the logout is successful, delete the authentication information in a cookie.
|
|
82
|
+
* @param req request
|
|
83
|
+
* @param res response
|
|
84
|
+
* @return true if log out has been successful.
|
|
85
|
+
*/
|
|
86
|
+
const logout = async (req, res) => {
|
|
87
|
+
//console.log('[vtecxnext logout] start.')
|
|
88
|
+
// vte.cxへリクエスト
|
|
89
|
+
const method = 'GET';
|
|
90
|
+
const url = '/d/?_logout';
|
|
91
|
+
const response = await requestVtecx(method, url, req);
|
|
92
|
+
//console.log(`[vtecxnext logout] response=${response}`)
|
|
93
|
+
// vte.cxからのset-cookieを転記
|
|
94
|
+
setCookie(response, res);
|
|
95
|
+
// レスポンスのエラーチェック
|
|
96
|
+
await checkVtecxResponse(response);
|
|
97
|
+
//console.log(`[vtecxnext logout] checkVtecxResponse ok.`)
|
|
98
|
+
// 戻り値
|
|
99
|
+
const data = await getJson(response);
|
|
100
|
+
//console.log(`[vtecxnext logout] response message : ${data.feed.title}`)
|
|
101
|
+
return true;
|
|
102
|
+
};
|
|
103
|
+
exports.logout = logout;
|
|
104
|
+
/**
|
|
105
|
+
* get login uid
|
|
106
|
+
* @param req request
|
|
107
|
+
* @param res response
|
|
108
|
+
* @return uid
|
|
109
|
+
*/
|
|
110
|
+
const uid = async (req, res) => {
|
|
111
|
+
//console.log('[vtecxnext uid] start.')
|
|
112
|
+
// vte.cxへリクエスト
|
|
113
|
+
const method = 'GET';
|
|
114
|
+
const url = '/d/?_uid';
|
|
115
|
+
const response = await requestVtecx(method, url, req);
|
|
116
|
+
//console.log(`[vtecxnext uid] response=${response}`)
|
|
117
|
+
// vte.cxからのset-cookieを転記
|
|
118
|
+
setCookie(response, res);
|
|
119
|
+
// レスポンスのエラーチェック
|
|
120
|
+
await checkVtecxResponse(response);
|
|
121
|
+
// 戻り値
|
|
122
|
+
const data = await getJson(response);
|
|
123
|
+
return data.feed.title;
|
|
124
|
+
};
|
|
125
|
+
exports.uid = uid;
|
|
126
|
+
/**
|
|
127
|
+
* get login whoami
|
|
128
|
+
* @param req request (for authentication)
|
|
129
|
+
* @param res response (for authentication)
|
|
130
|
+
* @return login user information
|
|
131
|
+
*/
|
|
132
|
+
const whoami = async (req, res) => {
|
|
133
|
+
//console.log('[vtecxnext whoami] start.')
|
|
134
|
+
// vte.cxへリクエスト
|
|
135
|
+
const method = 'GET';
|
|
136
|
+
const url = '/d/?_whoami';
|
|
137
|
+
const response = await requestVtecx(method, url, req);
|
|
138
|
+
//console.log(`[vtecxnext whoami] response=${response}`)
|
|
139
|
+
// vte.cxからのset-cookieを転記
|
|
140
|
+
setCookie(response, res);
|
|
141
|
+
// レスポンスのエラーチェック
|
|
142
|
+
await checkVtecxResponse(response);
|
|
143
|
+
// 戻り値
|
|
144
|
+
return await getJson(response);
|
|
145
|
+
};
|
|
146
|
+
exports.whoami = whoami;
|
|
147
|
+
/**
|
|
148
|
+
* whether you are logged in
|
|
149
|
+
* @param req request (for authentication)
|
|
150
|
+
* @param res response (for authentication)
|
|
151
|
+
* @return true if logged in
|
|
152
|
+
*/
|
|
153
|
+
const isLoggedin = async (req, res) => {
|
|
154
|
+
//console.log('[vtecxnext isLoggedin] start.')
|
|
155
|
+
try {
|
|
156
|
+
await (0, exports.uid)(req, res);
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
exports.isLoggedin = isLoggedin;
|
|
164
|
+
/**
|
|
165
|
+
* register a log entry
|
|
166
|
+
* @param req request (for authentication)
|
|
167
|
+
* @param res response (for authentication)
|
|
168
|
+
* @param message message
|
|
169
|
+
* @param title title
|
|
170
|
+
* @param subtitle subtitle
|
|
171
|
+
* @return true if successful
|
|
172
|
+
*/
|
|
173
|
+
const log = async (req, res, message, title, subtitle) => {
|
|
174
|
+
const logTitle = title ? title : 'JavaScript';
|
|
175
|
+
const logSubtitle = subtitle ? subtitle : 'INFO';
|
|
176
|
+
const feed = [{ 'title': logTitle, 'subtitle': logSubtitle, 'summary': message }];
|
|
177
|
+
const method = 'POST';
|
|
178
|
+
const url = `/p/?_log`;
|
|
179
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
180
|
+
//console.log(`[vtecxnext log] response. status=${response.status}`)
|
|
181
|
+
// vte.cxからのset-cookieを転記
|
|
182
|
+
setCookie(response, res);
|
|
183
|
+
// レスポンスのエラーチェック
|
|
184
|
+
await checkVtecxResponse(response);
|
|
185
|
+
// 正常処理
|
|
186
|
+
return true;
|
|
187
|
+
};
|
|
188
|
+
exports.log = log;
|
|
189
|
+
/**
|
|
190
|
+
* get entry
|
|
191
|
+
* @param req request (for authentication)
|
|
192
|
+
* @param res response (for authentication)
|
|
193
|
+
* @param uri key
|
|
194
|
+
* @return entry
|
|
195
|
+
*/
|
|
196
|
+
const getEntry = async (req, res, uri) => {
|
|
197
|
+
//console.log('[vtecxnext getEntry] start.')
|
|
198
|
+
// キー入力値チェック
|
|
199
|
+
checkUri(uri);
|
|
200
|
+
// vte.cxへリクエスト
|
|
201
|
+
const method = 'GET';
|
|
202
|
+
const url = `/p${uri}?e`;
|
|
203
|
+
const response = await requestVtecx(method, url, req);
|
|
204
|
+
//console.log(`[vtecxnext getEntry] response=${response}`)
|
|
205
|
+
// vte.cxからのset-cookieを転記
|
|
206
|
+
setCookie(response, res);
|
|
207
|
+
// レスポンスのエラーチェック
|
|
208
|
+
await checkVtecxResponse(response);
|
|
209
|
+
// 戻り値
|
|
210
|
+
return await getJson(response);
|
|
211
|
+
};
|
|
212
|
+
exports.getEntry = getEntry;
|
|
213
|
+
/**
|
|
214
|
+
* get entry
|
|
215
|
+
* @param req request (for authentication)
|
|
216
|
+
* @param res response (for authentication)
|
|
217
|
+
* @param uri key and conditions
|
|
218
|
+
* @return feed (entry array)
|
|
219
|
+
*/
|
|
220
|
+
const getFeed = async (req, res, uri) => {
|
|
221
|
+
//console.log('[vtecxnext getFeed] start.')
|
|
222
|
+
// キー入力値チェック
|
|
223
|
+
checkUri(uri);
|
|
224
|
+
// vte.cxへリクエスト
|
|
225
|
+
const method = 'GET';
|
|
226
|
+
const url = `/p${uri}${uri.includes('?') ? '&' : '?'}f`;
|
|
227
|
+
const response = await requestVtecx(method, url, req);
|
|
228
|
+
//console.log(`[vtecxnext getFeed] response=${response}`)
|
|
229
|
+
// vte.cxからのset-cookieを転記
|
|
230
|
+
setCookie(response, res);
|
|
231
|
+
// レスポンスのエラーチェック
|
|
232
|
+
await checkVtecxResponse(response);
|
|
233
|
+
// 戻り値
|
|
234
|
+
return await getJson(response);
|
|
235
|
+
};
|
|
236
|
+
exports.getFeed = getFeed;
|
|
237
|
+
/**
|
|
238
|
+
* get count
|
|
239
|
+
* @param req request (for authentication)
|
|
240
|
+
* @param res response (for authentication)
|
|
241
|
+
* @param uri key and conditions
|
|
242
|
+
* @return count
|
|
243
|
+
*/
|
|
244
|
+
const count = async (req, res, uri) => {
|
|
245
|
+
//console.log('[vtecxnext count] start.')
|
|
246
|
+
// キー入力値チェック
|
|
247
|
+
checkUri(uri);
|
|
248
|
+
// vte.cxへリクエスト
|
|
249
|
+
const method = 'GET';
|
|
250
|
+
const url = `/p${uri}${uri.includes('?') ? '&' : '?'}c`;
|
|
251
|
+
const response = await requestVtecx(method, url, req);
|
|
252
|
+
//console.log(`[vtecxnext count] response=${response}`)
|
|
253
|
+
// vte.cxからのset-cookieを転記
|
|
254
|
+
setCookie(response, res);
|
|
255
|
+
// レスポンスのエラーチェック
|
|
256
|
+
await checkVtecxResponse(response);
|
|
257
|
+
// 戻り値
|
|
258
|
+
const data = await getJson(response);
|
|
259
|
+
return data.feed.title ? Number(data.feed.title) : null;
|
|
260
|
+
};
|
|
261
|
+
exports.count = count;
|
|
262
|
+
/**
|
|
263
|
+
* register entries
|
|
264
|
+
* @param req request (for authentication)
|
|
265
|
+
* @param res response (for authentication)
|
|
266
|
+
* @param feed entries (JSON)
|
|
267
|
+
* @param uri parent key if not specified in entry
|
|
268
|
+
* @return registed entries
|
|
269
|
+
*/
|
|
270
|
+
const post = async (req, res, feed, uri) => {
|
|
271
|
+
//console.log(`[vtecxnext post] start. feed=${feed}`)
|
|
272
|
+
// 入力チェック
|
|
273
|
+
checkNotNull(feed, 'Feed');
|
|
274
|
+
if (uri) {
|
|
275
|
+
// 値の設定がある場合、キー入力値チェック
|
|
276
|
+
checkUri(uri);
|
|
277
|
+
}
|
|
278
|
+
// vte.cxへリクエスト
|
|
279
|
+
const method = 'POST';
|
|
280
|
+
const url = `/p${uri ? uri : '/'}?e`;
|
|
281
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
282
|
+
//console.log(`[vtecxnext post] response. status=${response.status}`)
|
|
283
|
+
// vte.cxからのset-cookieを転記
|
|
284
|
+
setCookie(response, res);
|
|
285
|
+
// レスポンスのエラーチェック
|
|
286
|
+
await checkVtecxResponse(response);
|
|
287
|
+
return await getJson(response);
|
|
288
|
+
};
|
|
289
|
+
exports.post = post;
|
|
290
|
+
/**
|
|
291
|
+
* update entries
|
|
292
|
+
* @param req request (for authentication)
|
|
293
|
+
* @param res response (for authentication)
|
|
294
|
+
* @param feed entries (JSON)
|
|
295
|
+
* @param isbulk Forcibly execute even if it exceeds the upper limit of entries of request feed.
|
|
296
|
+
* @param parallel Execute parallel if this param is true. Valid only if 'isbulk' is true.
|
|
297
|
+
* @param async Execute asynchronous if this param is true. Valid only if 'isbulk' is true.
|
|
298
|
+
* @return updated entries
|
|
299
|
+
*/
|
|
300
|
+
const put = async (req, res, feed, isbulk, parallel, async) => {
|
|
301
|
+
//console.log(`[vtecxnext put] start. feed=${feed}`)
|
|
302
|
+
// 入力チェック
|
|
303
|
+
checkNotNull(feed, 'Feed');
|
|
304
|
+
// vte.cxへリクエスト
|
|
305
|
+
const method = 'PUT';
|
|
306
|
+
let additionalParam = '';
|
|
307
|
+
if (isbulk) {
|
|
308
|
+
additionalParam = (parallel ? '&_bulk' : '&_bulkserial') + (async ? '&_async' : '');
|
|
309
|
+
}
|
|
310
|
+
const url = `/p/?e${additionalParam}`;
|
|
311
|
+
//console.log(`[vtecxnext put] url=${url}`)
|
|
312
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
313
|
+
//console.log(`[vtecxnext put] response. status=${response.status}`)
|
|
314
|
+
// vte.cxからのset-cookieを転記
|
|
315
|
+
setCookie(response, res);
|
|
316
|
+
// レスポンスのエラーチェック
|
|
317
|
+
await checkVtecxResponse(response);
|
|
318
|
+
return await getJson(response);
|
|
319
|
+
};
|
|
320
|
+
exports.put = put;
|
|
321
|
+
/**
|
|
322
|
+
* delete entry
|
|
323
|
+
* @param req request (for authentication)
|
|
324
|
+
* @param res response (for authentication)
|
|
325
|
+
* @param uri key
|
|
326
|
+
* @param revision number of revision
|
|
327
|
+
* @return true if successful
|
|
328
|
+
*/
|
|
329
|
+
const deleteEntry = async (req, res, uri, revision) => {
|
|
330
|
+
//console.log(`[vtecxnext deleteEntry] start. uri=${uri} revision=${revision}`)
|
|
331
|
+
// キー入力値チェック
|
|
332
|
+
checkUri(uri);
|
|
333
|
+
// vte.cxへリクエスト
|
|
334
|
+
const method = 'DELETE';
|
|
335
|
+
const param = revision ? `&r=${revision}` : '';
|
|
336
|
+
const url = `/p${uri}?e${param}`;
|
|
337
|
+
const response = await requestVtecx(method, url, req);
|
|
338
|
+
//console.log(`[vtecxnext deleteEntry] response. status=${response.status}`)
|
|
339
|
+
// vte.cxからのset-cookieを転記
|
|
340
|
+
setCookie(response, res);
|
|
341
|
+
// レスポンスのエラーチェック
|
|
342
|
+
await checkVtecxResponse(response);
|
|
343
|
+
return true;
|
|
344
|
+
};
|
|
345
|
+
exports.deleteEntry = deleteEntry;
|
|
346
|
+
/**
|
|
347
|
+
* delete folder
|
|
348
|
+
* @param req request (for authentication)
|
|
349
|
+
* @param res response (for authentication)
|
|
350
|
+
* @param uri parent key
|
|
351
|
+
* @param async execute async
|
|
352
|
+
* @return true if successful
|
|
353
|
+
*/
|
|
354
|
+
const deleteFolder = async (req, res, uri, async) => {
|
|
355
|
+
//console.log(`[vtecxnext deleteFolder] start. uri=${uri} async=${async}`)
|
|
356
|
+
// キー入力値チェック
|
|
357
|
+
checkUri(uri);
|
|
358
|
+
// vte.cxへリクエスト
|
|
359
|
+
const method = 'DELETE';
|
|
360
|
+
const url = `/p${uri}?_rf${async ? '&_async' : ''}`;
|
|
361
|
+
const response = await requestVtecx(method, url, req);
|
|
362
|
+
//console.log(`[vtecxnext deleteFolder] response. status=${response.status}`)
|
|
363
|
+
// vte.cxからのset-cookieを転記
|
|
364
|
+
setCookie(response, res);
|
|
365
|
+
// レスポンスのエラーチェック
|
|
366
|
+
await checkVtecxResponse(response);
|
|
367
|
+
return true;
|
|
368
|
+
};
|
|
369
|
+
exports.deleteFolder = deleteFolder;
|
|
370
|
+
/**
|
|
371
|
+
* allocate numbers
|
|
372
|
+
* @param req request (for authentication)
|
|
373
|
+
* @param res response (for authentication)
|
|
374
|
+
* @param uri key
|
|
375
|
+
* @param num number to allocate
|
|
376
|
+
* @return allocated numbers. comma separated if multiple.
|
|
377
|
+
*/
|
|
378
|
+
const allocids = async (req, res, uri, num) => {
|
|
379
|
+
//console.log('[vtecxnext allocids] start.')
|
|
380
|
+
// キー入力値チェック
|
|
381
|
+
checkUri(uri);
|
|
382
|
+
checkNotNull(num, 'number to allocate');
|
|
383
|
+
// vte.cxへリクエスト
|
|
384
|
+
const method = 'GET';
|
|
385
|
+
const url = `/p${uri}?_allocids=${num}`;
|
|
386
|
+
const response = await requestVtecx(method, url, req);
|
|
387
|
+
//console.log(`[vtecxnext allocids] response=${response}`)
|
|
388
|
+
// vte.cxからのset-cookieを転記
|
|
389
|
+
setCookie(response, res);
|
|
390
|
+
// レスポンスのエラーチェック
|
|
391
|
+
await checkVtecxResponse(response);
|
|
392
|
+
// 戻り値
|
|
393
|
+
const data = await getJson(response);
|
|
394
|
+
return data.feed.title;
|
|
395
|
+
};
|
|
396
|
+
exports.allocids = allocids;
|
|
397
|
+
/**
|
|
398
|
+
* add a number
|
|
399
|
+
* @param req request (for authentication)
|
|
400
|
+
* @param res response (for authentication)
|
|
401
|
+
* @param uri key
|
|
402
|
+
* @param num number to add
|
|
403
|
+
* @return added number
|
|
404
|
+
*/
|
|
405
|
+
const addids = async (req, res, uri, num) => {
|
|
406
|
+
//console.log('[vtecxnext addids] start.')
|
|
407
|
+
// キー入力値チェック
|
|
408
|
+
checkUri(uri);
|
|
409
|
+
checkNotNull(num, 'number to add');
|
|
410
|
+
// vte.cxへリクエスト
|
|
411
|
+
const method = 'PUT';
|
|
412
|
+
const url = `/p${uri}?_addids=${num}`;
|
|
413
|
+
const response = await requestVtecx(method, url, req);
|
|
414
|
+
//console.log(`[vtecxnext addids] response=${response}`)
|
|
415
|
+
// vte.cxからのset-cookieを転記
|
|
416
|
+
setCookie(response, res);
|
|
417
|
+
// レスポンスのエラーチェック
|
|
418
|
+
await checkVtecxResponse(response);
|
|
419
|
+
// 戻り値
|
|
420
|
+
const data = await getJson(response);
|
|
421
|
+
return data.feed.title ? Number(data.feed.title) : null;
|
|
422
|
+
};
|
|
423
|
+
exports.addids = addids;
|
|
424
|
+
/**
|
|
425
|
+
* get a added number
|
|
426
|
+
* @param req request (for authentication)
|
|
427
|
+
* @param res response (for authentication)
|
|
428
|
+
* @param uri key
|
|
429
|
+
* @return added number
|
|
430
|
+
*/
|
|
431
|
+
const getids = async (req, res, uri) => {
|
|
432
|
+
//console.log('[vtecxnext getids] start.')
|
|
433
|
+
// キー入力値チェック
|
|
434
|
+
checkUri(uri);
|
|
435
|
+
// vte.cxへリクエスト
|
|
436
|
+
const method = 'GET';
|
|
437
|
+
const url = `/p${uri}?_getids`;
|
|
438
|
+
const response = await requestVtecx(method, url, req);
|
|
439
|
+
//console.log(`[vtecxnext getids] response=${response}`)
|
|
440
|
+
// vte.cxからのset-cookieを転記
|
|
441
|
+
setCookie(response, res);
|
|
442
|
+
// レスポンスのエラーチェック
|
|
443
|
+
await checkVtecxResponse(response);
|
|
444
|
+
// 戻り値
|
|
445
|
+
const data = await getJson(response);
|
|
446
|
+
return data.feed.title ? Number(data.feed.title) : null;
|
|
447
|
+
};
|
|
448
|
+
exports.getids = getids;
|
|
449
|
+
/**
|
|
450
|
+
* set a number
|
|
451
|
+
* @param req request (for authentication)
|
|
452
|
+
* @param res response (for authentication)
|
|
453
|
+
* @param uri key
|
|
454
|
+
* @param num number to set
|
|
455
|
+
* @return set number
|
|
456
|
+
*/
|
|
457
|
+
const setids = async (req, res, uri, num) => {
|
|
458
|
+
//console.log('[vtecxnext setids] start.')
|
|
459
|
+
// キー入力値チェック
|
|
460
|
+
checkUri(uri);
|
|
461
|
+
checkNotNull(num, 'number to set');
|
|
462
|
+
// vte.cxへリクエスト
|
|
463
|
+
const method = 'PUT';
|
|
464
|
+
const url = `/p${uri}?_setids=${num}`;
|
|
465
|
+
const response = await requestVtecx(method, url, req);
|
|
466
|
+
//console.log(`[vtecxnext setids] response=${response}`)
|
|
467
|
+
// vte.cxからのset-cookieを転記
|
|
468
|
+
setCookie(response, res);
|
|
469
|
+
// レスポンスのエラーチェック
|
|
470
|
+
await checkVtecxResponse(response);
|
|
471
|
+
// 戻り値
|
|
472
|
+
const data = await getJson(response);
|
|
473
|
+
return data.feed.title ? Number(data.feed.title) : null;
|
|
474
|
+
};
|
|
475
|
+
exports.setids = setids;
|
|
476
|
+
/**
|
|
477
|
+
* set a addition range
|
|
478
|
+
* @param req request (for authentication)
|
|
479
|
+
* @param res response (for authentication)
|
|
480
|
+
* @param uri key
|
|
481
|
+
* @param range addition range
|
|
482
|
+
* @return addition range
|
|
483
|
+
*/
|
|
484
|
+
const rangeids = async (req, res, uri, range) => {
|
|
485
|
+
//console.log(`[vtecxnext rangeids] start. range=${range}`)
|
|
486
|
+
// 入力値チェック
|
|
487
|
+
checkUri(uri);
|
|
488
|
+
checkNotNull(range, 'range');
|
|
489
|
+
// vte.cxへリクエスト
|
|
490
|
+
const method = 'PUT';
|
|
491
|
+
const url = `/p${uri}?_rangeids`;
|
|
492
|
+
const feed = { feed: { 'title': range } };
|
|
493
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
494
|
+
//console.log(`[vtecxnext rangeids] response=${response}`)
|
|
495
|
+
// vte.cxからのset-cookieを転記
|
|
496
|
+
setCookie(response, res);
|
|
497
|
+
// レスポンスのエラーチェック
|
|
498
|
+
await checkVtecxResponse(response);
|
|
499
|
+
// 戻り値
|
|
500
|
+
const data = await getJson(response);
|
|
501
|
+
return data.feed.title;
|
|
502
|
+
};
|
|
503
|
+
exports.rangeids = rangeids;
|
|
504
|
+
/**
|
|
505
|
+
* get a addition range
|
|
506
|
+
* @param req request (for authentication)
|
|
507
|
+
* @param res response (for authentication)
|
|
508
|
+
* @param uri key
|
|
509
|
+
* @return addition range
|
|
510
|
+
*/
|
|
511
|
+
const getRangeids = async (req, res, uri) => {
|
|
512
|
+
//console.log('[vtecxnext getrangeids] start.')
|
|
513
|
+
// キー入力値チェック
|
|
514
|
+
checkUri(uri);
|
|
515
|
+
// vte.cxへリクエスト
|
|
516
|
+
const method = 'GET';
|
|
517
|
+
const url = `/p${uri}?_rangeids`;
|
|
518
|
+
const response = await requestVtecx(method, url, req);
|
|
519
|
+
//console.log(`[vtecxnext getrangeids] response=${response}`)
|
|
520
|
+
// vte.cxからのset-cookieを転記
|
|
521
|
+
setCookie(response, res);
|
|
522
|
+
// レスポンスのエラーチェック
|
|
523
|
+
await checkVtecxResponse(response);
|
|
524
|
+
// 戻り値
|
|
525
|
+
const data = await getJson(response);
|
|
526
|
+
return data.feed.title;
|
|
527
|
+
};
|
|
528
|
+
exports.getRangeids = getRangeids;
|
|
529
|
+
/**
|
|
530
|
+
* set feed to session
|
|
531
|
+
* @param req request (for authentication)
|
|
532
|
+
* @param res response (for authentication)
|
|
533
|
+
* @param name name
|
|
534
|
+
* @param feed entries (JSON)
|
|
535
|
+
* @return true if successful
|
|
536
|
+
*/
|
|
537
|
+
const setSessionFeed = async (req, res, name, feed) => {
|
|
538
|
+
//console.log(`[vtecxnext setSessionFeed] start. name=${name} feed=${feed}`)
|
|
539
|
+
// 入力チェック
|
|
540
|
+
checkNotNull(name, 'Name');
|
|
541
|
+
checkNotNull(feed, 'Feed');
|
|
542
|
+
// vte.cxへリクエスト
|
|
543
|
+
const method = 'PUT';
|
|
544
|
+
const url = `/p/?_sessionfeed=${name}`;
|
|
545
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
546
|
+
//console.log(`[vtecxnext setSessionFeed] response. status=${response.status}`)
|
|
547
|
+
// vte.cxからのset-cookieを転記
|
|
548
|
+
setCookie(response, res);
|
|
549
|
+
// レスポンスのエラーチェック
|
|
550
|
+
await checkVtecxResponse(response);
|
|
551
|
+
return true;
|
|
552
|
+
};
|
|
553
|
+
exports.setSessionFeed = setSessionFeed;
|
|
554
|
+
/**
|
|
555
|
+
* set entry to session
|
|
556
|
+
* @param req request (for authentication)
|
|
557
|
+
* @param res response (for authentication)
|
|
558
|
+
* @param name name
|
|
559
|
+
* @param entry entry (JSON)
|
|
560
|
+
* @return true if successful
|
|
561
|
+
*/
|
|
562
|
+
const setSessionEntry = async (req, res, name, entry) => {
|
|
563
|
+
//console.log(`[vtecxnext setSessionEntry] start. name=${name} entry=${entry}`)
|
|
564
|
+
// 入力チェック
|
|
565
|
+
checkNotNull(name, 'Name');
|
|
566
|
+
checkNotNull(entry, 'Entry');
|
|
567
|
+
// vte.cxへリクエスト
|
|
568
|
+
const method = 'PUT';
|
|
569
|
+
const url = `/p/?_sessionentry=${name}`;
|
|
570
|
+
const feed = { feed: { 'entry': entry } };
|
|
571
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
572
|
+
//console.log(`[vtecxnext setSessionEntry] response. status=${response.status}`)
|
|
573
|
+
// vte.cxからのset-cookieを転記
|
|
574
|
+
setCookie(response, res);
|
|
575
|
+
// レスポンスのエラーチェック
|
|
576
|
+
await checkVtecxResponse(response);
|
|
577
|
+
return true;
|
|
578
|
+
};
|
|
579
|
+
exports.setSessionEntry = setSessionEntry;
|
|
580
|
+
/**
|
|
581
|
+
* set string to session
|
|
582
|
+
* @param req request (for authentication)
|
|
583
|
+
* @param res response (for authentication)
|
|
584
|
+
* @param name name
|
|
585
|
+
* @param str string
|
|
586
|
+
* @return true if successful
|
|
587
|
+
*/
|
|
588
|
+
const setSessionString = async (req, res, name, str) => {
|
|
589
|
+
//console.log(`[vtecxnext setSessionString] start. name=${name} str=${str}`)
|
|
590
|
+
// 入力チェック
|
|
591
|
+
checkNotNull(name, 'Name');
|
|
592
|
+
checkNotNull(str, 'String');
|
|
593
|
+
// vte.cxへリクエスト
|
|
594
|
+
const method = 'PUT';
|
|
595
|
+
const url = `/p/?_sessionstring=${name}`;
|
|
596
|
+
const feed = { feed: { 'title': str } };
|
|
597
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
598
|
+
//console.log(`[vtecxnext setSessionString] response. status=${response.status}`)
|
|
599
|
+
// vte.cxからのset-cookieを転記
|
|
600
|
+
setCookie(response, res);
|
|
601
|
+
// レスポンスのエラーチェック
|
|
602
|
+
await checkVtecxResponse(response);
|
|
603
|
+
return true;
|
|
604
|
+
};
|
|
605
|
+
exports.setSessionString = setSessionString;
|
|
606
|
+
/**
|
|
607
|
+
* set number to session
|
|
608
|
+
* @param req request (for authentication)
|
|
609
|
+
* @param res response (for authentication)
|
|
610
|
+
* @param name name
|
|
611
|
+
* @param num number
|
|
612
|
+
* @return true if successful
|
|
613
|
+
*/
|
|
614
|
+
const setSessionLong = async (req, res, name, num) => {
|
|
615
|
+
//console.log(`[vtecxnext setSessionLong] start. name=${name} num=${num}`)
|
|
616
|
+
// 入力チェック
|
|
617
|
+
checkNotNull(name, 'Name');
|
|
618
|
+
checkNotNull(num, 'Number');
|
|
619
|
+
// vte.cxへリクエスト
|
|
620
|
+
const method = 'PUT';
|
|
621
|
+
const url = `/p/?_sessionlong=${name}`;
|
|
622
|
+
const feed = { feed: { 'title': String(num) } };
|
|
623
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
624
|
+
//console.log(`[vtecxnext setSessionLong] response. status=${response.status}`)
|
|
625
|
+
// vte.cxからのset-cookieを転記
|
|
626
|
+
setCookie(response, res);
|
|
627
|
+
// レスポンスのエラーチェック
|
|
628
|
+
await checkVtecxResponse(response);
|
|
629
|
+
return true;
|
|
630
|
+
};
|
|
631
|
+
exports.setSessionLong = setSessionLong;
|
|
632
|
+
/**
|
|
633
|
+
* add number in session
|
|
634
|
+
* @param req request (for authentication)
|
|
635
|
+
* @param res response (for authentication)
|
|
636
|
+
* @param name name
|
|
637
|
+
* @param num number to add
|
|
638
|
+
* @return true if successful
|
|
639
|
+
*/
|
|
640
|
+
const incrementSession = async (req, res, name, num) => {
|
|
641
|
+
//console.log(`[vtecxnext incrementSession] start. name=${name} num=${num}`)
|
|
642
|
+
// 入力チェック
|
|
643
|
+
checkNotNull(name, 'Name');
|
|
644
|
+
checkNotNull(num, 'Number');
|
|
645
|
+
// vte.cxへリクエスト
|
|
646
|
+
const method = 'PUT';
|
|
647
|
+
const url = `/p/?_sessionincr=${name}&_num=${num}`;
|
|
648
|
+
const response = await requestVtecx(method, url, req);
|
|
649
|
+
//console.log(`[vtecxnext incrementSession] response. status=${response.status}`)
|
|
650
|
+
// vte.cxからのset-cookieを転記
|
|
651
|
+
setCookie(response, res);
|
|
652
|
+
// レスポンスのエラーチェック
|
|
653
|
+
await checkVtecxResponse(response);
|
|
654
|
+
// 戻り値
|
|
655
|
+
const data = await getJson(response);
|
|
656
|
+
return data.feed.title ? Number(data.feed.title) : null;
|
|
657
|
+
};
|
|
658
|
+
exports.incrementSession = incrementSession;
|
|
659
|
+
/**
|
|
660
|
+
* delete feed from session
|
|
661
|
+
* @param req request (for authentication)
|
|
662
|
+
* @param res response (for authentication)
|
|
663
|
+
* @param name name
|
|
664
|
+
* @return true if successful
|
|
665
|
+
*/
|
|
666
|
+
const deleteSessionFeed = async (req, res, name) => {
|
|
667
|
+
//console.log(`[vtecxnext deleteSessionFeed] start. name=${name}`)
|
|
668
|
+
// 入力チェック
|
|
669
|
+
checkNotNull(name, 'Name');
|
|
670
|
+
// vte.cxへリクエスト
|
|
671
|
+
const method = 'DELETE';
|
|
672
|
+
const url = `/p/?_sessionfeed=${name}`;
|
|
673
|
+
const response = await requestVtecx(method, url, req);
|
|
674
|
+
//console.log(`[vtecxnext deleteSessionFeed] response. status=${response.status}`)
|
|
675
|
+
// vte.cxからのset-cookieを転記
|
|
676
|
+
setCookie(response, res);
|
|
677
|
+
// レスポンスのエラーチェック
|
|
678
|
+
await checkVtecxResponse(response);
|
|
679
|
+
return true;
|
|
680
|
+
};
|
|
681
|
+
exports.deleteSessionFeed = deleteSessionFeed;
|
|
682
|
+
/**
|
|
683
|
+
* delete entry from session
|
|
684
|
+
* @param req request (for authentication)
|
|
685
|
+
* @param res response (for authentication)
|
|
686
|
+
* @param name name
|
|
687
|
+
* @return true if successful
|
|
688
|
+
*/
|
|
689
|
+
const deleteSessionEntry = async (req, res, name) => {
|
|
690
|
+
//console.log(`[vtecxnext deleteSessionEntry] start. name=${name}`)
|
|
691
|
+
// 入力チェック
|
|
692
|
+
checkNotNull(name, 'Name');
|
|
693
|
+
// vte.cxへリクエスト
|
|
694
|
+
const method = 'DELETE';
|
|
695
|
+
const url = `/p/?_sessionentry=${name}`;
|
|
696
|
+
const response = await requestVtecx(method, url, req);
|
|
697
|
+
//console.log(`[vtecxnext deleteSessionEntry] response. status=${response.status}`)
|
|
698
|
+
// vte.cxからのset-cookieを転記
|
|
699
|
+
setCookie(response, res);
|
|
700
|
+
// レスポンスのエラーチェック
|
|
701
|
+
await checkVtecxResponse(response);
|
|
702
|
+
return true;
|
|
703
|
+
};
|
|
704
|
+
exports.deleteSessionEntry = deleteSessionEntry;
|
|
705
|
+
/**
|
|
706
|
+
* delete string from session
|
|
707
|
+
* @param req request (for authentication)
|
|
708
|
+
* @param res response (for authentication)
|
|
709
|
+
* @param name name
|
|
710
|
+
* @return true if successful
|
|
711
|
+
*/
|
|
712
|
+
const deleteSessionString = async (req, res, name) => {
|
|
713
|
+
//console.log(`[vtecxnext deleteSessionString] start. name=${name}`)
|
|
714
|
+
// 入力チェック
|
|
715
|
+
checkNotNull(name, 'Name');
|
|
716
|
+
// vte.cxへリクエスト
|
|
717
|
+
const method = 'DELETE';
|
|
718
|
+
const url = `/p/?_sessionstring=${name}`;
|
|
719
|
+
const response = await requestVtecx(method, url, req);
|
|
720
|
+
//console.log(`[vtecxnext deleteSessionString] response. status=${response.status}`)
|
|
721
|
+
// vte.cxからのset-cookieを転記
|
|
722
|
+
setCookie(response, res);
|
|
723
|
+
// レスポンスのエラーチェック
|
|
724
|
+
await checkVtecxResponse(response);
|
|
725
|
+
return true;
|
|
726
|
+
};
|
|
727
|
+
exports.deleteSessionString = deleteSessionString;
|
|
728
|
+
/**
|
|
729
|
+
* delete number from session
|
|
730
|
+
* @param req request (for authentication)
|
|
731
|
+
* @param res response (for authentication)
|
|
732
|
+
* @param name name
|
|
733
|
+
* @return true if successful
|
|
734
|
+
*/
|
|
735
|
+
const deleteSessionLong = async (req, res, name) => {
|
|
736
|
+
//console.log(`[vtecxnext deleteSessionLong] start. name=${name}`)
|
|
737
|
+
// 入力チェック
|
|
738
|
+
checkNotNull(name, 'Name');
|
|
739
|
+
// vte.cxへリクエスト
|
|
740
|
+
const method = 'DELETE';
|
|
741
|
+
const url = `/p/?_sessionlong=${name}`;
|
|
742
|
+
const response = await requestVtecx(method, url, req);
|
|
743
|
+
//console.log(`[vtecxnext deleteSessionLong] response. status=${response.status}`)
|
|
744
|
+
// vte.cxからのset-cookieを転記
|
|
745
|
+
setCookie(response, res);
|
|
746
|
+
// レスポンスのエラーチェック
|
|
747
|
+
await checkVtecxResponse(response);
|
|
748
|
+
return true;
|
|
749
|
+
};
|
|
750
|
+
exports.deleteSessionLong = deleteSessionLong;
|
|
751
|
+
/**
|
|
752
|
+
* get feed from session
|
|
753
|
+
* @param req request (for authentication)
|
|
754
|
+
* @param res response (for authentication)
|
|
755
|
+
* @param name name
|
|
756
|
+
* @return feed
|
|
757
|
+
*/
|
|
758
|
+
const getSessionFeed = async (req, res, name) => {
|
|
759
|
+
//console.log(`[vtecxnext getSessionFeed] start. name=${name}`)
|
|
760
|
+
// 入力チェック
|
|
761
|
+
checkNotNull(name, 'Name');
|
|
762
|
+
// vte.cxへリクエスト
|
|
763
|
+
const method = 'GET';
|
|
764
|
+
const url = `/p/?_sessionfeed=${name}`;
|
|
765
|
+
const response = await requestVtecx(method, url, req);
|
|
766
|
+
//console.log(`[vtecxnext getSessionFeed] response. status=${response.status}`)
|
|
767
|
+
// vte.cxからのset-cookieを転記
|
|
768
|
+
setCookie(response, res);
|
|
769
|
+
// レスポンスのエラーチェック
|
|
770
|
+
await checkVtecxResponse(response);
|
|
771
|
+
// 戻り値
|
|
772
|
+
return await getJson(response);
|
|
773
|
+
};
|
|
774
|
+
exports.getSessionFeed = getSessionFeed;
|
|
775
|
+
/**
|
|
776
|
+
* get entry from session
|
|
777
|
+
* @param req request (for authentication)
|
|
778
|
+
* @param res response (for authentication)
|
|
779
|
+
* @param name name
|
|
780
|
+
* @return entry
|
|
781
|
+
*/
|
|
782
|
+
const getSessionEntry = async (req, res, name) => {
|
|
783
|
+
//console.log(`[vtecxnext getSessionEntry] start. name=${name}`)
|
|
784
|
+
// 入力チェック
|
|
785
|
+
checkNotNull(name, 'Name');
|
|
786
|
+
// vte.cxへリクエスト
|
|
787
|
+
const method = 'GET';
|
|
788
|
+
const url = `/p/?_sessionentry=${name}`;
|
|
789
|
+
const response = await requestVtecx(method, url, req);
|
|
790
|
+
//console.log(`[vtecxnext getSessionEntry] response. status=${response.status}`)
|
|
791
|
+
// vte.cxからのset-cookieを転記
|
|
792
|
+
setCookie(response, res);
|
|
793
|
+
// レスポンスのエラーチェック
|
|
794
|
+
await checkVtecxResponse(response);
|
|
795
|
+
// 戻り値
|
|
796
|
+
return await getJson(response);
|
|
797
|
+
};
|
|
798
|
+
exports.getSessionEntry = getSessionEntry;
|
|
799
|
+
/**
|
|
800
|
+
* get string from session
|
|
801
|
+
* @param req request (for authentication)
|
|
802
|
+
* @param res response (for authentication)
|
|
803
|
+
* @param name name
|
|
804
|
+
* @return string
|
|
805
|
+
*/
|
|
806
|
+
const getSessionString = async (req, res, name) => {
|
|
807
|
+
//console.log(`[vtecxnext getSessionString] start. name=${name}`)
|
|
808
|
+
// 入力チェック
|
|
809
|
+
checkNotNull(name, 'Name');
|
|
810
|
+
// vte.cxへリクエスト
|
|
811
|
+
const method = 'GET';
|
|
812
|
+
const url = `/p/?_sessionstring=${name}`;
|
|
813
|
+
const response = await requestVtecx(method, url, req);
|
|
814
|
+
//console.log(`[vtecxnext getSessionString] response. status=${response.status}`)
|
|
815
|
+
// vte.cxからのset-cookieを転記
|
|
816
|
+
setCookie(response, res);
|
|
817
|
+
// レスポンスのエラーチェック
|
|
818
|
+
await checkVtecxResponse(response);
|
|
819
|
+
// 戻り値
|
|
820
|
+
const data = await getJson(response);
|
|
821
|
+
if (data) {
|
|
822
|
+
return data.feed.title;
|
|
823
|
+
}
|
|
824
|
+
else {
|
|
825
|
+
return null;
|
|
826
|
+
}
|
|
827
|
+
};
|
|
828
|
+
exports.getSessionString = getSessionString;
|
|
829
|
+
/**
|
|
830
|
+
* get number from session
|
|
831
|
+
* @param req request (for authentication)
|
|
832
|
+
* @param res response (for authentication)
|
|
833
|
+
* @param name name
|
|
834
|
+
* @return number
|
|
835
|
+
*/
|
|
836
|
+
const getSessionLong = async (req, res, name) => {
|
|
837
|
+
//console.log(`[vtecxnext getSessionLong] start. name=${name}`)
|
|
838
|
+
// 入力チェック
|
|
839
|
+
checkNotNull(name, 'Name');
|
|
840
|
+
// vte.cxへリクエスト
|
|
841
|
+
const method = 'GET';
|
|
842
|
+
const url = `/p/?_sessionlong=${name}`;
|
|
843
|
+
const response = await requestVtecx(method, url, req);
|
|
844
|
+
//console.log(`[vtecxnext getSessionLong] response. status=${response.status}`)
|
|
845
|
+
// vte.cxからのset-cookieを転記
|
|
846
|
+
setCookie(response, res);
|
|
847
|
+
// レスポンスのエラーチェック
|
|
848
|
+
await checkVtecxResponse(response);
|
|
849
|
+
// 戻り値
|
|
850
|
+
const data = await getJson(response);
|
|
851
|
+
if (data) {
|
|
852
|
+
return data.feed.title ? Number(data.feed.title) : null;
|
|
853
|
+
}
|
|
854
|
+
else {
|
|
855
|
+
return null;
|
|
856
|
+
}
|
|
857
|
+
};
|
|
858
|
+
exports.getSessionLong = getSessionLong;
|
|
859
|
+
/**
|
|
860
|
+
* pagination
|
|
861
|
+
* @param req request (for authentication)
|
|
862
|
+
* @param res response (for authentication)
|
|
863
|
+
* @param uri key and conditions
|
|
864
|
+
* @param pagerange page range
|
|
865
|
+
* @return feed Maximum number of pages in the specified page range, and total count.
|
|
866
|
+
*/
|
|
867
|
+
const pagination = async (req, res, uri, pagerange) => {
|
|
868
|
+
//console.log('[vtecxnext pagination] start.')
|
|
869
|
+
// キー入力値チェック
|
|
870
|
+
checkUri(uri);
|
|
871
|
+
// vte.cxへリクエスト
|
|
872
|
+
const method = 'GET';
|
|
873
|
+
const url = `/p${uri}${uri.includes('?') ? '&' : '?'}_pagination=${pagerange}`;
|
|
874
|
+
const response = await requestVtecx(method, url, req);
|
|
875
|
+
//console.log(`[vtecxnext pagination] response=${response}`)
|
|
876
|
+
// vte.cxからのset-cookieを転記
|
|
877
|
+
setCookie(response, res);
|
|
878
|
+
// レスポンスのエラーチェック
|
|
879
|
+
await checkVtecxResponse(response);
|
|
880
|
+
// 戻り値
|
|
881
|
+
return await getJson(response);
|
|
882
|
+
};
|
|
883
|
+
exports.pagination = pagination;
|
|
884
|
+
/**
|
|
885
|
+
* get page
|
|
886
|
+
* @param req request (for authentication)
|
|
887
|
+
* @param res response (for authentication)
|
|
888
|
+
* @param uri key and conditions
|
|
889
|
+
* @param num page number
|
|
890
|
+
* @return feed Maximum number of pages in the specified page range, and total count.
|
|
891
|
+
*/
|
|
892
|
+
const getPage = async (req, res, uri, num) => {
|
|
893
|
+
//console.log('[vtecxnext getPage] start.')
|
|
894
|
+
// 入力値チェック
|
|
895
|
+
checkUri(uri);
|
|
896
|
+
checkNotNull(num, 'page number');
|
|
897
|
+
// vte.cxへリクエスト
|
|
898
|
+
const method = 'GET';
|
|
899
|
+
const url = `/p${uri}${uri.includes('?') ? '&' : '?'}n=${num}`;
|
|
900
|
+
const response = await requestVtecx(method, url, req);
|
|
901
|
+
//console.log(`[vtecxnext getPage] response=${response}`)
|
|
902
|
+
// vte.cxからのset-cookieを転記
|
|
903
|
+
setCookie(response, res);
|
|
904
|
+
// レスポンスのエラーチェック
|
|
905
|
+
await checkVtecxResponse(response);
|
|
906
|
+
// 戻り値
|
|
907
|
+
return await getJson(response);
|
|
908
|
+
};
|
|
909
|
+
exports.getPage = getPage;
|
|
910
|
+
/**
|
|
911
|
+
* post data to bigquery
|
|
912
|
+
* @param req request (for authentication)
|
|
913
|
+
* @param res response (for authentication)
|
|
914
|
+
* @param feed entries (JSON)
|
|
915
|
+
* @param async execute async
|
|
916
|
+
* @param tablenames key:entity's prop name, value:BigQuery table name
|
|
917
|
+
* @return true if successful
|
|
918
|
+
*/
|
|
919
|
+
const postBQ = async (req, res, feed, async, tablenames) => {
|
|
920
|
+
//console.log(`[vtecxnext postBQ] start. async=${async} feed=${feed}`)
|
|
921
|
+
// 入力チェック
|
|
922
|
+
checkNotNull(feed, 'Feed');
|
|
923
|
+
// リクエストデータ
|
|
924
|
+
const reqFeed = 'feed' in feed ? feed : { 'feed': { 'entry': feed } };
|
|
925
|
+
// テーブル名の指定がある場合は指定
|
|
926
|
+
const tablenamesStr = editBqTableNames(tablenames);
|
|
927
|
+
if (tablenamesStr) {
|
|
928
|
+
reqFeed.feed['title'] = tablenamesStr;
|
|
929
|
+
}
|
|
930
|
+
// vte.cxへリクエスト
|
|
931
|
+
const method = 'POST';
|
|
932
|
+
const url = `/p/?_bq${async ? '&_async' : ''}`;
|
|
933
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(reqFeed));
|
|
934
|
+
//console.log(`[vtecxnext postBQ] response. status=${response.status}`)
|
|
935
|
+
// vte.cxからのset-cookieを転記
|
|
936
|
+
setCookie(response, res);
|
|
937
|
+
// レスポンスのエラーチェック
|
|
938
|
+
await checkVtecxResponse(response);
|
|
939
|
+
return true;
|
|
940
|
+
};
|
|
941
|
+
exports.postBQ = postBQ;
|
|
942
|
+
/**
|
|
943
|
+
* delete data from bigquery
|
|
944
|
+
* @param req request (for authentication)
|
|
945
|
+
* @param res response (for authentication)
|
|
946
|
+
* @param keys delete keys
|
|
947
|
+
* @param async execute async
|
|
948
|
+
* @param tablenames key:entity's prop name, value:BigQuery table name
|
|
949
|
+
* @return true if successful
|
|
950
|
+
*/
|
|
951
|
+
const deleteBQ = async (req, res, keys, async, tablenames) => {
|
|
952
|
+
//console.log(`[vtecxnext deleteBQ] start. async=${async} keys=${keys}`)
|
|
953
|
+
// 入力チェック
|
|
954
|
+
checkNotNull(keys, 'Key');
|
|
955
|
+
// テーブル名の指定がある場合は指定
|
|
956
|
+
const tablenamesStr = editBqTableNames(tablenames);
|
|
957
|
+
// キーを feed.link.___href にセットする
|
|
958
|
+
const links = [];
|
|
959
|
+
let idx = 0;
|
|
960
|
+
for (const key of keys) {
|
|
961
|
+
//console.log(`[vtecxnext deleteBQ] key=${key}`)
|
|
962
|
+
links[idx] = { '___href': key };
|
|
963
|
+
idx++;
|
|
964
|
+
}
|
|
965
|
+
const feed = { 'feed': {} };
|
|
966
|
+
if (tablenamesStr) {
|
|
967
|
+
feed.feed['title'] = tablenamesStr;
|
|
968
|
+
}
|
|
969
|
+
feed.feed['link'] = links;
|
|
970
|
+
//console.log(`[vtecxnext deleteBQ] feed=${feed}`)
|
|
971
|
+
// vte.cxへリクエスト
|
|
972
|
+
const method = 'DELETE';
|
|
973
|
+
const url = `/p/?_bq${async ? '&_async' : ''}`;
|
|
974
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
975
|
+
//console.log(`[vtecxnext deleteBQ] response. status=${response.status}`)
|
|
976
|
+
// vte.cxからのset-cookieを転記
|
|
977
|
+
setCookie(response, res);
|
|
978
|
+
// レスポンスのエラーチェック
|
|
979
|
+
await checkVtecxResponse(response);
|
|
980
|
+
return true;
|
|
981
|
+
};
|
|
982
|
+
exports.deleteBQ = deleteBQ;
|
|
983
|
+
/**
|
|
984
|
+
* query bigquery
|
|
985
|
+
* @param req request (for authentication)
|
|
986
|
+
* @param res response (for authentication)
|
|
987
|
+
* @param sql query sql
|
|
988
|
+
* @param values values of query arguments
|
|
989
|
+
* @param parent parent name of result json
|
|
990
|
+
* @return query results in JSON format
|
|
991
|
+
*/
|
|
992
|
+
const getBQ = async (req, res, sql, values, parent) => {
|
|
993
|
+
//console.log(`[vtecxnext getBQ] start. sql=${sql} values=${values}`)
|
|
994
|
+
// 入力チェック
|
|
995
|
+
checkNotNull(sql, 'Query SQL');
|
|
996
|
+
// 引数生成
|
|
997
|
+
const feed = editGetBqArgument(sql, values, parent);
|
|
998
|
+
// vte.cxへリクエスト
|
|
999
|
+
const method = 'PUT';
|
|
1000
|
+
const url = `/p/?_querybq`;
|
|
1001
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
1002
|
+
//console.log(`[vtecxnext getBQ] response. status=${response.status}`)
|
|
1003
|
+
// vte.cxからのset-cookieを転記
|
|
1004
|
+
setCookie(response, res);
|
|
1005
|
+
//console.log(`[vtecxnext getBQ] setCookie end.`)
|
|
1006
|
+
// レスポンスのエラーチェック
|
|
1007
|
+
await checkVtecxResponse(response);
|
|
1008
|
+
//console.log(`[vtecxnext getBQ] checkVtecxResponse end.`)
|
|
1009
|
+
// 戻り値
|
|
1010
|
+
return await response.json();
|
|
1011
|
+
};
|
|
1012
|
+
exports.getBQ = getBQ;
|
|
1013
|
+
/**
|
|
1014
|
+
* Search BigQuery and return results in CSV format.
|
|
1015
|
+
* @param req request (for authentication)
|
|
1016
|
+
* @param res response
|
|
1017
|
+
* @param sql query sql
|
|
1018
|
+
* @param values values of query arguments
|
|
1019
|
+
* @param filename file name of csv
|
|
1020
|
+
* @param parent parent name of result json
|
|
1021
|
+
* @return true
|
|
1022
|
+
*/
|
|
1023
|
+
const getBQCsv = async (req, res, sql, values, filename, parent) => {
|
|
1024
|
+
//console.log(`[vtecxnext getBQCsv] start. sql=${sql} values=${values}`)
|
|
1025
|
+
// 入力チェック
|
|
1026
|
+
checkNotNull(sql, 'Query SQL');
|
|
1027
|
+
// 引数生成
|
|
1028
|
+
const feed = editGetBqArgument(sql, values, parent);
|
|
1029
|
+
// vte.cxへリクエスト
|
|
1030
|
+
const method = 'PUT';
|
|
1031
|
+
const url = `/p/?_querybq&_csv${filename ? '=' + filename : ''}`;
|
|
1032
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
1033
|
+
//console.log(`[vtecxnext getBQCsv] response. status=${response.status}`)
|
|
1034
|
+
// vte.cxからのset-cookieを転記
|
|
1035
|
+
setCookie(response, res);
|
|
1036
|
+
//console.log(`[vtecxnext getBQCsv] setCookie end.`)
|
|
1037
|
+
// レスポンスのエラーチェック
|
|
1038
|
+
await checkVtecxResponse(response);
|
|
1039
|
+
//console.log(`[vtecxnext getBQCsv] checkVtecxResponse end.`)
|
|
1040
|
+
// 戻り値
|
|
1041
|
+
const resData = await response.blob();
|
|
1042
|
+
setResponseHeaders(response, res);
|
|
1043
|
+
const csvData = await resData.arrayBuffer();
|
|
1044
|
+
res.end(csvData);
|
|
1045
|
+
return true;
|
|
1046
|
+
};
|
|
1047
|
+
exports.getBQCsv = getBQCsv;
|
|
1048
|
+
/**
|
|
1049
|
+
* Create PDF
|
|
1050
|
+
* @param req request (for authentication)
|
|
1051
|
+
* @param res response
|
|
1052
|
+
* @param htmlTemplate PDF layout
|
|
1053
|
+
* @param filename PDF file name
|
|
1054
|
+
* @return true
|
|
1055
|
+
*/
|
|
1056
|
+
const toPdf = async (req, res, htmlTemplate, filename) => {
|
|
1057
|
+
//console.log(`[vtecxnext toPdf] start. htmlTemplate=${htmlTemplate} filename=${filename}`)
|
|
1058
|
+
// 入力チェック
|
|
1059
|
+
checkNotNull(htmlTemplate, 'PDF template');
|
|
1060
|
+
// vte.cxへリクエスト
|
|
1061
|
+
const method = 'PUT';
|
|
1062
|
+
const url = `/p/?_pdf${filename ? '=' + filename : ''}`;
|
|
1063
|
+
const response = await requestVtecx(method, url, req, htmlTemplate);
|
|
1064
|
+
//console.log(`[vtecxnext toPdf] response. status=${response.status}`)
|
|
1065
|
+
// vte.cxからのset-cookieを転記
|
|
1066
|
+
setCookie(response, res);
|
|
1067
|
+
//console.log(`[vtecxnext toPdf] setCookie end.`)
|
|
1068
|
+
// レスポンスのエラーチェック
|
|
1069
|
+
await checkVtecxResponse(response);
|
|
1070
|
+
//console.log(`[vtecxnext toPdf] checkVtecxResponse end.`)
|
|
1071
|
+
// 戻り値
|
|
1072
|
+
const resData = await response.blob();
|
|
1073
|
+
setResponseHeaders(response, res);
|
|
1074
|
+
const csvData = await resData.arrayBuffer();
|
|
1075
|
+
res.end(new Uint8Array(csvData));
|
|
1076
|
+
return true;
|
|
1077
|
+
};
|
|
1078
|
+
exports.toPdf = toPdf;
|
|
1079
|
+
/**
|
|
1080
|
+
* put the signature of uri and revision.
|
|
1081
|
+
* @param req request (for authentication)
|
|
1082
|
+
* @param res response (for authentication)
|
|
1083
|
+
* @param uri key
|
|
1084
|
+
* @param revision revision
|
|
1085
|
+
* @return signed entry
|
|
1086
|
+
*/
|
|
1087
|
+
const putSignature = async (req, res, uri, revision) => {
|
|
1088
|
+
//console.log('[vtecxnext putSignature] start.')
|
|
1089
|
+
// キー入力値チェック
|
|
1090
|
+
checkUri(uri);
|
|
1091
|
+
// vte.cxへリクエスト
|
|
1092
|
+
const method = 'PUT';
|
|
1093
|
+
const url = `/p${uri}?_signature${revision ? '&r=' + revision : ''}`;
|
|
1094
|
+
const response = await requestVtecx(method, url, req);
|
|
1095
|
+
//console.log(`[vtecxnext putSignature] response=${response}`)
|
|
1096
|
+
// vte.cxからのset-cookieを転記
|
|
1097
|
+
setCookie(response, res);
|
|
1098
|
+
// レスポンスのエラーチェック
|
|
1099
|
+
await checkVtecxResponse(response);
|
|
1100
|
+
// 戻り値
|
|
1101
|
+
return await getJson(response);
|
|
1102
|
+
};
|
|
1103
|
+
exports.putSignature = putSignature;
|
|
1104
|
+
/**
|
|
1105
|
+
* puts the signature of uri and revision.
|
|
1106
|
+
* @param req request (for authentication)
|
|
1107
|
+
* @param res response (for authentication)
|
|
1108
|
+
* @param feed entries
|
|
1109
|
+
* @return signed entries
|
|
1110
|
+
*/
|
|
1111
|
+
const putSignatures = async (req, res, feed) => {
|
|
1112
|
+
//console.log('[vtecxnext putSignatures] start.')
|
|
1113
|
+
// 入力チェック
|
|
1114
|
+
checkNotNull(feed, 'Feed');
|
|
1115
|
+
// vte.cxへリクエスト
|
|
1116
|
+
const method = 'PUT';
|
|
1117
|
+
const url = `/p/?_signature`;
|
|
1118
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
1119
|
+
//console.log(`[vtecxnext putSignatures] response=${response}`)
|
|
1120
|
+
// vte.cxからのset-cookieを転記
|
|
1121
|
+
setCookie(response, res);
|
|
1122
|
+
// レスポンスのエラーチェック
|
|
1123
|
+
await checkVtecxResponse(response);
|
|
1124
|
+
// 戻り値
|
|
1125
|
+
return await getJson(response);
|
|
1126
|
+
};
|
|
1127
|
+
exports.putSignatures = putSignatures;
|
|
1128
|
+
/**
|
|
1129
|
+
* delete the signature.
|
|
1130
|
+
* @param req request (for authentication)
|
|
1131
|
+
* @param res response (for authentication)
|
|
1132
|
+
* @param uri key
|
|
1133
|
+
* @param revision revision
|
|
1134
|
+
* @return true if successful
|
|
1135
|
+
*/
|
|
1136
|
+
const deleteSignature = async (req, res, uri, revision) => {
|
|
1137
|
+
//console.log('[vtecxnext deleteSignature] start.')
|
|
1138
|
+
// キー入力値チェック
|
|
1139
|
+
checkUri(uri);
|
|
1140
|
+
// vte.cxへリクエスト
|
|
1141
|
+
const method = 'DELETE';
|
|
1142
|
+
const url = `/p${uri}?_signature${revision ? '&r=' + revision : ''}`;
|
|
1143
|
+
const response = await requestVtecx(method, url, req);
|
|
1144
|
+
//console.log(`[vtecxnext deleteSignature] response=${response}`)
|
|
1145
|
+
// vte.cxからのset-cookieを転記
|
|
1146
|
+
setCookie(response, res);
|
|
1147
|
+
// レスポンスのエラーチェック
|
|
1148
|
+
await checkVtecxResponse(response);
|
|
1149
|
+
return true;
|
|
1150
|
+
};
|
|
1151
|
+
exports.deleteSignature = deleteSignature;
|
|
1152
|
+
/**
|
|
1153
|
+
* check the signature.
|
|
1154
|
+
* @param req request (for authentication)
|
|
1155
|
+
* @param res response (for authentication)
|
|
1156
|
+
* @param uri key
|
|
1157
|
+
* @return true if the signature is valid
|
|
1158
|
+
*/
|
|
1159
|
+
const checkSignature = async (req, res, uri) => {
|
|
1160
|
+
//console.log('[vtecxnext checkSignature] start.')
|
|
1161
|
+
// キー入力値チェック
|
|
1162
|
+
checkUri(uri);
|
|
1163
|
+
// vte.cxへリクエスト
|
|
1164
|
+
const method = 'GET';
|
|
1165
|
+
const url = `/p${uri}?_signature`;
|
|
1166
|
+
const response = await requestVtecx(method, url, req);
|
|
1167
|
+
//console.log(`[vtecxnext checkSignature] response=${response}`)
|
|
1168
|
+
// vte.cxからのset-cookieを転記
|
|
1169
|
+
setCookie(response, res);
|
|
1170
|
+
// レスポンスのエラーチェック
|
|
1171
|
+
await checkVtecxResponse(response);
|
|
1172
|
+
return true;
|
|
1173
|
+
};
|
|
1174
|
+
exports.checkSignature = checkSignature;
|
|
1175
|
+
/**
|
|
1176
|
+
* Send an mail (with attachments)
|
|
1177
|
+
* @param req request (for authentication)
|
|
1178
|
+
* @param res response (for authentication)
|
|
1179
|
+
* @param entry email contents
|
|
1180
|
+
* @param to email addresses to
|
|
1181
|
+
* @param cc email addresses cc
|
|
1182
|
+
* @param bcc email addresses bcc
|
|
1183
|
+
* @param attachments keys of attachment files
|
|
1184
|
+
* @return true if successful
|
|
1185
|
+
*/
|
|
1186
|
+
const sendMail = async (req, res, entry, to, cc, bcc, attachments) => {
|
|
1187
|
+
//console.log(`[vtecxnext sendMail] start. to=${to}`)
|
|
1188
|
+
// 入力チェック
|
|
1189
|
+
checkNotNull(entry, 'Entry');
|
|
1190
|
+
// 引数編集
|
|
1191
|
+
let links = [];
|
|
1192
|
+
const linksTo = getLinks('to', to);
|
|
1193
|
+
//console.log(`[vtecxnext sendMail] linksTo=${JSON.stringify(linksTo)}`)
|
|
1194
|
+
if (linksTo) {
|
|
1195
|
+
links = links.concat(linksTo);
|
|
1196
|
+
}
|
|
1197
|
+
if (cc) {
|
|
1198
|
+
const linksCc = getLinks('cc', cc);
|
|
1199
|
+
if (linksCc) {
|
|
1200
|
+
links = links.concat(linksCc);
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
if (bcc) {
|
|
1204
|
+
const linksBcc = getLinks('bcc', bcc);
|
|
1205
|
+
if (linksBcc) {
|
|
1206
|
+
links = links.concat(linksBcc);
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
if (attachments) {
|
|
1210
|
+
const linksAttachments = getLinks('attachment', attachments);
|
|
1211
|
+
if (linksAttachments) {
|
|
1212
|
+
links = links.concat(linksAttachments);
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
//console.log(`[vtecxnext sendMail] links = ${JSON.stringify(links)}`)
|
|
1216
|
+
let feed = { 'feed': { 'entry': [entry], 'link': links } };
|
|
1217
|
+
//console.log(`[vtecxnext sendMail] feed = ${JSON.stringify(feed)}`)
|
|
1218
|
+
// vte.cxへリクエスト
|
|
1219
|
+
const method = 'POST';
|
|
1220
|
+
const url = `/p/?_sendmail`;
|
|
1221
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
1222
|
+
//console.log(`[vtecxnext sendMail] response. status=${response.status}`)
|
|
1223
|
+
// vte.cxからのset-cookieを転記
|
|
1224
|
+
setCookie(response, res);
|
|
1225
|
+
// レスポンスのエラーチェック
|
|
1226
|
+
await checkVtecxResponse(response);
|
|
1227
|
+
return true;
|
|
1228
|
+
};
|
|
1229
|
+
exports.sendMail = sendMail;
|
|
1230
|
+
/**
|
|
1231
|
+
* push notification to clients.
|
|
1232
|
+
* @param req request (for authentication)
|
|
1233
|
+
* @param res response (for authentication)
|
|
1234
|
+
* @param message message
|
|
1235
|
+
* @param to clients to
|
|
1236
|
+
* @param title title
|
|
1237
|
+
* @param subtitle subtitle (Expo)
|
|
1238
|
+
* @param imageUrl url of image (FCM)
|
|
1239
|
+
* @param data key value data (Expo)
|
|
1240
|
+
* @return true if successful
|
|
1241
|
+
*/
|
|
1242
|
+
const pushNotification = async (req, res, message, to, title, subtitle, imageUrl, data) => {
|
|
1243
|
+
//console.log(`[vtecxnext pushNotification] start. to=${to}`)
|
|
1244
|
+
// 入力チェック
|
|
1245
|
+
checkNotNull(message, 'Message');
|
|
1246
|
+
checkNotNull(to, 'Destination');
|
|
1247
|
+
// 引数編集
|
|
1248
|
+
const links = [];
|
|
1249
|
+
for (const destination of to) {
|
|
1250
|
+
const link = { '___rel': 'to', '___href': destination };
|
|
1251
|
+
links.push(link);
|
|
1252
|
+
}
|
|
1253
|
+
const categories = [];
|
|
1254
|
+
if (imageUrl) {
|
|
1255
|
+
const category = { '___scheme': 'imageurl', '___label': imageUrl };
|
|
1256
|
+
categories.push(category);
|
|
1257
|
+
}
|
|
1258
|
+
if (data) {
|
|
1259
|
+
for (const name in data) {
|
|
1260
|
+
const category = { '___scheme': name, '___label': data[name] };
|
|
1261
|
+
categories.push(category);
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
const content = { '______text': message };
|
|
1265
|
+
const entry = {};
|
|
1266
|
+
if (title) {
|
|
1267
|
+
entry['title'] = title;
|
|
1268
|
+
}
|
|
1269
|
+
if (subtitle) {
|
|
1270
|
+
entry['subtitle'] = subtitle;
|
|
1271
|
+
}
|
|
1272
|
+
entry['content'] = content;
|
|
1273
|
+
if (categories) {
|
|
1274
|
+
entry['category'] = categories;
|
|
1275
|
+
}
|
|
1276
|
+
const feed = { 'feed': {
|
|
1277
|
+
'entry': [entry],
|
|
1278
|
+
'link': links
|
|
1279
|
+
}
|
|
1280
|
+
};
|
|
1281
|
+
//console.log(`[vtecxnext pushNotification] feed = ${JSON.stringify(feed)}`)
|
|
1282
|
+
// vte.cxへリクエスト
|
|
1283
|
+
const method = 'POST';
|
|
1284
|
+
const url = `/p/?_pushnotification`;
|
|
1285
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
1286
|
+
//console.log(`[vtecxnext pushNotification] response. status=${response.status}`)
|
|
1287
|
+
// vte.cxからのset-cookieを転記
|
|
1288
|
+
setCookie(response, res);
|
|
1289
|
+
// レスポンスのエラーチェック
|
|
1290
|
+
await checkVtecxResponse(response);
|
|
1291
|
+
return true;
|
|
1292
|
+
};
|
|
1293
|
+
exports.pushNotification = pushNotification;
|
|
1294
|
+
/**
|
|
1295
|
+
* set status of MessageQueue.
|
|
1296
|
+
* @param req request (for authentication)
|
|
1297
|
+
* @param res response (for authentication)
|
|
1298
|
+
* @param flag true if on, false if off
|
|
1299
|
+
* @param channel channel
|
|
1300
|
+
*/
|
|
1301
|
+
const setMessageQueueStatus = async (req, res, flag, channel) => {
|
|
1302
|
+
//console.log(`[vtecxnext setMessageQueueStatus] start. channel=${channel} flag=${flag}`)
|
|
1303
|
+
// キー入力値チェック
|
|
1304
|
+
checkUri(channel);
|
|
1305
|
+
// vte.cxへリクエスト
|
|
1306
|
+
const method = 'PUT';
|
|
1307
|
+
const url = `/p${channel}?_mqstatus=${flag ? 'true' : 'false'}`;
|
|
1308
|
+
const response = await requestVtecx(method, url, req);
|
|
1309
|
+
//console.log(`[vtecxnext setMessageQueueStatus] response=${response}`)
|
|
1310
|
+
// vte.cxからのset-cookieを転記
|
|
1311
|
+
setCookie(response, res);
|
|
1312
|
+
// レスポンスのエラーチェック
|
|
1313
|
+
await checkVtecxResponse(response);
|
|
1314
|
+
return true;
|
|
1315
|
+
};
|
|
1316
|
+
exports.setMessageQueueStatus = setMessageQueueStatus;
|
|
1317
|
+
/**
|
|
1318
|
+
* set MessageQueue.
|
|
1319
|
+
* @param req request (for authentication)
|
|
1320
|
+
* @param res response (for authentication)
|
|
1321
|
+
* @param feed entries (JSON)
|
|
1322
|
+
* @param channel channel
|
|
1323
|
+
* @return true if successful
|
|
1324
|
+
*/
|
|
1325
|
+
const setMessageQueue = async (req, res, feed, channel) => {
|
|
1326
|
+
//console.log(`[vtecxnext setMessageQueue] start. channel=${channel} feed=${feed}`)
|
|
1327
|
+
// 入力チェック
|
|
1328
|
+
checkUri(channel);
|
|
1329
|
+
checkNotNull(feed, 'Feed');
|
|
1330
|
+
// vte.cxへリクエスト
|
|
1331
|
+
const method = 'POST';
|
|
1332
|
+
const url = `/p${channel}?_mq`;
|
|
1333
|
+
const response = await requestVtecx(method, url, req, JSON.stringify(feed));
|
|
1334
|
+
//console.log(`[vtecxnext setMessageQueue] response. status=${response.status}`)
|
|
1335
|
+
// vte.cxからのset-cookieを転記
|
|
1336
|
+
setCookie(response, res);
|
|
1337
|
+
// レスポンスのエラーチェック
|
|
1338
|
+
await checkVtecxResponse(response);
|
|
1339
|
+
return true;
|
|
1340
|
+
};
|
|
1341
|
+
exports.setMessageQueue = setMessageQueue;
|
|
1342
|
+
/**
|
|
1343
|
+
* get feed from session
|
|
1344
|
+
* @param req request (for authentication)
|
|
1345
|
+
* @param res response (for authentication)
|
|
1346
|
+
* @param name name
|
|
1347
|
+
* @return feed
|
|
1348
|
+
*/
|
|
1349
|
+
const getMessageQueue = async (req, res, channel) => {
|
|
1350
|
+
//console.log(`[vtecxnext getMessageQueue] start. channel=${channel}`)
|
|
1351
|
+
// 入力チェック
|
|
1352
|
+
checkUri(channel);
|
|
1353
|
+
// vte.cxへリクエスト
|
|
1354
|
+
const method = 'GET';
|
|
1355
|
+
const url = `/p${channel}?_mq`;
|
|
1356
|
+
const response = await requestVtecx(method, url, req);
|
|
1357
|
+
//console.log(`[vtecxnext getMessageQueue] response. status=${response.status}`)
|
|
1358
|
+
// vte.cxからのset-cookieを転記
|
|
1359
|
+
setCookie(response, res);
|
|
1360
|
+
// レスポンスのエラーチェック
|
|
1361
|
+
await checkVtecxResponse(response);
|
|
1362
|
+
// 戻り値
|
|
1363
|
+
return await getJson(response);
|
|
1364
|
+
};
|
|
1365
|
+
exports.getMessageQueue = getMessageQueue;
|
|
1366
|
+
/**
|
|
1367
|
+
* join to the group
|
|
1368
|
+
* @param req request (for authentication)
|
|
1369
|
+
* @param res response (for authentication)
|
|
1370
|
+
* @param group group
|
|
1371
|
+
* @param selfid hierarchical name under my group alias
|
|
1372
|
+
* @return feed
|
|
1373
|
+
*/
|
|
1374
|
+
const joinGroup = async (req, res, group, selfid) => {
|
|
1375
|
+
//console.log(`[vtecxnext joinGroup] start. group=${group} selfid=${selfid}`)
|
|
1376
|
+
// 入力チェック
|
|
1377
|
+
checkUri(group);
|
|
1378
|
+
checkNotNull(selfid, 'selfid (hierarchical name under my group alias)');
|
|
1379
|
+
// vte.cxへリクエスト
|
|
1380
|
+
const method = 'PUT';
|
|
1381
|
+
const url = `/p${group}?_joingroup&_selfid=${selfid}`;
|
|
1382
|
+
const response = await requestVtecx(method, url, req);
|
|
1383
|
+
//console.log(`[vtecxnext joinGroup] response. status=${response.status}`)
|
|
1384
|
+
// vte.cxからのset-cookieを転記
|
|
1385
|
+
setCookie(response, res);
|
|
1386
|
+
// レスポンスのエラーチェック
|
|
1387
|
+
await checkVtecxResponse(response);
|
|
1388
|
+
// 戻り値
|
|
1389
|
+
return await getJson(response);
|
|
1390
|
+
};
|
|
1391
|
+
exports.joinGroup = joinGroup;
|
|
1392
|
+
/**
|
|
1393
|
+
* leave from the group
|
|
1394
|
+
* @param req request (for authentication)
|
|
1395
|
+
* @param res response (for authentication)
|
|
1396
|
+
* @param group group
|
|
1397
|
+
* @return feed
|
|
1398
|
+
*/
|
|
1399
|
+
const leaveGroup = async (req, res, group) => {
|
|
1400
|
+
//console.log(`[vtecxnext leaveGroup] start. group=${group}`)
|
|
1401
|
+
// 入力チェック
|
|
1402
|
+
checkUri(group);
|
|
1403
|
+
// vte.cxへリクエスト
|
|
1404
|
+
const method = 'DELETE';
|
|
1405
|
+
const url = `/p${group}?_leavegroup`;
|
|
1406
|
+
const response = await requestVtecx(method, url, req);
|
|
1407
|
+
//console.log(`[vtecxnext leaveGroup] response. status=${response.status}`)
|
|
1408
|
+
// vte.cxからのset-cookieを転記
|
|
1409
|
+
setCookie(response, res);
|
|
1410
|
+
// レスポンスのエラーチェック
|
|
1411
|
+
await checkVtecxResponse(response);
|
|
1412
|
+
// 戻り値
|
|
1413
|
+
return true;
|
|
1414
|
+
};
|
|
1415
|
+
exports.leaveGroup = leaveGroup;
|
|
1416
|
+
//---------------------------------------------
|
|
1417
|
+
/**
|
|
1418
|
+
* Error returned from vte.cx
|
|
1419
|
+
*/
|
|
1420
|
+
class VtecxNextError extends Error {
|
|
1421
|
+
status;
|
|
1422
|
+
constructor(status, message) {
|
|
1423
|
+
super(message);
|
|
1424
|
+
this.name = 'VtecxNextError';
|
|
1425
|
+
this.status = status;
|
|
1426
|
+
}
|
|
1427
|
+
}
|
|
1428
|
+
exports.VtecxNextError = VtecxNextError;
|
|
1429
|
+
//---------------------------------------------
|
|
1430
|
+
/**
|
|
1431
|
+
* vte.cxへリクエスト
|
|
1432
|
+
* @param method メソッド
|
|
1433
|
+
* @param url サーブレットパス以降のURL
|
|
1434
|
+
* @param req リクエスト。認証情報設定に使用。
|
|
1435
|
+
* @param body リクエストデータ
|
|
1436
|
+
* @returns promise
|
|
1437
|
+
*/
|
|
1438
|
+
const requestVtecx = async (method, url, req, body) => {
|
|
1439
|
+
// cookieの値をvte.cxへのリクエストヘッダに設定
|
|
1440
|
+
const cookie = req.headers['cookie'];
|
|
1441
|
+
const headers = { 'Cookie': cookie };
|
|
1442
|
+
return fetchVtecx(method, url, headers, body);
|
|
1443
|
+
};
|
|
1444
|
+
/**
|
|
1445
|
+
* vte.cxへリクエスト
|
|
1446
|
+
* @param method メソッド
|
|
1447
|
+
* @param url サーブレットパス以降のURL
|
|
1448
|
+
* @param headers リクエストヘッダ。連想配列で指定。
|
|
1449
|
+
* @param body リクエストデータ
|
|
1450
|
+
* @returns promise
|
|
1451
|
+
*/
|
|
1452
|
+
const fetchVtecx = async (method, url, headers, body) => {
|
|
1453
|
+
//console.log(`[vtecxnext fetchVtecx] url=${process.env.VTECX_URL}${url}`)
|
|
1454
|
+
headers['X-Requested-With'] = 'XMLHttpRequest';
|
|
1455
|
+
const apiKey = process.env.VTECX_APIKEY;
|
|
1456
|
+
if (apiKey) {
|
|
1457
|
+
headers['Authorization'] = `APIKey ${apiKey}`;
|
|
1458
|
+
}
|
|
1459
|
+
const requestInit = {
|
|
1460
|
+
body: body,
|
|
1461
|
+
method: method,
|
|
1462
|
+
headers: headers
|
|
1463
|
+
};
|
|
1464
|
+
return fetch(`${process.env.VTECX_URL}${url}`, requestInit);
|
|
1465
|
+
};
|
|
1466
|
+
/**
|
|
1467
|
+
* vte.cxからのset-cookieを、ブラウザへレスポンスする。
|
|
1468
|
+
* @param response vte.cxからのレスポンス
|
|
1469
|
+
* @param res ブラウザへのレスポンス
|
|
1470
|
+
*/
|
|
1471
|
+
const setCookie = (response, res) => {
|
|
1472
|
+
const setCookieVal = response.headers.get('set-cookie');
|
|
1473
|
+
if (setCookieVal === '' || setCookieVal) {
|
|
1474
|
+
res.setHeader('set-cookie', setCookieVal);
|
|
1475
|
+
}
|
|
1476
|
+
};
|
|
1477
|
+
/**
|
|
1478
|
+
* vte.cxからのレスポンスヘッダを、ブラウザへレスポンスする。
|
|
1479
|
+
* コンテンツの戻し時に使用。
|
|
1480
|
+
* @param response vte.cxからのレスポンス
|
|
1481
|
+
* @param res ブラウザへのレスポンス
|
|
1482
|
+
*/
|
|
1483
|
+
const setResponseHeaders = (response, res) => {
|
|
1484
|
+
const it = response.headers.entries();
|
|
1485
|
+
let header = it.next();
|
|
1486
|
+
while (header && !header.done) {
|
|
1487
|
+
const name = header.value[0];
|
|
1488
|
+
if (name.startsWith('content-') || name.startsWith('x-')) {
|
|
1489
|
+
const val = header.value[1];
|
|
1490
|
+
//console.log(`[setResponseHeaders] ${name} = ${val}`)
|
|
1491
|
+
res.setHeader(name, val);
|
|
1492
|
+
}
|
|
1493
|
+
header = it.next();
|
|
1494
|
+
}
|
|
1495
|
+
};
|
|
1496
|
+
/**
|
|
1497
|
+
* vte.cxからのレスポンスが正常かエラーかをチェックする。
|
|
1498
|
+
* エラーの場合 VtecxNextError をスローする。
|
|
1499
|
+
* @param response Response
|
|
1500
|
+
* @returns 戻り値はなし。エラーの場合VtecxNextErrorをスロー。
|
|
1501
|
+
*/
|
|
1502
|
+
const checkVtecxResponse = async (response) => {
|
|
1503
|
+
if (response.status < 400) {
|
|
1504
|
+
return;
|
|
1505
|
+
}
|
|
1506
|
+
else {
|
|
1507
|
+
// エラー
|
|
1508
|
+
const data = await response.json();
|
|
1509
|
+
let message;
|
|
1510
|
+
if (data && data.feed) {
|
|
1511
|
+
message = data.feed.title;
|
|
1512
|
+
}
|
|
1513
|
+
message = message ? message : `status=${response.status}`;
|
|
1514
|
+
throw new VtecxNextError(response.status, message);
|
|
1515
|
+
}
|
|
1516
|
+
};
|
|
1517
|
+
/**
|
|
1518
|
+
* 入力チェック
|
|
1519
|
+
* エラーの場合 VtecxNextError をスローする。
|
|
1520
|
+
* @param val チェック値
|
|
1521
|
+
* @param name 項目名。エラーの場合メッセージに使用。
|
|
1522
|
+
* @returns 戻り値はなし。エラーの場合VtecxNextErrorをスロー。
|
|
1523
|
+
*/
|
|
1524
|
+
const checkNotNull = (val, name) => {
|
|
1525
|
+
if (!val) {
|
|
1526
|
+
throw new VtecxNextError(400, `${name ? name : 'Key'} is required.`);
|
|
1527
|
+
}
|
|
1528
|
+
};
|
|
1529
|
+
/**
|
|
1530
|
+
* キーチェック。
|
|
1531
|
+
* 入力チェックと、先頭が/で始まっているかどうかチェックする。
|
|
1532
|
+
* エラーの場合 VtecxNextError をスローする。
|
|
1533
|
+
* @param str チェック値
|
|
1534
|
+
* @param name 項目名。エラーの場合メッセージに使用。
|
|
1535
|
+
* @returns 戻り値はなし。エラーの場合VtecxNextErrorをスロー。
|
|
1536
|
+
*/
|
|
1537
|
+
const checkUri = (str, name) => {
|
|
1538
|
+
checkNotNull(str, name);
|
|
1539
|
+
if (!str.startsWith('/')) {
|
|
1540
|
+
throw new VtecxNextError(400, `${name ? name : 'Key'} must start with a slash.`);
|
|
1541
|
+
}
|
|
1542
|
+
};
|
|
1543
|
+
/**
|
|
1544
|
+
* レスポンスデータをJSON形式で取得.
|
|
1545
|
+
* @param response レスポンス
|
|
1546
|
+
* @returns JSON
|
|
1547
|
+
*/
|
|
1548
|
+
const getJson = async (response) => {
|
|
1549
|
+
// ステータスが204の場合nullを返す。
|
|
1550
|
+
if (response.status === 204) {
|
|
1551
|
+
return null;
|
|
1552
|
+
}
|
|
1553
|
+
try {
|
|
1554
|
+
return await response.json();
|
|
1555
|
+
}
|
|
1556
|
+
catch (e) {
|
|
1557
|
+
if (e instanceof Error) {
|
|
1558
|
+
const error = e;
|
|
1559
|
+
//console.log(`[getJson] Error occured. ${error.name}: ${error.message}`)
|
|
1560
|
+
}
|
|
1561
|
+
return null;
|
|
1562
|
+
}
|
|
1563
|
+
};
|
|
1564
|
+
/**
|
|
1565
|
+
* BigQuery登録・削除時のテーブル名指定文字列を編集
|
|
1566
|
+
* @param tablenames テーブル名(キー:entry第一階層名、値:テーブル名)
|
|
1567
|
+
* @returns BigQuery登録・削除時のテーブル名指定文字列 ({スキーマ第一階層名}:{テーブル名}, ...)
|
|
1568
|
+
*/
|
|
1569
|
+
const editBqTableNames = (tablenames) => {
|
|
1570
|
+
//console.log(`[editBqTableNames] tablenames = ${tablenames}`)
|
|
1571
|
+
if (!tablenames) {
|
|
1572
|
+
return null;
|
|
1573
|
+
}
|
|
1574
|
+
let result = '';
|
|
1575
|
+
for (let key in tablenames) {
|
|
1576
|
+
const value = tablenames[key];
|
|
1577
|
+
//console.log(`[editBqTableNames] ${key}=${value}`)
|
|
1578
|
+
result = `${result ? result + ',' : ''}${key}:${value}`;
|
|
1579
|
+
}
|
|
1580
|
+
//console.log(`[editBqTableNames] result=${result}`)
|
|
1581
|
+
return result;
|
|
1582
|
+
};
|
|
1583
|
+
/**
|
|
1584
|
+
* BigQuery検索の引数を生成
|
|
1585
|
+
* @param sql SQL
|
|
1586
|
+
* @param values SQLに指定する値
|
|
1587
|
+
* @param parent 戻り値JSONの親項目(任意)か、CSVのヘッダ(任意)
|
|
1588
|
+
* @returns BigQuery検索の引数
|
|
1589
|
+
*/
|
|
1590
|
+
const editGetBqArgument = (sql, values, parent) => {
|
|
1591
|
+
// SQLに引数を代入(SQLインジェクション対応)
|
|
1592
|
+
const editSql = values ? formatSql(sql, values) : sql;
|
|
1593
|
+
//console.log(`[vtecxnext editGetBqArgument] sql=${editSql}`)
|
|
1594
|
+
// 引数
|
|
1595
|
+
const feed = { 'feed': { 'title': editSql } };
|
|
1596
|
+
if (parent) {
|
|
1597
|
+
feed.feed['subtitle'] = parent;
|
|
1598
|
+
}
|
|
1599
|
+
return feed;
|
|
1600
|
+
};
|
|
1601
|
+
/**
|
|
1602
|
+
* SQLの'?'を指定された引数に置き換える。(SQLインジェクション対応)
|
|
1603
|
+
* @param sql SQL
|
|
1604
|
+
* @param values 置き換え対象値
|
|
1605
|
+
* @returns 値が代入されたSQL
|
|
1606
|
+
*/
|
|
1607
|
+
const formatSql = (sql, values) => {
|
|
1608
|
+
if (!values) {
|
|
1609
|
+
return sql;
|
|
1610
|
+
}
|
|
1611
|
+
return SqlString.format(sql, values);
|
|
1612
|
+
};
|
|
1613
|
+
/**
|
|
1614
|
+
* linkの編集
|
|
1615
|
+
* @param rel relに指定する値
|
|
1616
|
+
* @param hrefs hrefに指定する値のリスト
|
|
1617
|
+
* @returns link
|
|
1618
|
+
*/
|
|
1619
|
+
const getLinks = (rel, hrefs) => {
|
|
1620
|
+
if (!rel || !hrefs) {
|
|
1621
|
+
return undefined;
|
|
1622
|
+
}
|
|
1623
|
+
const links = [];
|
|
1624
|
+
let idx = 0;
|
|
1625
|
+
for (const href of hrefs) {
|
|
1626
|
+
const link = { '___rel': rel, '___href': href };
|
|
1627
|
+
links[idx] = link;
|
|
1628
|
+
idx++;
|
|
1629
|
+
}
|
|
1630
|
+
//console.log(`[vtecxnext getLinks] links=${JSON.stringify(links)}`)
|
|
1631
|
+
return links;
|
|
1632
|
+
};
|