From 22db479bc2a82c516f77169a4271440a9e1c2cbf Mon Sep 17 00:00:00 2001 From: Kibi Kelburton Date: Thu, 13 Aug 2026 21:33:08 +0200 Subject: [PATCH] public no untagged --- src/inc/lib.mjs | 13 ++++++++----- src/inc/routeinc/f0cklib.mjs | 7 ++++--- src/inc/routes/apiv2/index.mjs | 13 +++++++------ src/inc/routes/comments.mjs | 2 +- src/inc/routes/scroller.mjs | 3 ++- src/inc/routes/toptags.mjs | 5 +++-- src/inc/routes/user_tags.mjs | 5 +++-- 7 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/inc/lib.mjs b/src/inc/lib.mjs index bc9fffa..d85df5f 100644 --- a/src/inc/lib.mjs +++ b/src/inc/lib.mjs @@ -95,21 +95,22 @@ export default new class { getMode(mode) { let tmp; mode = Number(mode); + const nsflId = parseInt(cfg.nsfl_tag_id, 10) || 3; switch (mode) { case 1: // nsfw tmp = "items.id in (select item_id from tags_assign where tag_id = 2)"; break; case 2: // untagged - tmp = "not exists (select 1 from tags_assign where item_id = items.id)"; + tmp = `not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId}))`; break; case 3: // all tmp = "1 = 1"; break; case 4: // nsfl - tmp = cfg.enable_nsfl ? `items.id in (select item_id from tags_assign where tag_id = ${parseInt(cfg.nsfl_tag_id, 10) || 3})` : "1 = 0"; + tmp = cfg.enable_nsfl ? `items.id in (select item_id from tags_assign where tag_id = ${nsflId})` : "1 = 0"; break; default: // sfw - tmp = "(items.id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id))"; + tmp = `(items.id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})))`; break; } return tmp; @@ -140,7 +141,8 @@ export default new class { parts.push(`items.id in (select item_id from tags_assign where tag_id = ${parseInt(cfg.nsfl_tag_id, 10) || 3})`); } if (filtered.includes('untagged')) { - parts.push('not exists (select 1 from tags_assign where item_id = items.id)'); + const nsflId = parseInt(cfg.nsfl_tag_id, 10) || 3; + parts.push(`not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId}))`); } if (parts.length === 0) return null; return '(' + parts.join(' OR ') + ')'; @@ -202,10 +204,11 @@ export default new class { from "items" where id in (select item_id from tags_assign group by item_id) and active = true and is_deleted = false `)[0].total; + const nsflId = parseInt(cfg.nsfl_tag_id, 10) || 3; const untagged = +(await db` select count(*) as total from "items" - where not exists (select 1 from tags_assign where item_id = items.id) and active = true and is_deleted = false + where not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})) and active = true and is_deleted = false `)[0].total; const sfw = +(await db` select count(*) as total diff --git a/src/inc/routeinc/f0cklib.mjs b/src/inc/routeinc/f0cklib.mjs index aaba987..a1239db 100644 --- a/src/inc/routeinc/f0cklib.mjs +++ b/src/inc/routeinc/f0cklib.mjs @@ -32,14 +32,15 @@ const computeBaseMode = (mode, ratings, session) => { } if (!session) { - if ((effMode === 3 || mode === undefined || mode === null) && (!ratingsArr || ratingsArr.length <= 1)) { + const nsflId = parseInt(cfg.nsfl_tag_id, 10) || 3; + if ((effMode === 0 || effMode === 3 || mode === undefined || mode === null) && (!ratingsArr || ratingsArr.length <= 1)) { if (cfg.websrv.public_nsfw) { baseMode = cfg.websrv.public_untagged - ? "(items.id in (select item_id from tags_assign where tag_id in (1, 2)) or not exists (select 1 from tags_assign where item_id = items.id))" + ? `(items.id in (select item_id from tags_assign where tag_id in (1, 2)) or not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})))` : "items.id in (select item_id from tags_assign where tag_id in (1, 2))"; } else { baseMode = cfg.websrv.public_untagged - ? "(items.id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id))" + ? `(items.id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})))` : "items.id in (select item_id from tags_assign where tag_id = 1)"; } } else if (!cfg.websrv.public_untagged) { diff --git a/src/inc/routes/apiv2/index.mjs b/src/inc/routes/apiv2/index.mjs index 41fc349..cb25e45 100644 --- a/src/inc/routes/apiv2/index.mjs +++ b/src/inc/routes/apiv2/index.mjs @@ -720,7 +720,7 @@ export default router => { const newest = (await db`select max(id) as id from "items"`)[0]?.id || 0; const oldest = (await db`select min(id) as id from "items"`)[0]?.id || 0; - const modequery = lib.getMode(opt.mode); + const modequery = f0cklib.computeBaseMode(opt.mode, null, req.session); const rows = (await db` select "items".id, "items".mime, coalesce("tags_assign".tag_id, 0) as tag_id @@ -796,18 +796,19 @@ export default router => { let guestTagFilter = db``; if (!session) { - const itemTags = await db`SELECT tag_id FROM tags_assign WHERE item_id = ${+id}`; - const isTagged = itemTags.length > 0; - if (!isTagged && !cfg.websrv.public_untagged) { + const nsflId = parseInt(cfg.nsfl_tag_id, 10) || 3; + const itemRatingTags = await db`SELECT tag_id FROM tags_assign WHERE item_id = ${+id} AND tag_id IN (1, 2, ${nsflId})`; + const hasRatingTag = itemRatingTags.length > 0; + if (!hasRatingTag && !cfg.websrv.public_untagged) { return res.json({ success: false, msg: 'no items found' }); } if (cfg.websrv.public_nsfw) { guestTagFilter = cfg.websrv.public_untagged - ? db`and (id in (select item_id from tags_assign where tag_id in (1, 2)) or not exists (select 1 from tags_assign where item_id = items.id))` + ? db`and (id in (select item_id from tags_assign where tag_id in (1, 2)) or not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})))` : db`and id in (select item_id from tags_assign where tag_id in (1, 2))`; } else { guestTagFilter = cfg.websrv.public_untagged - ? db`and (id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id))` + ? db`and (id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})))` : db`and id in (select item_id from tags_assign where tag_id = 1)`; } } diff --git a/src/inc/routes/comments.mjs b/src/inc/routes/comments.mjs index 0eed96d..8fd3feb 100644 --- a/src/inc/routes/comments.mjs +++ b/src/inc/routes/comments.mjs @@ -173,7 +173,7 @@ export default (router, tpl) => { const multiRatingSQL = (ratingsArr && ratingsArr.length > 0) ? lib.getMultiRatingMode(ratingsArr) : null; // Build mode SQL — replace items.id alias with i.id used in the activity query - const modequery = (multiRatingSQL ?? lib.getMode(mode)).replace(/items\.id/g, 'i.id'); + const modequery = f0cklib.computeBaseMode(mode, ratingsArr, req.session).replace(/items\.id/g, 'i.id'); const comments = await db` SELECT c.*, i.mime, i.id as item_id, i.slug as item_slug diff --git a/src/inc/routes/scroller.mjs b/src/inc/routes/scroller.mjs index 5c051d7..8fa378c 100644 --- a/src/inc/routes/scroller.mjs +++ b/src/inc/routes/scroller.mjs @@ -1,6 +1,7 @@ import cfg from "../config.mjs"; import db from "../sql.mjs"; import lib from "../lib.mjs"; +import f0cklib from "../routeinc/f0cklib.mjs"; export default (router, tpl) => { // Serve the scroller page @@ -163,7 +164,7 @@ export default (router, tpl) => { const excludeIds = qs.exclude ? qs.exclude.split(',').map(n => parseInt(n, 10)).filter(n => !isNaN(n) && n > 0).slice(0, 500) : []; - const modeQuery = lib.getMode(mode ?? 0); + const modeQuery = f0cklib.computeBaseMode(mode ?? 0, null, req.session); const nsfp = cfg.nsfp?.length ? cfg.nsfp.map(n => `tag_id = ${n}`).join(' or ') : null; // anchor= is a specific item ID to include first in the batch (used for hash-based deep links) const anchorId = qs.anchor ? parseInt(qs.anchor, 10) : null; diff --git a/src/inc/routes/toptags.mjs b/src/inc/routes/toptags.mjs index 7fc55a6..7a4eb9f 100644 --- a/src/inc/routes/toptags.mjs +++ b/src/inc/routes/toptags.mjs @@ -11,14 +11,15 @@ export default (router, tpl) => { const isGuest = !sessionObj; let baseMode = lib.getMode(mode); if (isGuest) { + const nsflId = parseInt(cfg.nsfl_tag_id, 10) || 3; if (mode === 3 || mode === 0 || mode === undefined || mode === null) { if (cfg.websrv.public_nsfw) { baseMode = cfg.websrv.public_untagged - ? "(items.id in (select item_id from tags_assign where tag_id in (1, 2)) or not exists (select 1 from tags_assign where item_id = items.id))" + ? `(items.id in (select item_id from tags_assign where tag_id in (1, 2)) or not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})))` : "items.id in (select item_id from tags_assign where tag_id in (1, 2))"; } else { baseMode = cfg.websrv.public_untagged - ? "(items.id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id))" + ? `(items.id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})))` : "items.id in (select item_id from tags_assign where tag_id = 1)"; } } else if (!cfg.websrv.public_untagged && mode === 2) { diff --git a/src/inc/routes/user_tags.mjs b/src/inc/routes/user_tags.mjs index e72f924..f8648f6 100644 --- a/src/inc/routes/user_tags.mjs +++ b/src/inc/routes/user_tags.mjs @@ -11,14 +11,15 @@ export default (router, tpl) => { const isGuest = !sessionObj; let baseMode = lib.getMode(mode); if (isGuest) { + const nsflId = parseInt(cfg.nsfl_tag_id, 10) || 3; if (mode === 3 || mode === 0 || mode === undefined || mode === null) { if (cfg.websrv.public_nsfw) { baseMode = cfg.websrv.public_untagged - ? "(items.id in (select item_id from tags_assign where tag_id in (1, 2)) or not exists (select 1 from tags_assign where item_id = items.id))" + ? `(items.id in (select item_id from tags_assign where tag_id in (1, 2)) or not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})))` : "items.id in (select item_id from tags_assign where tag_id in (1, 2))"; } else { baseMode = cfg.websrv.public_untagged - ? "(items.id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id))" + ? `(items.id in (select item_id from tags_assign where tag_id = 1) or not exists (select 1 from tags_assign where item_id = items.id and tag_id in (1, 2, ${nsflId})))` : "items.id in (select item_id from tags_assign where tag_id = 1)"; } } else if (!cfg.websrv.public_untagged && mode === 2) {