You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
carbon/handlers/twitter.js

47 lines
1.3 KiB
JavaScript

7 years ago
const Twitter = require('twitter');
const morph = require('morphmorph');
7 years ago
const RATE_LIMIT_CODE = 420;
const client = new Twitter({
consumer_key: process.env.TWITTER_CONSUMER_KEY,
consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY,
access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET
7 years ago
});
7 years ago
const uploadImage = data => client.post('media/upload', { media_data: data });
const uploadTweet = (media = {}) =>
client.post('statuses/update', {
status: `Carbon Copy #${media.media_id_string.slice(0, 8)}`,
media_ids: media.media_id_string
7 years ago
});
7 years ago
const extractImageUrl = morph.get('entities.media.0.display_url');
const extractErrorCode = morph.get('0.code');
7 years ago
const respondSuccess = (res, url) => res.json({ url });
const respondFail = (res, err) => {
7 years ago
const errorCode = extractErrorCode(err);
// check for rate limit
if (errorCode === RATE_LIMIT_CODE) {
7 years ago
return res.status(420).send();
}
7 years ago
console.error(`Error: ${err.message || JSON.stringify(err, null, 2)}`);
res.status(500).send();
};
module.exports = (req, res) => {
if (!req.body.data) {
7 years ago
return res.status(400).send();
}
uploadImage(req.body.data)
.then(uploadTweet)
.then(extractImageUrl)
.then(respondSuccess.bind(null, res))
7 years ago
.catch(respondFail.bind(null, res));
};