fix: clear home timeline of deleted user

This commit is contained in:
Namekuji 2023-09-02 06:38:52 -04:00
parent 91762bb8ca
commit ef97630460
No known key found for this signature in database
GPG key ID: 1D62332C07FBA532
3 changed files with 29 additions and 3 deletions

View file

@ -216,6 +216,8 @@ CREATE TABLE home_timeline (
CREATE INDEX home_by_id ON home_timeline ("id");
CREATE INDEX home_by_feed_user_id ON home_timeline ("feedUserId");
CREATE TABLE reaction (
"id" text,
"noteId" ascii,

View file

@ -116,6 +116,7 @@ export const scyllaQueries = {
select: {
byUserAndDate: `SELECT * FROM home_timeline WHERE "feedUserId" = ? AND "createdAtDate" = ?`,
byId: `SELECT * FROM home_timeline WHERE "id" = ?`,
byUser: `SELECT * FROM home_timeline WHERE "feedUserId" = ?`,
},
delete: `DELETE FROM home_timeline WHERE "feedUserId" = ? AND "createdAtDate" = ? AND "createdAt" = ? AND "userId" = ?`,
update: {

View file

@ -46,12 +46,33 @@ export async function deleteAccount(
let cursor: Note["id"] | null = null;
if (scyllaClient) {
// FIXME: Cascading notes won't be deleted. Reply and renote counts will be incorrect.
const client = scyllaClient as Client;
// Clear user's home timeline
scyllaClient.eachRow(
prepared.homeTimeline.select.byUser,
[user.id],
{ prepare: true },
(_, row) => {
const timeline = parseHomeTimeline(row);
client.execute(
prepared.homeTimeline.delete,
[
timeline.feedUserId,
timeline.createdAtDate,
timeline.createdAt,
timeline.userId,
],
{ prepare: true },
);
},
);
// Delete notes
scyllaClient.eachRow(
prepared.note.select.byUserId,
[user.id],
{ prepare: true },
(_, row) => {
const client = scyllaClient as Client;
const note = parseScyllaNote(row);
const noteDeleteParams = [
note.createdAt,
@ -60,9 +81,11 @@ export async function deleteAccount(
note.userHost ?? "local",
note.visibility,
] as [Date, Date, string, string, string];
// Delete note from global feed
client.execute(prepared.note.delete, noteDeleteParams, {
prepare: true,
});
// Delete note from home timelines
client.eachRow(
prepared.homeTimeline.select.byId,
[note.id],
@ -140,7 +163,7 @@ export async function deleteAccount(
}
}
}
logger.succ("All of notes deleted");
logger.succ("All associated notes deleted");
}
{
@ -170,7 +193,7 @@ export async function deleteAccount(
}
}
logger.succ("All of files deleted");
logger.succ("All associated files deleted");
}
{