From aae3e00ab11bd5e46732c3d801ea00c307775c66 Mon Sep 17 00:00:00 2001 From: json Date: Tue, 7 Sep 2021 14:24:10 +0100 Subject: [PATCH] convert processSubredditAbout to async function --- inc/processSubredditAbout.js | 213 +++++++++++++++++++---------------- routes/subreddit.js | 2 +- 2 files changed, 114 insertions(+), 101 deletions(-) diff --git a/inc/processSubredditAbout.js b/inc/processSubredditAbout.js index af13604..f6505af 100644 --- a/inc/processSubredditAbout.js +++ b/inc/processSubredditAbout.js @@ -1,106 +1,119 @@ -module.exports = function() { - const config = require('../config') - this.processSubredditAbout = (subreddit, redis, fetch, RedditAPI) => { - return new Promise(resolve => { - (async () => { - if(subreddit && !subreddit.includes('+') && subreddit !== 'all') { - function returnRelevantKeys(json) { - return { - title: json.data.title, - public_description_html: json.data.public_description_html, - active_user_count: json.data.active_user_count, - subscribers: json.data.subscribers, - created_utc: json.data.created_utc, - over18: json.data.over18, - description_html: json.data.description_html, - moderators: json.moderators - } - } - - let key = `${subreddit}:sidebar` - redis.get(key, (error, json) => { - if(error) { - console.error(`Error getting the ${subreddit}:sidebar key from redis.`, error) - resolve(null) - } - if(json) { - json = JSON.parse(json) - resolve(returnRelevantKeys(json)) - } else { - let url = `https://reddit.com/r/${subreddit}/about.json` - if(config.use_reddit_oauth) { - url = `https://oauth.reddit.com/r/${subreddit}/about` - } - fetch(encodeURI(url), redditApiGETHeaders()) - .then(result => { - if(result.status === 200) { - result.json() - .then(json => { - json.moderators = [] - redis.setex(key, config.setexs.sidebar, JSON.stringify(json), (error) => { - if(error) { - console.error('Error setting the sidebar key to redis.', error) - return res.render('index', { json: null, user_preferences: req.cookies }) - } else { - console.log('Fetched the sidebar from reddit API.') - let moderators_url = `https://reddit.com/r/${subreddit}/about/moderators.json` - if(config.use_reddit_oauth) { - moderators_url = `https://oauth.reddit.com/r/${subreddit}/about/moderators` - } - resolve(returnRelevantKeys(json)) - /* - * The following code is commented out because Reddit doesn't - * anymore support fetching moderators for subreddits - * when not logged in. - * This might change in the future though. - * https://codeberg.org/teddit/teddit/issues/207 - */ - - /* - fetch(encodeURI(moderators_url), redditApiGETHeaders()) - .then(mod_result => { - if(mod_result.status === 200) { - mod_result.json() - .then(mod_json => { - json.moderators = mod_json - redis.setex(key, config.setexs.sidebar, JSON.stringify(json), (error) => { - if(error) { - console.error('Error setting the sidebar with moderators key to redis.', error) - return res.render('index', { json: null, user_preferences: req.cookies }) - } else { - console.log('Fetched the moderators from reddit API.') - resolve(returnRelevantKeys(json)) - } - }) - }) - } else { - console.error(`Something went wrong while fetching moderators data from reddit API. ${mod_result.status} – ${mod_result.statusText}`) - console.error(config.reddit_api_error_text) - resolve(returnRelevantKeys(json)) - } - }).catch(error => { - console.error('Error fetching moderators.', error) - resolve(returnRelevantKeys(json)) - }) - */ +const config = require('../config'); + +async function processSubredditAbout(subreddit, redis, fetch, RedditAPI) { + if (subreddit && !subreddit.includes('+') && subreddit !== 'all') { + function returnRelevantKeys(json) { + return { + title: json.data.title, + public_description_html: json.data.public_description_html, + active_user_count: json.data.active_user_count, + subscribers: json.data.subscribers, + created_utc: json.data.created_utc, + over18: json.data.over18, + description_html: json.data.description_html, + moderators: json.moderators, + }; + } + + let key = `${subreddit}:sidebar`; + redis.get(key, (error, json) => { + if (error) { + console.error( + `Error getting the ${subreddit}:sidebar key from redis.`, + error + ); + return null; + } + if (json) { + json = JSON.parse(json); + return returnRelevantKeys(json); + } else { + let url = `https://reddit.com/r/${subreddit}/about.json`; + if (config.use_reddit_oauth) { + url = `https://oauth.reddit.com/r/${subreddit}/about`; + } + fetch(encodeURI(url), redditApiGETHeaders()) + .then((result) => { + if (result.status === 200) { + result.json().then((json) => { + json.moderators = []; + redis.setex( + key, + config.setexs.sidebar, + JSON.stringify(json), + (error) => { + if (error) { + console.error( + 'Error setting the sidebar key to redis.', + error + ); + return res.render('index', { + json: null, + user_preferences: req.cookies, + }); + } else { + console.log('Fetched the sidebar from reddit API.'); + let moderators_url = `https://reddit.com/r/${subreddit}/about/moderators.json`; + if (config.use_reddit_oauth) { + moderators_url = `https://oauth.reddit.com/r/${subreddit}/about/moderators`; } - }) + return returnRelevantKeys(json); + /* + * The following code is commented out because Reddit doesn't + * anymore support fetching moderators for subreddits + * when not logged in. + * This might change in the future though. + * https://codeberg.org/teddit/teddit/issues/207 + */ + + /* + fetch(encodeURI(moderators_url), redditApiGETHeaders()) + .then(mod_result => { + if(mod_result.status === 200) { + mod_result.json() + .then(mod_json => { + json.moderators = mod_json + redis.setex(key, config.setexs.sidebar, JSON.stringify(json), (error) => { + if(error) { + console.error('Error setting the sidebar with moderators key to redis.', error) + return res.render('index', { json: null, user_preferences: req.cookies }) + } else { + console.log('Fetched the moderators from reddit API.') + return(returnRelevantKeys(json)) + } + }) + }) + } else { + console.error(`Something went wrong while fetching moderators data from reddit API. ${mod_result.status} – ${mod_result.statusText}`) + console.error(config.reddit_api_error_text) + return(returnRelevantKeys(json)) + } + }).catch(error => { + console.error('Error fetching moderators.', error) + return(returnRelevantKeys(json)) }) - } else { - console.error(`Something went wrong while fetching data from reddit API. ${result.status} – ${result.statusText}`) - console.error(config.reddit_api_error_text) - resolve(null) - } - }).catch(error => { - console.error('Error fetching the sidebar.', error) - resolve(null) - }) + */ + } + } + ); + }); + } else { + console.error( + `Something went wrong while fetching data from reddit API. ${result.status} – ${result.statusText}` + ); + console.error(config.reddit_api_error_text); + return null; } }) - } else { - resolve(null) - } - })() - }) + .catch((error) => { + console.error('Error fetching the sidebar.', error); + return null; + }); + } + }); + } else { + return null; } } + +module.exports = processSubredditAbout; diff --git a/routes/subreddit.js b/routes/subreddit.js index e56676c..4a1ea21 100644 --- a/routes/subreddit.js +++ b/routes/subreddit.js @@ -6,7 +6,7 @@ const { processJsonPost, finalizeJsonPost, } = require('../inc/processJsonPost.js'); -const processAbout = require('../inc/processSubredditAbout.js')(); +const processSubredditAbout = require('../inc/processSubredditAbout.js'); const tedditApiUser = require('../inc/teddit_api/handleUser.js')(); const processSearches = require('../inc/processSearchResults.js')(); const processSubreddit = require('../inc/processJsonSubreddit.js')();