teddit/routes/save.js

315 行
9.4 KiB
JavaScript
Raw パーマリンク Blame 履歴

このファイルには曖昧(ambiguous)なUnicode文字が含まれています

このファイルには、他の文字と見間違える可能性があるUnicode文字が含まれています。 それが意図的なものと考えられる場合は、この警告を無視して構いません。 それらの文字を表示するにはエスケープボタンを使用します。

const config = require('../config');
const { redis, fetch } = require('../app');
const saveRoutes = require('express').Router();
const processJsonSubreddit = require('../inc/processJsonSubreddit.js');
const tedditApiSubreddit = require('../inc/teddit_api/handleSubreddit.js')();
const processMoreComments = require('../inc/processMoreComments.js')();
saveRoutes.get('/saved', (req, res, next) => {
let saved = req.cookies.saved;
if (!saved || !Array.isArray(saved)) {
return res.render('saved', {
json: null,
user_preferences: req.cookies,
instance_config: config,
});
}
let key = `saved_posts:${saved.join(',')}`;
redis.get(key, (error, json) => {
if (error) {
console.error(
`Error getting saved_post ${saved_post} key from redis.`,
error
);
return res.redirect('/');
}
if (json) {
(async () => {
let processed_json = await processJsonSubreddit(
json,
'redis',
null,
req.cookies,
true
);
if (!processed_json.error) {
return res.render('saved', {
json: processed_json,
user_preferences: req.cookies,
instance_config: config,
});
} else {
return res.render('subreddit', {
json: null,
error: true,
data: processed_json,
user_preferences: req.cookies,
instance_config: config,
});
}
})();
}
});
});
saveRoutes.get('/save/:id', (req, res, next) => {
let post_id = req.params.id;
let redis_key = req.query.rk;
let back = req.query.b;
let saved = req.cookies.saved;
let fetched = req.query.f;
if (!post_id || !redis_key) return res.redirect('/saved');
if (!saved || !Array.isArray(saved)) saved = [];
if (saved.length > 100)
return res.send('You can not save more than 100 posts.');
redis.get(redis_key, (error, json) => {
if (error) {
console.error(
`Error getting the ${redis_key} key from redis (via /save/).`,
error
);
return res.redirect('/');
}
if (json) {
json = JSON.parse(json);
if (fetched === 'true' || redis_key.includes('/comments/'))
json = json[0];
let post_to_save = false;
for (var i = 0; i < json.data.children.length; i++) {
let post = json.data.children[i];
if (post.data.id === post_id) {
post_to_save = post;
break;
}
}
if (post_to_save) {
if (!saved || !Array.isArray(saved)) saved = [];
for (var i = 0; i < saved.length; i++) {
if (post_to_save.data.id === saved[i]) return res.redirect('/saved');
}
let key = `saved_posts:${saved.join(',')}`;
redis.get(key, (error, json) => {
if (error) {
console.error(
`Error getting saved_posts ${key} key from redis.`,
error
);
return res.redirect('/');
}
links = JSON.parse(json);
if (!links) links = [];
links.unshift(post_to_save);
saved.unshift(post_to_save.data.id);
res.cookie('saved', saved, {
maxAge: 3 * 365 * 24 * 60 * 60 * 1000,
httpOnly: true,
});
let new_key = `saved_posts:${saved.join(',')}`;
redis.set(new_key, JSON.stringify(links), (error) => {
if (error)
console.error(`Error saving ${new_key} to redis.`, error);
if (!back) return res.redirect('/saved');
else {
back = back.replace(/§2/g, '?').replace(/§1/g, '&');
return res.redirect(back);
}
});
});
} else {
return res.redirect(`/comments/${post_id}/?save=true&b=${back}`);
}
} else {
return res.redirect(`/comments/${post_id}/?save=true&b=${back}`);
}
});
});
saveRoutes.get('/unsave/:id', (req, res, next) => {
let post_id = req.params.id;
let back = req.query.b;
let saved = req.cookies.saved;
if (!post_id) return res.redirect('/saved');
if (!saved || !Array.isArray(saved)) return res.redirect('/saved');
let key = `saved_posts:${saved.join(',')}`;
redis.get(key, (error, json) => {
if (error) {
console.error(
`Error getting the ${key} key from redis (via /save/).`,
error
);
return res.redirect('/');
}
if (json) {
json = JSON.parse(json);
let post_found = false;
for (var i = 0; i < json.length; i++) {
if (json[i].data.id === post_id) {
post_found = true;
json.splice(i, 1);
for (var j = 0; j < saved.length; j++) {
if (saved[j] === post_id) saved.splice(j, 1);
}
}
}
if (post_found) {
res.cookie('saved', saved, {
maxAge: 3 * 365 * 24 * 60 * 60 * 1000,
httpOnly: true,
});
let new_key = `saved_posts:${saved.join(',')}`;
redis.set(new_key, JSON.stringify(json), (error) => {
if (error) console.error(`Error saving ${new_key} to redis.`, error);
if (!back) return res.redirect('/saved');
else {
back = back.replace(/§2/g, '?').replace(/§1/g, '&');
return res.redirect(back);
}
});
} else {
return res.redirect(`/saved`);
}
} else {
return res.redirect(`/saved`);
}
});
});
saveRoutes.get(
'/comments/:post_id/:comment?/:comment_id?',
(req, res, next) => {
let post_id = req.params.post_id;
let comment = req.params.comment;
let comment_id = req.params.comment_id;
let back = req.query.b;
let save = req.query.save;
let post_url = false;
let comment_url = false;
if (comment)
if (comment !== 'comment' || !comment_id) return res.redirect('/');
if (comment) comment_url = true;
else post_url = true;
let key = `/shorturl:post:${post_id}:comment:${comment_id}`;
redis.get(key, (error, json) => {
if (error) {
console.error(
'Error getting the short URL for post key from redis.',
error
);
return res.render('frontpage', {
json: null,
user_preferences: req.cookies,
instance_config: config,
});
}
if (json) {
console.log('Got short URL for post key from redis.');
json = JSON.parse(json);
if (post_url) {
if (save === 'true')
return res.redirect(`/save/${post_id}/?rk=${key}&b=${back}&f=true`);
return res.redirect(json[0].data.children[0].data.permalink);
} else {
return res.redirect(json[1].data.children[0].data.permalink);
}
} else {
let url = '';
if (config.use_reddit_oauth) {
if (post_url)
url = `https://oauth.reddit.com/comments/${post_id}?api_type=json`;
else
url = `https://oauth.reddit.com/comments/${post_id}/comment/${comment_id}?api_type=json`;
} else {
if (post_url)
url = `https://reddit.com/comments/${post_id}.json?api_type=json`;
else
url = `https://reddit.com/comments/${post_id}/comment/${comment_id}.json?api_type=json`;
}
fetch(encodeURI(url), redditApiGETHeaders())
.then((result) => {
if (result.status === 200) {
result.json().then((json) => {
redis.setex(
key,
config.setexs.shorts,
JSON.stringify(json),
(error) => {
if (error) {
console.error(
'Error setting the short URL for post key to redis.',
error
);
return res.render('frontpage', {
json: null,
user_preferences: req.cookies,
instance_config: config,
});
} else {
console.log(
'Fetched the short URL for post from Reddit.'
);
if (post_url) {
if (save === 'true')
return res.redirect(
`/save/${post_id}/?rk=${key}&b=${back}&f=true`
);
return res.redirect(
json[0].data.children[0].data.permalink
);
} else {
return res.redirect(
json[1].data.children[0].data.permalink
);
}
}
}
);
});
} else {
console.error(
`Something went wrong while fetching data from Reddit. ${result.status} ${result.statusText}`
);
console.error(config.reddit_api_error_text);
return res.render('frontpage', {
json: null,
http_status_code: result.status,
user_preferences: req.cookies,
instance_config: config,
});
}
})
.catch((error) => {
console.error(
'Error fetching the short URL for post with sortby JSON file.',
error
);
});
}
});
}
);
module.exports = saveRoutes;