potential fix for favorites in production, let's try

This commit is contained in:
x 2025-04-27 21:09:07 +02:00
parent e18270a1ce
commit 52b83dee3a
2 changed files with 58 additions and 40 deletions

View File

@ -201,49 +201,65 @@ export default {
tmp tmp
}; };
return data; return data;
}, },getRandom: async (o = ({ user, tag, mime, mode, fav, session })) => {
getRandom: async (o = ({ user, tag, mime, mode, session })) => { const user = o.user ? decodeURI(o.user) : null;
const user = o.user ? decodeURI(o.user) : null; const tag = lib.parseTag(o.tag ?? null);
const tag = lib.parseTag(o.tag ?? null); const mime = (o.mime ?? "");
const mime = (o.mime ?? ""); const smime = cfg.allowedMimes.includes(mime) ? mime + "/%" : mime === "" ? "%" : "%";
const smime = cfg.allowedMimes.includes(mime) ? mime + "/%" : mime === "" ? "%" : "%";
const modequery = mime == "audio" ? lib.getMode(0) : lib.getMode(o.mode ?? 0); const modequery = mime == "audio" ? lib.getMode(0) : lib.getMode(o.mode ?? 0);
const item = await db` let item;
select
items.id if (o.fav && user) {
from items // Special case: random from user's favorites
left join tags_assign on tags_assign.item_id = items.id item = await db`
left join tags on tags.id = tags_assign.tag_id select
left join favorites on favorites.item_id = items.id items.id
left join "user" on "user".id = favorites.user_id from favorites
where inner join items on favorites.item_id = items.id
${ db.unsafe(modequery) } inner join "user" on "user".id = favorites.user_id
and items.active = 'true' where
${ tag ? db`and tags.normalized ilike '%' || slugify(${tag}) || '%'` : db`` } "user".user ilike ${'%' + user + '%'}
${ o.fav ? db`and "user".user ilike ${'%'+user+'%'}` : db`` } and items.active = 'true'
${ user ? db`and items.username ilike ${'%'+user+'%'}` : db`` } ${mime ? db`and items.mime ilike ${smime}` : db``}
${ mime ? db`and items.mime ilike ${smime}` : db`` } order by random()
${ !o.session && globalfilter ? db`and items.id not in (select item_id from tags_assign where item_id = items.id and (${db.unsafe(globalfilter)}))` : db`` } limit 1
group by items.id, tags.tag `;
order by random() } else {
limit 1 // Normal random logic
`; item = await db`
select
if(item.length === 0) { items.id
from items
left join tags_assign on tags_assign.item_id = items.id
left join tags on tags.id = tags_assign.tag_id
where
${db.unsafe(modequery)}
and items.active = 'true'
${tag ? db`and tags.normalized ilike '%' || slugify(${tag}) || '%'` : db``}
${user ? db`and items.username ilike ${'%' + user + '%'}` : db``}
${mime ? db`and items.mime ilike ${smime}` : db``}
${!o.session && globalfilter ? db`and items.id not in (select item_id from tags_assign where item_id = items.id and (${db.unsafe(globalfilter)}))` : db``}
group by items.id, tags.tag
order by random()
limit 1
`;
}
if (item.length === 0) {
return { return {
success: false, success: false,
message: "no f0cks found :(" message: "no f0cks found :("
}; };
} }
const link = lib.genLink({ user, tag, mime, type: o.fav ? 'favs' : 'f0cks' }); const link = lib.genLink({ user, tag, mime, type: o.fav ? 'favs' : 'f0cks' });
return { return {
success: true, success: true,
link: link, link: link,
itemid: item[0].id itemid: item[0].id
}; };
} }
}; };

View File

@ -1,5 +1,4 @@
import cfg from "../../inc/config.mjs"; import cfg from "../../inc/config.mjs";
import lib from "../lib.mjs";
import f0cklib from "../routeinc/f0cklib.mjs"; import f0cklib from "../routeinc/f0cklib.mjs";
export default (router, tpl) => { export default (router, tpl) => {
@ -7,12 +6,14 @@ export default (router, tpl) => {
let referer = req.headers.referer ?? ''; let referer = req.headers.referer ?? '';
let opts = {}; let opts = {};
if(referer.match(new RegExp(cfg.main.url.regex))) { // parse referer if (referer.match(new RegExp(cfg.main.url.regex))) { // parse referer
referer = referer.split(cfg.main.url.domain)[1]; referer = referer.split(cfg.main.url.domain)[1];
console.log("referer: ", referer); console.log("referer: ", referer);
const tmp = referer.match(/^\/?(?:\/tag\/(?<tag>.+?))?(?:\/user\/(?<user>.+?)\/(?<mode>f0cks|favs))?(?:\/(?<mime>image|audio|video))?(?:\/p\/(?<page>\d+))?(?:\/(?<itemid>\d+))?$/); const tmp = referer.match(/^\/?(?:\/tag\/(?<tag>.+?))?(?:\/user\/(?<user>.+?)\/(?<mode>f0cks|favs))?(?:\/(?<mime>image|audio|video))?(?:\/p\/(?<page>\d+))?(?:\/(?<itemid>\d+))?$/);
console.log("tmp: ", tmp); console.log("tmp: ", tmp);
if(tmp)
if (tmp && tmp.groups)
opts = tmp.groups; opts = tmp.groups;
} }
@ -21,14 +22,14 @@ export default (router, tpl) => {
tag: opts.tag, tag: opts.tag,
mime: opts.mime, mime: opts.mime,
page: opts.page, page: opts.page,
fav: opts.mode == 'favs', fav: opts.mode === 'favs',
mode: req.session.mode, mode: req.session.mode,
session: !!req.session session: !!req.session
}); });
console.log("data", data); console.log("data", data);
if(!data.success) { if (!data.success) {
return res.reply({ return res.reply({
code: 404, code: 404,
body: tpl.render('error', { body: tpl.render('error', {
@ -40,5 +41,6 @@ export default (router, tpl) => {
res.redirect(encodeURI(`${data.link.main}${data.link.path}${data.itemid}`)); res.redirect(encodeURI(`${data.link.main}${data.link.path}${data.itemid}`));
}); });
return router; return router;
}; };