2019-11-11 15:58:06 +00:00
|
|
|
/** @module root/router */
|
|
|
|
'use strict';
|
|
|
|
// vim: set ts=2 sw=2 et tw=80:
|
|
|
|
|
|
|
|
const express = require('express');
|
|
|
|
const router = express.Router();
|
|
|
|
|
|
|
|
const mongoose = require('mongoose');
|
|
|
|
const Favorite = mongoose.model('Favorite');
|
2019-11-14 09:55:43 +00:00
|
|
|
const fetch = require('node-fetch');
|
|
|
|
const querystring = require('querystring');
|
2019-11-14 14:27:51 +00:00
|
|
|
const promiseAny = require('promise-any');
|
2019-11-11 15:58:06 +00:00
|
|
|
|
|
|
|
const { error } = require('../utils');
|
|
|
|
|
|
|
|
router.get('/', (req, res) => {
|
|
|
|
Favorite.find({}, (err, favs) => {
|
|
|
|
if (err) {
|
|
|
|
return error(err, res);
|
|
|
|
}
|
|
|
|
res.render('index.dust', { favs });
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2019-11-14 09:55:43 +00:00
|
|
|
router.get('/imgur', (req, res) => {
|
|
|
|
if (req.query.access_token) {
|
|
|
|
req.app.locals.imgur = req.query;
|
|
|
|
res.redirect('/');
|
|
|
|
} else {
|
|
|
|
res.status(200, {'Content-Type': 'text/html'});
|
|
|
|
res.end(`<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>
|
|
|
|
<script>
|
|
|
|
console.log(window.location.href);
|
|
|
|
if (window.location.href.indexOf("#access") != -1) {
|
|
|
|
window.location.href = window.location.href.replace("#access",
|
|
|
|
"?access");
|
|
|
|
}
|
|
|
|
</script></body></html>`);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
async function fetchImgur(req, res, method, url, body) {
|
|
|
|
const endpoint = 'https://api.imgur.com/3';
|
|
|
|
|
2019-11-14 14:27:51 +00:00
|
|
|
const response = await fetch(endpoint + url, {
|
2019-11-14 09:55:43 +00:00
|
|
|
method: method,
|
|
|
|
headers: {
|
|
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
|
|
'Authorization' : 'Bearer ' + req.app.locals.imgur.access_token
|
|
|
|
},
|
2019-11-14 14:27:51 +00:00
|
|
|
body: body ? querystring.stringify(body) : undefined
|
2019-11-14 09:55:43 +00:00
|
|
|
});
|
|
|
|
|
2019-11-14 14:27:51 +00:00
|
|
|
const json = await response.json();
|
2019-11-14 09:55:43 +00:00
|
|
|
|
2019-11-14 14:27:51 +00:00
|
|
|
if (Math.floor(json.status / 100) != 2) {
|
|
|
|
res.status(json.status).json(json);
|
2019-11-14 09:55:43 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-11-14 14:27:51 +00:00
|
|
|
return json;
|
2019-11-14 09:55:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
router.post('/imgur/ordeal', async (req, res) => {
|
|
|
|
try {
|
2019-11-14 14:27:51 +00:00
|
|
|
const ordealResponse = { ordealSuccess: true };
|
|
|
|
|
2019-11-14 09:55:43 +00:00
|
|
|
const uploadData = {
|
|
|
|
image: req.body.dataURL.substring('data:image/png;base64,'.length),
|
|
|
|
type: 'base64',
|
2019-11-14 15:08:52 +00:00
|
|
|
title: req.body.name,
|
2019-11-14 09:55:43 +00:00
|
|
|
name: req.body.name + '.png',
|
|
|
|
};
|
|
|
|
|
|
|
|
const uploadJson = await fetchImgur(req, res, 'POST', '/upload', uploadData);
|
|
|
|
if (!uploadJson) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const imageId = uploadJson.data.id;
|
|
|
|
|
|
|
|
const albumData = {
|
|
|
|
'ids[]': imageId,
|
|
|
|
};
|
|
|
|
|
2019-11-14 14:27:51 +00:00
|
|
|
let albumJson;
|
|
|
|
if (!req.body.replace) {
|
|
|
|
if (req.body.album) {
|
|
|
|
albumData.title = req.body.album;
|
|
|
|
}
|
2019-11-14 09:55:43 +00:00
|
|
|
|
2019-11-14 14:27:51 +00:00
|
|
|
albumJson = await fetchImgur(req, res, 'POST', '/album', albumData);
|
|
|
|
if (!albumJson) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(req.body.favorites);
|
|
|
|
if (req.body.favorites) {
|
|
|
|
if (!await fetchImgur(req, res, 'POST', '/album/' + albumJson.data.id +
|
|
|
|
'/favorite', {})) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
req.body.album = undefined;
|
|
|
|
|
|
|
|
const albums = await fetchImgur(req, res, 'GET', '/account/me/albums');
|
|
|
|
if (!albums) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log('albums', albums.data.length);
|
|
|
|
|
|
|
|
let reject = false;
|
|
|
|
const promises = [];
|
|
|
|
for (const album of albums.data) {
|
|
|
|
promises.push(new Promise(async (res, rej) => {
|
|
|
|
if (reject) {
|
|
|
|
return reject;
|
|
|
|
}
|
|
|
|
|
|
|
|
const images = await fetchImgur(req, res, 'GET', '/album/' + album.id +
|
|
|
|
'/images');
|
|
|
|
|
|
|
|
if (!images || reject) {
|
|
|
|
rej();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const image =
|
2019-11-14 15:08:52 +00:00
|
|
|
images.data.filter(e => e.title.match(req.body.oldName))[0];
|
|
|
|
|
|
|
|
console.log('image', image);
|
2019-11-14 14:27:51 +00:00
|
|
|
|
|
|
|
if (!image || reject) {
|
|
|
|
rej();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
reject = true;
|
|
|
|
res({ album: album, image: image });
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
|
2019-11-14 15:08:52 +00:00
|
|
|
let result;
|
|
|
|
try {
|
|
|
|
result = await promiseAny(promises);
|
|
|
|
} catch(_) {
|
|
|
|
res.status(404).json({ error: "No image in gallery found" });
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
console.log('result', result);
|
2019-11-14 14:27:51 +00:00
|
|
|
albumJson = { data: result.album };
|
|
|
|
|
|
|
|
ordealResponse.views = result.image.views;
|
|
|
|
ordealResponse.votes = await fetchImgur(req, res, 'GET', '/gallery/'
|
2019-11-14 15:08:52 +00:00
|
|
|
+ result.album.id + '/votes');
|
|
|
|
|
|
|
|
if (!ordealResponse.votes) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log('votes', ordealResponse.votes);
|
2019-11-14 14:27:51 +00:00
|
|
|
|
|
|
|
if (!await fetchImgur(req, res, 'DELETE', '/image/' + result.image.id)) {
|
|
|
|
return;
|
|
|
|
}
|
2019-11-14 09:55:43 +00:00
|
|
|
|
2019-11-14 14:27:51 +00:00
|
|
|
if (!await fetchImgur(req, res, 'PUT', '/album/' + result.album.id +
|
|
|
|
'/add', { 'ids[]': uploadJson.data.id })) {
|
2019-11-14 09:55:43 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!await fetchImgur(req, res, 'POST', '/gallery/album/' +
|
|
|
|
albumJson.data.id, { title: req.body.album ? req.body.album :
|
|
|
|
req.body.name })) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (req.body.tags) {
|
|
|
|
const tagsData = {
|
|
|
|
'tags': req.body.tags
|
|
|
|
};
|
|
|
|
|
|
|
|
if (!await fetchImgur(req, res, 'POST', '/gallery/tags/' +
|
|
|
|
albumJson.data.id, tagsData)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const tag of req.body.tags.split(',')) {
|
|
|
|
if (!await fetchImgur(req, res, 'POST', '/account/me/follow/tag/' + tag,
|
|
|
|
{})) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-14 14:27:51 +00:00
|
|
|
res.json(ordealResponse);
|
2019-11-14 09:55:43 +00:00
|
|
|
} catch(e) {
|
|
|
|
console.error(e);
|
|
|
|
res.status(500).json(e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2019-11-11 15:58:06 +00:00
|
|
|
/** router for /root */
|
|
|
|
module.exports = router;
|