Skip to content

Instantly share code, notes, and snippets.

@ueki-kazuki
Last active June 30, 2020 00:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ueki-kazuki/995e90214d24a5473fc6 to your computer and use it in GitHub Desktop.
Save ueki-kazuki/995e90214d24a5473fc6 to your computer and use it in GitHub Desktop.
'use strict';
//requires
var request = require('request');
require('request').debug = true
var aws = require('aws-sdk');
var async = require('async');
//consts
var bucket_name = 'S3_BUCKET_NAME';
var rid = 'CHATWORK_ROOM_ID';
var token = 'CHATWORK_API_TOKEN';
var BL_TYPE_DELETE_ISSUE_COMMENT = 4;
aws.config.region = 'ap-northeast-1';
//
// Format & Send email to OTRS
//
function post2OTRS(body, callback) {
var state = '';
var pendingUntil = '';
switch (body.type) {
// modify issue
case 2:
var changes = body.content.changes;
for (var i = 0; i < changes.length; i++) {
if (changes[i].field === 'status') {
switch (parseInt(changes[i].new_value)) {
case 1:
state = 'new'; break;
case 2:
state = 'open'; break;
case 3:
state = 'open'; break;
case 4:
state = 'closed successful'; break;
default:
state = 'open'; break;
}
}
}
break;
default:
return;
}
if (!state) return;
var subject = new Buffer("["+body.project.projectKey+"-"+body.content.key_id+"] "+body.content.summary);
console.log('Subject: ' + subject);
console.log('New OTRS state: ' + state);
var message = "Subject: " + "=?UTF-8?B?" + subject.toString('base64') + "?=" + "\n"
+ "From: xxxxxx@classmethod.jp" + "\n"
+ "To: xxxxxx@classmethod.jp" + "\n"
+ "Content-Type: text/plain; charset=UTF-8" + "\n"
+ "X-OTRS-FollowUp-State: " + state + "\n"
+ "\n"
+ "Status changed by Backlog2Chatwork job [" + state + "]";
var ses = new aws.SES({ region : 'us-east-1' });
var params = {
RawMessage : {
Data : message
},
Destinations : [
'xxxxxx@classmethod.jp'
],
}
ses.sendRawEmail(params, function (err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
callback(err);
});
}
//
// Format chat message
//
function makeChatMessage(body) {
var label;
switch (body.type) {
case 1:
label = "課題の追加"; break;
case 2:
label = "課題の更新";
var changes = body.content.changes;
console.log(changes);
for (var i = 0; i < changes.length; i++) {
if (changes[i].field === 'status') {
switch (parseInt(changes[i].new_value)) {
case 1:
label += " (新規)"; break;
case 2:
label += " (対応中)"; break;
case 3:
label += " (対応済み)"; break;
case 4:
label += " (完了)"; break;
default:
label += " (未対応)"; break;
}
}
}
break;
case 3:
label = "コメントの追加"; break;
case 4:
label = "コメントの削除"; break;
default:
return;
}
console.log(label);
return "[info]"
+ "[title]" + body.project.name + " " + label + "[/title]"
+ "["+body.project.projectKey+"-"+body.content.key_id+"] " + body.content.summary
+ " " + body.createdUser.name
+ "[/info]";
}
//
// POST Message to Chatwork
//
function post2Chatwork(body, callback) {
var message = makeChatMessage(body);
if (!message) { return; }
var options = {
url: 'https://api.chatwork.com/v1/rooms/' + rid + '/messages',
headers: {
'X-ChatWorkToken': token
},
form: { body: message }
};
request.post(options, function (err, res, body) {
console.log('response' + res.statusCode);
if (!err && res.statusCode === 200) {
console.log('post2Chatwork SUCCESS!!');
} else {
console.log('post2Chatwork error: ' + res.statusCode);
console.log(body);
}
callback(err);
});
}
//
// putObject to S3 bucket
//
function put2Bucket(body, callback) {
var s3bucket = new aws.S3({params: {Bucket: bucket_name}});
// ex. TEST-10-100.json
var key = body.project.projectKey + "-" + body.content.key_id + "-" + body.id + ".json";
s3bucket.createBucket(function() {
var params = {Key: key, Body: JSON.stringify(body)};
s3bucket.upload(params, function(err, data) {
if (err) {
console.log("Error uploading data: ", err);
} else {
console.log("Successfully uploaded data to myBucket/myKey");
}
callback(err);
});
});
}
//
// Main Handler
//
exports.handler = function (event, context) {
var body;
console.log('event: ' + JSON.stringify(event, null, 4));
body = event;
console.log('json parsed');
async.parallel([
function(callback) { post2Chatwork(body, callback) },
function(callback) { post2OTRS(body, callback) },
function(callback) { put2Bucket(body, callback) },
], function(err, results) {
console.log('Done.');
context.done(err);
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment