From 231965b4d5cafbcb472008e7206f2c2930fc0aab Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sun, 21 Jun 2026 16:40:15 +0300 Subject: [PATCH] Routine to delete old friend requests --- app/features/friends/FriendRepository.server.ts | 15 +++++++++++++++ app/features/friends/friends-constants.ts | 1 + app/routines/deleteOldPendingFriendRequests.ts | 12 ++++++++++++ app/routines/list.server.ts | 2 ++ 4 files changed, 30 insertions(+) create mode 100644 app/routines/deleteOldPendingFriendRequests.ts diff --git a/app/features/friends/FriendRepository.server.ts b/app/features/friends/FriendRepository.server.ts index 34d7ddbbe..149dc26d7 100644 --- a/app/features/friends/FriendRepository.server.ts +++ b/app/features/friends/FriendRepository.server.ts @@ -1,9 +1,11 @@ +import { sub } from "date-fns"; import { type SelectQueryBuilder, sql } from "kysely"; import { db } from "~/db/sql"; import type { DB } from "~/db/tables"; import { actorId } from "~/features/auth/core/user.server"; import { dateToDatabaseTimestamp } from "~/utils/dates"; import { commonUserSelect, customAvatarUrl } from "~/utils/kysely.server"; +import { FRIEND } from "./friends-constants"; export async function findByUserIdWithActivity(userId: number) { const [friendRows, teamMemberRows] = await Promise.all([ @@ -163,6 +165,19 @@ export async function deleteFriendRequest({ .execute(); } +export function deleteOldPendingRequests() { + return db + .deleteFrom("FriendRequest") + .where( + "FriendRequest.createdAt", + "<", + dateToDatabaseTimestamp( + sub(new Date(), { months: FRIEND.PENDING_REQUEST_EXPIRES_IN_MONTHS }), + ), + ) + .executeTakeFirst(); +} + export async function findFriendRequestBetween({ senderId, receiverId, diff --git a/app/features/friends/friends-constants.ts b/app/features/friends/friends-constants.ts index f4731c63c..c8756d4f2 100644 --- a/app/features/friends/friends-constants.ts +++ b/app/features/friends/friends-constants.ts @@ -1,5 +1,6 @@ export const FRIEND = { MAX_PENDING_REQUESTS: 20, + PENDING_REQUEST_EXPIRES_IN_MONTHS: 1, } as const; export const SENDOUQ_ACTIVITY_LABEL = "SendouQ"; diff --git a/app/routines/deleteOldPendingFriendRequests.ts b/app/routines/deleteOldPendingFriendRequests.ts new file mode 100644 index 000000000..9f140f441 --- /dev/null +++ b/app/routines/deleteOldPendingFriendRequests.ts @@ -0,0 +1,12 @@ +import * as FriendRepository from "../features/friends/FriendRepository.server"; +import { logger } from "../utils/logger"; +import { Routine } from "./routine.server"; + +export const DeleteOldPendingFriendRequestsRoutine = new Routine({ + name: "DeleteOldPendingFriendRequests", + func: async () => { + const { numDeletedRows } = + await FriendRepository.deleteOldPendingRequests(); + logger.info(`Deleted ${numDeletedRows} old pending friend requests`); + }, +}); diff --git a/app/routines/list.server.ts b/app/routines/list.server.ts index 900e032ea..7ea48a4b7 100644 --- a/app/routines/list.server.ts +++ b/app/routines/list.server.ts @@ -3,6 +3,7 @@ import { CloseExpiredContinueVotesRoutine } from "./closeExpiredContinueVotes"; import { DeleteObsoleteMatchVodsRoutine } from "./deleteObsoleteMatchVods"; import { DeleteOldExternalStreamsRoutine } from "./deleteOldExternalStreams"; import { DeleteOldNotificationsRoutine } from "./deleteOldNotifications"; +import { DeleteOldPendingFriendRequestsRoutine } from "./deleteOldPendingFriendRequests"; import { DeleteOldTournamentAuditLogsRoutine } from "./deleteOldTournamentAuditLogs"; import { DeleteOrphanArtTagsRoutine } from "./deleteOrphanArtTags"; import { NotifyCheckInStartRoutine } from "./notifyCheckInStart"; @@ -38,6 +39,7 @@ export const everyHourAt30 = [ export const daily = [ DeleteObsoleteMatchVodsRoutine, DeleteOldNotificationsRoutine, + DeleteOldPendingFriendRequestsRoutine, DeleteOldTournamentAuditLogsRoutine, CloseExpiredCommissionsRoutine, DeleteOrphanArtTagsRoutine,