From 50e89719bbaf768a86f1c0f868e5d363a7b89ae8 Mon Sep 17 00:00:00 2001 From: xCyanGrizzly Date: Sat, 4 Jul 2026 09:20:36 +0200 Subject: [PATCH] feat(stls): add sendAllFromCreatorAction server action --- src/app/(app)/stls/actions.ts | 79 +++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/app/(app)/stls/actions.ts b/src/app/(app)/stls/actions.ts index d58a074..5e7ba5a 100644 --- a/src/app/(app)/stls/actions.ts +++ b/src/app/(app)/stls/actions.ts @@ -589,3 +589,82 @@ export async function sendAllInGroupAction( return { success: false, error: "Failed to send group packages" }; } } + +export async function sendAllFromCreatorAction( + creatorName: string +): Promise> { + const session = await auth(); + if (!session?.user?.id) return { success: false, error: "Unauthorized" }; + + const creator = creatorName.trim(); + if (!creator) { + return { success: false, error: "No creator specified" }; + } + + try { + const telegramLink = await prisma.telegramLink.findUnique({ + where: { userId: session.user.id }, + }); + + if (!telegramLink) { + return { success: false, error: "No linked Telegram account. Link one in Settings." }; + } + + const sendablePackages = await prisma.package.findMany({ + where: { + creator, + destChannelId: { not: null }, + destMessageId: { not: null }, + }, + select: { id: true }, + }); + + if (sendablePackages.length === 0) { + return { success: false, error: "No uploaded packages found for this creator" }; + } + + let queued = 0; + let skipped = 0; + for (const pkg of sendablePackages) { + // Only create if no existing PENDING/SENDING request for this package+link combo + const existing = await prisma.botSendRequest.findFirst({ + where: { + packageId: pkg.id, + telegramLinkId: telegramLink.id, + status: { in: ["PENDING", "SENDING"] }, + }, + }); + + if (existing) { + skipped++; + continue; + } + + const sendRequest = await prisma.botSendRequest.create({ + data: { + packageId: pkg.id, + telegramLinkId: telegramLink.id, + requestedByUserId: session.user.id, + status: "PENDING", + }, + }); + + // Notify the bot via pg_notify + try { + await prisma.$queryRawUnsafe( + `SELECT pg_notify('bot_send', $1)`, + sendRequest.id + ); + } catch { + // Best-effort — the bot also polls periodically + } + + queued++; + } + + revalidatePath("/stls"); + return { success: true, data: { queued, skipped } }; + } catch { + return { success: false, error: "Failed to send creator packages" }; + } +}