mirror of
https://codeberg.org/tacerus/teddit.git
synced 2024-11-25 08:39:26 +01:00
separate home route
This commit is contained in:
parent
95e7d2fa60
commit
74c202d5f0
208
routes/home.js
Normal file
208
routes/home.js
Normal file
@ -0,0 +1,208 @@
|
||||
const config = require('../config');
|
||||
const { redis, fetch } = require('../app');
|
||||
const homeRoute = require('express').Router();
|
||||
|
||||
homeRoute.get('/:sort?', async (req, res, next) => {
|
||||
let past = req.query.t;
|
||||
let before = req.query.before;
|
||||
let after = req.query.after;
|
||||
let sortby = req.params.sort || '';
|
||||
let api_req = req.query.api;
|
||||
let api_type = req.query.type;
|
||||
let api_target = req.query.target;
|
||||
|
||||
let proxyable =
|
||||
sortby.includes('.jpg') ||
|
||||
sortby.includes('.png') ||
|
||||
sortby.includes('.jpeg')
|
||||
? true
|
||||
: false;
|
||||
if (proxyable) {
|
||||
let params = new URLSearchParams(req.query).toString();
|
||||
let image_url = `https://preview.redd.it/${sortby}?${params}`;
|
||||
let proxied_image = await downloadAndSave(image_url);
|
||||
if (proxied_image) {
|
||||
return res.redirect(proxied_image);
|
||||
} else {
|
||||
return res.redirect('/');
|
||||
}
|
||||
}
|
||||
|
||||
let d = `&after=${after}`;
|
||||
if (before) {
|
||||
d = `&before=${before}`;
|
||||
}
|
||||
|
||||
if (sortby == '') {
|
||||
sortby = 'hot';
|
||||
}
|
||||
|
||||
if (
|
||||
[
|
||||
'apple-touch-icon.png',
|
||||
'apple-touch-icon-precomposed.png',
|
||||
'apple-touch-icon-120x120.png',
|
||||
'apple-touch-icon-120x120-precomposed.png',
|
||||
].includes(sortby)
|
||||
) {
|
||||
return res.sendStatus(404); // return 404 on shitty apple favicon stuff
|
||||
}
|
||||
|
||||
if (
|
||||
!['new', 'rising', 'controversial', 'top', 'gilded', 'hot'].includes(sortby)
|
||||
) {
|
||||
console.log(`Got invalid sort.`, req.originalUrl);
|
||||
return res.redirect('/');
|
||||
}
|
||||
|
||||
if (past) {
|
||||
if (sortby === 'controversial' || sortby === 'top') {
|
||||
if (!['hour', 'day', 'week', 'month', 'year', 'all'].includes(past)) {
|
||||
console.error(`Got invalid past.`, req.originalUrl);
|
||||
return res.redirect(`/`);
|
||||
}
|
||||
} else {
|
||||
past = undefined;
|
||||
}
|
||||
} else {
|
||||
if (sortby === 'controversial' || sortby === 'top') {
|
||||
past = 'day';
|
||||
}
|
||||
}
|
||||
|
||||
if (req.query.hasOwnProperty('api')) api_req = true;
|
||||
else api_req = false;
|
||||
|
||||
let raw_json = api_req && req.query.raw_json == '1' ? 1 : 0;
|
||||
|
||||
let key = `/after:${after}:before:${before}:sort:${sortby}:past:${past}:raw_json:${raw_json}`;
|
||||
|
||||
let subbed_subreddits = req.cookies.subbed_subreddits;
|
||||
let get_subbed_subreddits = false;
|
||||
if (subbed_subreddits && Array.isArray(subbed_subreddits)) {
|
||||
get_subbed_subreddits = true;
|
||||
subbed_subreddits = subbed_subreddits.join('+');
|
||||
key = `${subbed_subreddits.toLowerCase()}:${after}:${before}:sort:${sortby}:past:${past}:raw_json:${raw_json}`;
|
||||
}
|
||||
|
||||
redis.get(key, (error, json) => {
|
||||
if (error) {
|
||||
console.error('Error getting the frontpage key from redis.', error);
|
||||
return res.render('index', {
|
||||
json: null,
|
||||
user_preferences: req.cookies,
|
||||
});
|
||||
}
|
||||
if (json) {
|
||||
console.log('Got frontpage key from redis.');
|
||||
(async () => {
|
||||
if (api_req) {
|
||||
return handleTedditApiSubreddit(
|
||||
json,
|
||||
req,
|
||||
res,
|
||||
'redis',
|
||||
api_type,
|
||||
api_target,
|
||||
'/'
|
||||
);
|
||||
} else {
|
||||
let processed_json = await processJsonSubreddit(
|
||||
json,
|
||||
'redis',
|
||||
null,
|
||||
req.cookies
|
||||
);
|
||||
return res.render('index', {
|
||||
json: processed_json,
|
||||
sortby: sortby,
|
||||
past: past,
|
||||
user_preferences: req.cookies,
|
||||
redis_key: key,
|
||||
});
|
||||
}
|
||||
})();
|
||||
} else {
|
||||
let url = '';
|
||||
if (config.use_reddit_oauth) {
|
||||
if (get_subbed_subreddits)
|
||||
url = `https://oauth.reddit.com/r/${subbed_subreddits}/${sortby}?api_type=json&count=25&g=GLOBAL&t=${past}${d}&raw_json=${raw_json}`;
|
||||
else
|
||||
url = `https://oauth.reddit.com/${sortby}?api_type=json&g=GLOBAL&t=${past}${d}&raw_json=${raw_json}`;
|
||||
} else {
|
||||
if (get_subbed_subreddits)
|
||||
url = `https://reddit.com/r/${subbed_subreddits}/${sortby}.json?api_type=json&count=25&g=GLOBAL&t=${past}${d}&raw_json=${raw_json}`;
|
||||
else
|
||||
url = `https://reddit.com/${sortby}.json?g=GLOBAL&t=${past}${d}&raw_json=${raw_json}`;
|
||||
}
|
||||
fetch(encodeURI(url), redditApiGETHeaders())
|
||||
.then((result) => {
|
||||
if (result.status === 200) {
|
||||
result.json().then((json) => {
|
||||
redis.setex(
|
||||
key,
|
||||
config.setexs.frontpage,
|
||||
JSON.stringify(json),
|
||||
(error) => {
|
||||
if (error) {
|
||||
console.error(
|
||||
'Error setting the frontpage key to redis.',
|
||||
error
|
||||
);
|
||||
return res.render('index', {
|
||||
json: null,
|
||||
user_preferences: req.cookies,
|
||||
});
|
||||
} else {
|
||||
console.log('Fetched the frontpage from Reddit.');
|
||||
(async () => {
|
||||
if (api_req) {
|
||||
return handleTedditApiSubreddit(
|
||||
json,
|
||||
req,
|
||||
res,
|
||||
'from_online',
|
||||
api_type,
|
||||
api_target,
|
||||
'/'
|
||||
);
|
||||
} else {
|
||||
let processed_json = await processJsonSubreddit(
|
||||
json,
|
||||
'from_online',
|
||||
null,
|
||||
req.cookies
|
||||
);
|
||||
return res.render('index', {
|
||||
json: processed_json,
|
||||
sortby: sortby,
|
||||
past: past,
|
||||
user_preferences: req.cookies,
|
||||
redis_key: key,
|
||||
});
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
} 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 frontpage JSON file.', error);
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = homeRoute;
|
@ -1,3 +1,4 @@
|
||||
const homeRoute = require('./home');
|
||||
const overridingRoutes = require('./overides');
|
||||
const preferenceRoutes = require('./preferences');
|
||||
const saveRoutes = require('./save');
|
||||
@ -15,5 +16,6 @@ allRoutes.use(subredditRoutes);
|
||||
allRoutes.use(userRoutes);
|
||||
allRoutes.use(subscriptionRoutes);
|
||||
allRoutes.use(saveRoutes);
|
||||
allRoutes.use(homeRoute);
|
||||
|
||||
module.exports = allRoutes;
|
||||
|
Loading…
Reference in New Issue
Block a user