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,37 +201,53 @@ 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
from items
left join tags_assign on tags_assign.item_id = items.id
left join tags on tags.id = tags_assign.tag_id
left join favorites on favorites.item_id = items.id
left join "user" on "user".id = favorites.user_id
where
${ db.unsafe(modequery) }
and items.active = 'true'
${ tag ? db`and tags.normalized ilike '%' || slugify(${tag}) || '%'` : db`` }
${ o.fav ? db`and "user".user ilike ${'%'+user+'%'}` : 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) { if (o.fav && user) {
// Special case: random from user's favorites
item = await db`
select
items.id
from favorites
inner join items on favorites.item_id = items.id
inner join "user" on "user".id = favorites.user_id
where
"user".user ilike ${'%' + user + '%'}
and items.active = 'true'
${mime ? db`and items.mime ilike ${smime}` : db``}
order by random()
limit 1
`;
} else {
// Normal random logic
item = await db`
select
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 :("
@ -246,4 +262,4 @@ export default {
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;
}; };