const config = require('../config'); const { redis, fetch } = require('../app'); const saveRoutes = require('express').Router(); const processPost = require('../inc/processJsonPost.js')(); const processAbout = require('../inc/processSubredditAbout.js')(); const tedditApiUser = require('../inc/teddit_api/handleUser.js')(); const processSearches = require('../inc/processSearchResults.js')(); const processSubreddit = require('../inc/processJsonSubreddit.js')(); const tedditApiSubreddit = require('../inc/teddit_api/handleSubreddit.js')(); const processMoreComments = require('../inc/processMoreComments.js')(); const processSubredditsExplore = require('../inc/processSubredditsExplore.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, }); } 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, }); } else { return res.render('subreddit', { json: null, error: true, data: processed_json, user_preferences: req.cookies, }); } })(); } }); }); 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('index', { json: null, user_preferences: req.cookies, }); } 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('index', { json: null, user_preferences: req.cookies, }); } 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('index', { json: null, http_status_code: result.status, user_preferences: req.cookies, }); } }) .catch((error) => { console.error( 'Error fetching the short URL for post with sortby JSON file.', error ); }); } }); } ); module.exports = saveRoutes;