From 29d5b20f5b8f0fc6e9806fec1d8544c3348786d7 Mon Sep 17 00:00:00 2001 From: Flummi Date: Sat, 21 May 2022 13:08:35 +0000 Subject: [PATCH] f0cklib2.0 --- src/inc/lib.mjs | 2 +- src/inc/routeinc/f0cklib.mjs | 184 +++++++++-------------------------- 2 files changed, 49 insertions(+), 137 deletions(-) diff --git a/src/inc/lib.mjs b/src/inc/lib.mjs index d320541..ab701d7 100644 --- a/src/inc/lib.mjs +++ b/src/inc/lib.mjs @@ -63,7 +63,7 @@ export default new class { const link = []; if(env.tag) link.push("tag", env.tag); if(env.user) link.push("user", env.user, env.type ?? 'f0cks'); - if(env.mime.length > 2) link.push(env.mime); + if(env.mime?.length > 2) link.push(env.mime); let tmp = link.length === 0 ? '/' : link.join('/'); if(!tmp.endsWith('/')) diff --git a/src/inc/routeinc/f0cklib.mjs b/src/inc/routeinc/f0cklib.mjs index 836ecfb..a17c76e 100644 --- a/src/inc/routeinc/f0cklib.mjs +++ b/src/inc/routeinc/f0cklib.mjs @@ -8,162 +8,75 @@ export default { getf0cks: async (o = { user, tag, mime, page, mode, fav }) => { const user = o.user ? decodeURI(o.user) : null; const tag = lib.parseTag(o.tag ?? null); - const mime = (o.mime ?? ""); + const mime = o.mime ?? null; const page = +(o.page ?? 1); const smime = cfg.allowedMimes.includes(mime) ? mime + "/%" : mime === "" ? "%" : "%"; - const tmp = { user, tag, mime, smime, page }; - + const tmp = { user, tag, mime, smime, page, mode: o.mode }; const modequery = mime == "audio" ? lib.getMode(0) : lib.getMode(o.mode ?? 0); - - let data; - let total; - if(tag) { - if(tag.match(/sfw/) || tag.length <= 2) - return { - success: false, - message: "nope." - }; + const total = (await db` + select distinct on (items.id) + count(*) as total + 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 + left join tags_assign ta on ta.item_id = items.id and (ta.tag_id = 1 or ta.tag_id = 2) + where + ${ db.unsafe(modequery) } + ${ tag ? db`and tags.normalized ilike ${'%'+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`` } + and items.id not in (select item_id from tags_assign where item_id = items.id and tag_id = 9912) --public filter + group by items.id, tags.tag, ta.tag_id + `)?.[0]?.total || 0; - total = await db` - select count(*) as total - from items - inner join ( - select tags_assign.item_id, tags.tag - from tags - left join tags_assign on tags_assign.tag_id = tags.id - where tags.tag ilike ${'%' + (tag ? tag : '') + '%'} - group by tags_assign.item_id, tags.tag - ) as st on st.item_id = items.id - where ${db.unsafe(modequery)} - group by st.tag, st.item_id`; - - total = total?.length; - } - else { - if(!o.fav) { - total = await db` - select count(*) as total - from items - where ${db.unsafe(modequery)} - and items.mime ilike ${smime} - and items.username ilike ${user ? user : '%'} - `; - total = total[0].total; - } - else { - total = await db` - select count(*) as total - from "favorites" - left join "user" on "user".id = "favorites".user_id - left join "tags_assign" on "tags_assign".item_id = "favorites".item_id - left join "tags" on "tags".id = "tags_assign".tag_id - left join "items" on "items".id = "favorites".item_id - where ${db.unsafe(modequery)} - and "items".mime ilike ${smime} - and "user".user ilike ${user} - group by "items".id - `; - total = total[0]?.total ?? 0; - } - } - - if(!total || total.length === 0) + if(!total || total.length === 0) { return { success: false, message: "404 - no f0cks given" }; - + } + const pages = +Math.ceil(total / cfg.websrv.eps); const act_page = Math.min(pages, page || 1); const offset = Math.max(0, (act_page - 1) * cfg.websrv.eps); - let rows; + const rows = await db` + select distinct on (items.id) + items.id, + items.mime, + tags.tag, + ta.tag_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 + left join tags_assign ta on ta.item_id = items.id and (ta.tag_id = 1 or ta.tag_id = 2) + where + ${ db.unsafe(modequery) } + ${ tag ? db`and tags.normalized ilike ${'%'+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`` } + and items.id not in (select item_id from tags_assign where item_id = items.id and tag_id = 9912) --public filter + group by items.id, tags.tag, ta.tag_id + order by items.id desc + offset ${offset} + limit ${cfg.websrv.eps} + `; - if(!o.fav) { - rows = db` - select "items".id, "items".mime, "tags_assign".tag_id - from "items" - left join "tags_assign" on "tags_assign".item_id = "items".id and ("tags_assign".tag_id = 1 or "tags_assign".tag_id = 2) - ${tag - ? db` - inner join ( - select "tags_assign".item_id, "tags".tag - from "tags" - left join "tags_assign" on "tags_assign".tag_id = "tags".id - where "tags".tag ilike ${'%' + tag + '%'} - group by "tags_assign".item_id, "tags".tag - ) as st on st.item_id = "items".id - ` - : db`` - } - where ${db.unsafe(modequery)} - and "items".mime ilike ${smime} - and "items".username ilike ${user ? user : '%'} - ${tag - ? db`group by st.item_id, "items".id, "tags_assign".tag_id` - : db`` - } - order by "items".id desc - offset ${offset} - limit ${cfg.websrv.eps} - `; - } - else { - rows = db` - select "items".id, "items".mime, ta.tag_id - from "favorites" - left join "user" on "user".id = "favorites".user_id - left join "tags_assign" on "tags_assign".item_id = "favorites".item_id - left join "tags" on "tags".id = "tags_assign".tag_id - left join "items" on "items".id = "favorites".item_id - left join "tags_assign" as ta on ta.item_id = "items".id and (ta.tag_id = 1 or ta.tag_id = 2) - ${ tag - ? db` - inner join ( - select "tags_assign".item_id, "tags".tag - from "tags" - left join "tags_assign" on "tags_assign".tag_id = "tags".id - where "tags".tag ilike ${'%' + tag + '%'} - group by "tags_assign".item_id, "tags".tag - ) as st on st.item_id = "items".id` - : db`` - } - where ${db.unsafe(modequery)} - and "items".mime ilike ${smime} - and "user".user ilike ${user} - ${tag - ? db`group by st.item_id, "items".id, "tags_assign".tag_id` - : db`` - } - group by "items".id, ta.tag_id - order by "items".id desc - offset ${offset} - limit ${cfg.websrv.eps} - `; - } - - rows = await rows; - - if(rows.length === 0) - return { - success: false, - message: "oopsi woopsi" - }; - - /*rows.forEach(e => { - if(!fs.existsSync(`public/t/${e.id}.png`)) - fs.copyFileSync("public/s/img/broken.png", `public/t/${e.id}.png`); - });*/ - const cheat = []; for(let i = Math.max(1, act_page - 3); i <= Math.min(act_page + 3, pages); i++) cheat.push(i); const link = lib.genLink({ user, tag, mime, type: o.fav ? 'favs' : 'f0cks', path: 'p/' }); - data = { + return { success: true, items: rows, pagination: { @@ -177,7 +90,6 @@ export default { link, tmp }; - return data; }, getf0ck: async (o = ({ user, tag, mime, itemid, mode })) => { const user = o.user ? decodeURI(o.user) : null;