@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.
@@ -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
+ };