fix: properly filter posts

This commit is contained in:
Namekuji 2023-08-13 01:04:24 -04:00
parent 411cbdc121
commit ad7a950f44
No known key found for this signature in database
GPG key ID: 1D62332C07FBA532
3 changed files with 67 additions and 8 deletions

View file

@ -48,7 +48,7 @@ export const scyllaQueries = {
byId: `SELECT * FROM note WHERE "id" = ?`, byId: `SELECT * FROM note WHERE "id" = ?`,
byUserId: `SELECT * FROM note_by_user_id WHERE "userId" IN ?`, byUserId: `SELECT * FROM note_by_user_id WHERE "userId" IN ?`,
byRenoteId: `SELECT * FROM note_by_renote_id WHERE "renoteId" = ?`, byRenoteId: `SELECT * FROM note_by_renote_id WHERE "renoteId" = ?`,
byReplyId: `SELECT * FROM note_by_reply_id WHERE "replyId" = ?` byReplyId: `SELECT * FROM note WHERE "replyId" = ?`
}, },
delete: `DELETE FROM note WHERE "createdAtDate" = ? AND "createdAt" = ? AND "userId" = ? AND "userHost" = ? AND "visibility" = ?`, delete: `DELETE FROM note WHERE "createdAtDate" = ? AND "createdAt" = ? AND "userId" = ? AND "userHost" = ? AND "visibility" = ?`,
update: { update: {

View file

@ -1,12 +1,27 @@
import { Notes } from "@/models/index.js"; import { Notes, UserProfiles } from "@/models/index.js";
import define from "../../define.js"; import define from "../../define.js";
import { makePaginationQuery } from "../../common/make-pagination-query.js"; import { makePaginationQuery } from "../../common/make-pagination-query.js";
import { generateVisibilityQuery } from "../../common/generate-visibility-query.js"; import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js"; import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
import { generateBlockedUserQuery } from "../../common/generate-block-query.js"; import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
import { parseScyllaNote, prepared, scyllaClient } from "@/db/scylla.js"; import {
filterBlockedUser,
filterMutedNote,
filterMutedUser,
filterVisibility,
parseScyllaNote,
prepared,
scyllaClient,
} from "@/db/scylla.js";
import { getNote } from "@/server/api/common/getters.js"; import { getNote } from "@/server/api/common/getters.js";
import type { Note } from "@/models/entities/note.js"; import type { Note } from "@/models/entities/note.js";
import {
InstanceMutingsCache,
LocalFollowingsCache,
UserBlockedCache,
UserMutingsCache,
userWordMuteCache,
} from "@/misc/cache.js";
export const meta = { export const meta = {
tags: ["notes"], tags: ["notes"],
@ -42,7 +57,34 @@ export const paramDef = {
export default define(meta, paramDef, async (ps, user) => { export default define(meta, paramDef, async (ps, user) => {
if (scyllaClient) { if (scyllaClient) {
const root = await getNote(ps.noteId, user).catch(() => null); let [
followingUserIds,
mutedUserIds,
mutedInstances,
blockerIds,
]: string[][] = [];
let mutedWords: string[][] = [];
if (user) {
[followingUserIds, mutedUserIds, mutedInstances, mutedWords, blockerIds] =
await Promise.all([
LocalFollowingsCache.init(user.id).then((cache) => cache.getAll()),
UserMutingsCache.init(user.id).then((cache) => cache.getAll()),
InstanceMutingsCache.init(user.id).then((cache) => cache.getAll()),
userWordMuteCache
.fetchMaybe(user.id, () =>
UserProfiles.findOne({
select: ["mutedWords"],
where: { userId: user.id },
}).then((profile) => profile?.mutedWords),
)
.then((words) => words ?? []),
UserBlockedCache.init(user.id).then((cache) => cache.getAll()),
]);
}
const root = await getNote(ps.noteId, user, followingUserIds).catch(
() => null,
);
if (!root) { if (!root) {
return await Notes.packMany([]); return await Notes.packMany([]);
} }
@ -65,7 +107,18 @@ export default define(meta, paramDef, async (ps, user) => {
{ prepare: true }, { prepare: true },
); );
if (result.rowLength > 0) { if (result.rowLength > 0) {
const replies = result.rows.map(parseScyllaNote); let replies = result.rows.map(parseScyllaNote);
replies = await filterVisibility(replies, user, followingUserIds);
if (user) {
replies = await filterMutedUser(
replies,
user,
mutedUserIds,
mutedInstances,
);
replies = await filterMutedNote(replies, user, mutedWords);
replies = await filterBlockedUser(replies, user, blockerIds);
}
foundReplies.push(...replies); foundReplies.push(...replies);
queue.push(...replies); queue.push(...replies);
depth++; depth++;
@ -73,7 +126,7 @@ export default define(meta, paramDef, async (ps, user) => {
} }
} }
return await Notes.packMany(foundReplies.slice(0, ps.limit), user, { return await Notes.packMany(foundReplies, user, {
detail: false, detail: false,
scyllaNote: true, scyllaNote: true,
}); });

View file

@ -3,6 +3,7 @@ import { Notes } from "@/models/index.js";
import define from "../../define.js"; import define from "../../define.js";
import { ApiError } from "../../error.js"; import { ApiError } from "../../error.js";
import { getNote } from "../../common/getters.js"; import { getNote } from "../../common/getters.js";
import { LocalFollowingsCache } from "@/misc/cache.js";
export const meta = { export const meta = {
tags: ["notes"], tags: ["notes"],
@ -47,7 +48,12 @@ export const paramDef = {
} as const; } as const;
export default define(meta, paramDef, async (ps, user) => { export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId, user).catch((err) => { let followingIds: string[] = [];
if (user) {
followingIds = await LocalFollowingsCache.init(user.id).then(cache => cache.getAll());
}
const note = await getNote(ps.noteId, user, followingIds).catch((err) => {
if (err.id === "9725d0ce-ba28-4dde-95a7-2cbb2c15de24") if (err.id === "9725d0ce-ba28-4dde-95a7-2cbb2c15de24")
throw new ApiError(meta.errors.noSuchNote); throw new ApiError(meta.errors.noSuchNote);
throw err; throw err;
@ -58,7 +64,7 @@ export default define(meta, paramDef, async (ps, user) => {
async function get(id: string) { async function get(id: string) {
i++; i++;
const p = await getNote(id, user).catch((e) => { const p = await getNote(id, user, followingIds).catch((e) => {
if (e.id === "9725d0ce-ba28-4dde-95a7-2cbb2c15de24") return null; if (e.id === "9725d0ce-ba28-4dde-95a7-2cbb2c15de24") return null;
throw e; throw e;
}); });