gsdf
This commit is contained in:
@@ -487,7 +487,7 @@ const f0cklib = {
|
||||
${visibilityFilter}
|
||||
${tagFilter}
|
||||
${titleFilter}
|
||||
${fav ? db`and fav_u.user ilike ${user}` : db``}
|
||||
${fav ? db`and (fav_u.user ilike ${user} or fav_u.login ilike ${user})` : db``}
|
||||
${!fav && user ? db`and items.username ilike ${user}` : db``}
|
||||
${mimeSQL}
|
||||
${hallFilter}
|
||||
@@ -513,7 +513,7 @@ const f0cklib = {
|
||||
${visibilityFilter}
|
||||
${tagFilter}
|
||||
${titleFilter}
|
||||
${fav ? db`and fav_u.user ilike ${user}` : db``}
|
||||
${fav ? db`and (fav_u.user ilike ${user} or fav_u.login ilike ${user})` : db``}
|
||||
${!fav && user ? db`and items.username ilike ${user}` : db``}
|
||||
${mimeSQL}
|
||||
${hallFilter}
|
||||
@@ -531,7 +531,7 @@ const f0cklib = {
|
||||
const totalBefore = Number(countRows[0]?.total_before || 0);
|
||||
return Math.floor(totalBefore / eps) + 1;
|
||||
},
|
||||
getf0cks: async ({ user: rawUser, tag: rawTag, hall: rawHall, mime: rawMime, page, mode, ratings, fav, session, limit, strict, newer, exclude, user_id, is_admin, random, userHall: rawUserHall, userHallOwner: rawUserHallOwner, minXdScore, tagger: rawTagger } = {}) => {
|
||||
getf0cks: async ({ user: rawUser, tag: rawTag, hall: rawHall, mime: rawMime, page, mode, ratings, fav, session, limit, strict, newer, exclude, user_id, is_admin, random, userHall: rawUserHall, userHallOwner: rawUserHallOwner, minXdScore, tagger: rawTagger, ids, total: explicitTotal } = {}) => {
|
||||
if (fav && rawUser) {
|
||||
const { isPrivate, isAllowed } = await checkFavoritesAccess(rawUser, { session, user_id, is_admin });
|
||||
if (isPrivate && !isAllowed) {
|
||||
@@ -543,6 +543,20 @@ const f0cklib = {
|
||||
}
|
||||
}
|
||||
|
||||
const cleanIds = Array.isArray(ids)
|
||||
? ids.map(Number).filter(n => Number.isInteger(n) && n > 0)
|
||||
: (typeof ids === 'string' ? ids.split(',').map(Number).filter(n => Number.isInteger(n) && n > 0) : null);
|
||||
|
||||
if (cleanIds !== null && cleanIds.length === 0) {
|
||||
return {
|
||||
success: false,
|
||||
message: "404 - no uploads found",
|
||||
items: [],
|
||||
total: 0
|
||||
};
|
||||
}
|
||||
const idsFilter = (cleanIds && cleanIds.length > 0) ? db`and items.id = ANY(${cleanIds}::int[])` : db``;
|
||||
|
||||
const filters = await buildFeedFilters({
|
||||
rawUser,
|
||||
rawTag,
|
||||
@@ -593,20 +607,21 @@ const f0cklib = {
|
||||
const tmp = { user, tag: isTitleSearch ? _decodedTag : tag, hall: hallObj || hall, mime, page: actPage, mode: mode, view_mode: fav ? 'favs' : 'uploads', strict: strict, userHall: userHallObj || userHallSlug, userHallOwner, tagger };
|
||||
|
||||
const cacheKey = buildCountCacheKey({ modequery, tag, user, hall, mime, fav, session, excludedTags, newerThan, minXd, userHallObj, tagger });
|
||||
let total = getCachedCount(cacheKey);
|
||||
let total = (explicitTotal !== undefined && explicitTotal !== null) ? Number(explicitTotal) : getCachedCount(cacheKey);
|
||||
|
||||
if (total === null) {
|
||||
const totalRows = await db`
|
||||
select count(distinct items.id) as total
|
||||
from items
|
||||
${fav ? db`inner join favorites on favorites.item_id = items.id inner join "user" fav_u on fav_u.id = favorites.user_id` : db``}
|
||||
${fav && user ? db`inner join favorites on favorites.item_id = items.id inner join "user" fav_u on fav_u.id = favorites.user_id` : db``}
|
||||
where
|
||||
${db.unsafe(modequery)}
|
||||
and items.active = true
|
||||
${visibilityFilter}
|
||||
${tagFilter}
|
||||
${titleFilter}
|
||||
${fav ? db`and fav_u.user ilike ${user}` : db``}
|
||||
${idsFilter}
|
||||
${fav && user ? db`and (fav_u.user ilike ${user} or fav_u.login ilike ${user})` : db``}
|
||||
${!fav && user ? db`and items.username ilike ${user}` : db``}
|
||||
${mimeSQL}
|
||||
${hallFilter}
|
||||
@@ -617,7 +632,7 @@ const f0cklib = {
|
||||
${xdFilter}
|
||||
`;
|
||||
total = Number(totalRows[0].total);
|
||||
if (total > 0) setCachedCount(cacheKey, total);
|
||||
if (total > 0 && !cleanIds) setCachedCount(cacheKey, total);
|
||||
}
|
||||
|
||||
if (!total || total === 0) {
|
||||
@@ -639,7 +654,7 @@ const f0cklib = {
|
||||
const pageIdRows = await db`
|
||||
select items.id, items.is_pinned
|
||||
from items
|
||||
${fav ? db`
|
||||
${fav && user ? db`
|
||||
inner join favorites on favorites.item_id = items.id
|
||||
inner join "user" fav_u on fav_u.id = favorites.user_id
|
||||
` : db``}
|
||||
@@ -649,7 +664,8 @@ const f0cklib = {
|
||||
${visibilityFilter}
|
||||
${tagFilter}
|
||||
${titleFilter}
|
||||
${fav ? db`and fav_u.user ilike ${user}` : db``}
|
||||
${idsFilter}
|
||||
${fav && user ? db`and (fav_u.user ilike ${user} or fav_u.login ilike ${user})` : db``}
|
||||
${!fav && user ? db`and items.username ilike ${user}` : db``}
|
||||
${mimeSQL}
|
||||
${hallFilter}
|
||||
@@ -658,8 +674,14 @@ const f0cklib = {
|
||||
${excludedTags.length > 0 ? db`and not exists (select 1 from tags_assign where item_id = items.id and tag_id = any(${excludedTags}::int[]))` : db``}
|
||||
${newerThan ? db`and items.id > ${newerThan}` : db``}
|
||||
${xdFilter}
|
||||
${fav ? db`group by items.id, items.is_pinned` : db``}
|
||||
order by ${random ? db`random()` : db`items.is_pinned desc, items.id desc`}
|
||||
${fav && user ? db`group by items.id, items.is_pinned` : db``}
|
||||
order by ${
|
||||
random ? db`random()` : (
|
||||
(fav && !user && cleanIds && cleanIds.length > 0)
|
||||
? db`array_position(${cleanIds}::int[], items.id)`
|
||||
: db`items.is_pinned desc, items.id desc`
|
||||
)
|
||||
}
|
||||
offset ${newerThan ? 0 : offset}
|
||||
limit ${eps}
|
||||
`;
|
||||
@@ -774,7 +796,7 @@ const f0cklib = {
|
||||
view_mode: fav ? 'favs' : 'uploads'
|
||||
};
|
||||
},
|
||||
getf0ck: async ({ user: rawUser, tag: rawTag, hall: rawHall, mime: rawMime, itemid: rawItemid, mode, ratings, session, strict, exclude, user_id, is_admin, fav, random, userHall: rawUserHall, userHallOwner: rawUserHallOwner, lang } = {}) => {
|
||||
getf0ck: async ({ user: rawUser, tag: rawTag, hall: rawHall, mime: rawMime, itemid: rawItemid, mode, ratings, session, strict, exclude, user_id, is_admin, fav, random, userHall: rawUserHall, userHallOwner: rawUserHallOwner, lang, ids } = {}) => {
|
||||
if (fav && rawUser) {
|
||||
const { isPrivate, isAllowed } = await checkFavoritesAccess(rawUser, { session, user_id, is_admin });
|
||||
if (isPrivate && !isAllowed) {
|
||||
@@ -786,6 +808,11 @@ const f0cklib = {
|
||||
}
|
||||
}
|
||||
|
||||
const cleanIds = Array.isArray(ids)
|
||||
? ids.map(Number).filter(n => Number.isInteger(n) && n > 0)
|
||||
: (typeof ids === 'string' ? ids.split(',').map(Number).filter(n => Number.isInteger(n) && n > 0) : null);
|
||||
const idsFilter = (cleanIds && cleanIds.length > 0) ? db`and items.id = ANY(${cleanIds}::int[])` : db``;
|
||||
|
||||
const user = rawUser ? lib.escapeLike(decodeURI(rawUser)) : null;
|
||||
|
||||
// --- title: prefix — search items.title instead of the tags table ---
|
||||
@@ -899,8 +926,9 @@ const f0cklib = {
|
||||
${titleFilter}
|
||||
${hallFilter}
|
||||
${userHallFilter}
|
||||
${fav ? db`and "user"."user" ilike ${user}` : db``}
|
||||
${fav && user ? db`and "user"."user" ilike ${user}` : db``}
|
||||
${!fav && user ? db`and items.username ilike ${user}` : db``}
|
||||
${idsFilter}
|
||||
${mimeSQL}
|
||||
${!session && getGlobalfilter() ? db`and not exists (select 1 from tags_assign where item_id = items.id and (${db.unsafe(getGlobalfilter())}))` : db``}
|
||||
${excludedTags.length > 0 ? db`and not exists (select 1 from tags_assign where item_id = items.id and tag_id = any(${excludedTags}::int[]))` : db``}
|
||||
@@ -1030,7 +1058,7 @@ const f0cklib = {
|
||||
|
||||
// Determine the effective mode for optimization check (similar to Random)
|
||||
const nsfl_id = cfg.nsfl_tag_id || 3;
|
||||
const useTagsDriver = !!session && (effMode === 1 || effMode === 4) && !fav && !tag && !user && !hall;
|
||||
const useTagsDriver = !!session && (effMode === 1 || effMode === 4) && !fav && !tag && !user && !hall && (!cleanIds || cleanIds.length === 0);
|
||||
|
||||
const baseQuery = (whereClause, orderBy, limit = 1) => {
|
||||
return db`
|
||||
@@ -1038,7 +1066,7 @@ const f0cklib = {
|
||||
from items
|
||||
left join tags_assign on tags_assign.item_id = items.id
|
||||
left join tags on tags.id = tags_assign.tag_id
|
||||
${fav
|
||||
${fav && user
|
||||
? db`inner join favorites on favorites.item_id = items.id inner join "user" on "user".id = favorites.user_id`
|
||||
: db`left join favorites on favorites.item_id = items.id left join "user" on "user".id = favorites.user_id`
|
||||
}
|
||||
@@ -1569,16 +1597,27 @@ const f0cklib = {
|
||||
COALESCE(c.is_pinned, false) as is_pinned,
|
||||
c.video_time,
|
||||
u.user as username, u.id as user_id, uo.avatar, uo.avatar_file, uo.username_color, uo.display_name, uo.banner_file, uo.banner_position, uo.banner_size, uo.banner_repeat,
|
||||
(SELECT count(*) FROM comments r WHERE r.parent_id = c.id) as reply_count
|
||||
(SELECT count(*) FROM comments r WHERE r.parent_id = c.id) as reply_count,
|
||||
ai.fingerprint as anon_fingerprint
|
||||
FROM comments c
|
||||
JOIN "user" u ON c.user_id = u.id
|
||||
LEFT JOIN user_options uo ON uo.user_id = u.id
|
||||
LEFT JOIN anon_identities ai ON ai.user_id = u.id
|
||||
WHERE c.item_id = ${numericId} AND c.is_deleted = false
|
||||
ORDER BY COALESCE(c.is_pinned, false) DESC,
|
||||
CASE WHEN ${sort !== 'new'} THEN c.created_at END ASC,
|
||||
CASE WHEN ${sort === 'new'} THEN c.created_at END DESC
|
||||
`;
|
||||
|
||||
for (const c of comments) {
|
||||
if (c.anon_fingerprint) {
|
||||
c.is_anon = true;
|
||||
c.username = 'anonymous';
|
||||
c.display_name = 'Anonymous';
|
||||
c.anon_short_fingerprint = c.anon_fingerprint.slice(7, 15);
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch comment file attachments
|
||||
if (comments.length > 0) {
|
||||
const commentIds = comments.map(c => c.id);
|
||||
|
||||
Reference in New Issue
Block a user