-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdynamoDB.js
175 lines (143 loc) · 5.19 KB
/
dynamoDB.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
module.exports = function(RED) {
const MAX_LIMIT = 10000; // 最大取得件数
/* 使用モジュール定義 */
var dynamodb = require("../dynamodb")(RED);
var moment = require("moment");
// ダミーデータ
var dummy = {Items: []};
function dynamodbNode(config) {
RED.nodes.createNode(this,config);
// CCS接続用情報の取得
const ccsConnectionConfigNode = RED.nodes.getNode(config.ccsConnectionConfig);
// 検索条件の取得
this.name = config.name; // ノード名
this.operation = config.operation; // 処理名
this.TableName = config.tableName; // 検索対象テーブル名
this.Limit = config.limit; // 検索件数
this.ScanIndexForward = config.sort; // 並び順
this.dateCheck = config.dateCheck; // 期間設定方法
// this.sdatetime = config.sdatetime; // 期間 開始期間
// this.edatetime = config.edatetime; // 期間 終了期間
this.aggregationCheck = config.aggregationCheck; // アグリゲーション設定の有無
this.aggregation = config.aggregation; // アグリゲーション操作
this.aggreunit = config.aggreunit; // アグリゲーション単位
this.decimalPoint = config.decimalPoint; // 表示桁数
this.FilterExpression = "objectKey = :a";
this.ExpressionAttributeValues = { // 検索条件値
":a": config.objectKey
};
// Limitチェック
if (this.Limit == "" || this.Limit > MAX_LIMIT) {
// 上限件数の指定がない or MAX_LIMITを超える値の場合はMAX_LIMIT件とする
this.Limit = MAX_LIMIT;
}
// 繰り返し条件の取得
this.repeatCheck = config.repeatCheck;
this.repeat = config.repeat;
var interval = null;
var resultList; // 取得結果格納用配列
var node = this;
// dynamodb接続設定
var opts = dynamodb.cnctSetting(ccsConnectionConfigNode);
// sendメッセージ関数作成
node.sendMsg = function (data) {
var msg;
if (data == []) {
node.status({fill:"red", shape:"ring", text:"runtime.error"});
node.error("error: sendMeg error");
return;
} else {
msg = {payload: data};
}
node.send(msg);
};
// 繰り返し設定がされている場合は指定間隔で処理を繰り返す
if (node.repeatCheck) {
interval = setInterval( function() {
dataGet(config.sdatetime, config.edatetime);
}, node.repeat * 1000);
}
// injectされたら実行
node.on('input', function(msg) {
if (node.dateCheck) {
dataGet(msg.payload.sdatetime, msg.payload.edatetime);
} else {
dataGet(config.sdatetime, config.edatetime);
}
});
// 処理終了時にはintervalをクリアする
this.on('close', function() {
if (interval != null) {
clearInterval(interval);
}
if (node.done) {
node.status({});
node.done();
}
});
// データ取得処理
function dataGet (sdatetime, edatetime) {
node.status({fill:"blue", shape:"dot", text:"runtime.connect"});
if (sdatetime == null || sdatetime == "") {
sdatetime = undefined
}
if (edatetime == null || edatetime == "") {
edatetime = undefined
}
node.sdatetime = sdatetime;
node.edatetime = edatetime;
// sdatetime, edatetime共に入力あり かつ sdatetime<=edatetimeの場合に処理続行
if (node.sdatetime == undefined || node.edatetime == undefined || moment(node.sdatetime) <= moment(node.edatetime)) {
// 期間式の設定
node = dynamodb.expressionSetting(node);
// DynamoDBパラメータの作成
opts = dynamodb.serviceSetting (opts, node);
// DynamoDBへリクエスト
dynamodb.dynamoRequest(opts, node, function(result) {
if (result.status === "ok") {
// 正常なレスポンス
var items = result.data.Items;
if (items != undefined && items.length > 0) {
try {
// アグリゲーション処理
if (node.aggregationCheck) {
resultList = dynamodb.aggregation(items, node);
} else {
resultList = items;
}
// 桁数変更処理
if (node.decimalPoint != "noexe") {
resultList = dynamodb.round(resultList, node);
}
node.status({fill:"green", shape:"dot", text:"runtime.complete"});
// Itemsで囲ってから送信
node.sendMsg({"Items": resultList});
// node.sendMsg(resultList);
} catch (e) {
// データ取得時に例外発生
console.log("データ分解時に例外発生");
node.status({fill:"red", shape:"ring", text:"runtime.faild"});
node.sendMsg(dummy);
}
} else if (items != undefined && items.length > -1) {
node.status({fill:"yellow", shape:"ring", text:"runtime.noData"});
node.sendMsg(dummy);
} else {
node.status({fill:"red", shape:"ring", text:"runtime.faild"});
node.sendMsg(dummy);
}
} else {
// 異常なレスポンス
node.status({fill:"red", shape:"ring", text:"runtime.faild"});
node.sendMsg(dummy);
}
});
} else {
node.status({fill:"red", shape:"ring", text:"runtime.periodError"});
node.error("DynamoDB - 期間指定に誤りがあります");
node.sendMsg(dummy);
}
}
}
RED.nodes.registerType("dynamoDB", dynamodbNode);
};