public no untagged

This commit is contained in:
2026-08-13 21:33:08 +02:00
parent 9ec07e8e6c
commit 22db479bc2
7 changed files with 28 additions and 20 deletions

View File

@@ -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

View File

@@ -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) {

View File

@@ -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)`;
}
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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) {