import { getAuth } from "@clerk/react-router/server"; import { eq, and } from "drizzle-orm"; import { database } from "~/database/context"; import * as schema from "~/database/schema"; import { isCommissioner } from "~/models/commissioner"; import { getSocketIO } from "../../../server/socket"; import type { ActionFunctionArgs } from "react-router"; export async function action(args: ActionFunctionArgs) { const { request } = args; const { userId } = await getAuth(args); if (!userId) { return Response.json({ error: "Unauthorized" }, { status: 401 }); } const formData = await request.formData(); const seasonId = formData.get("seasonId") as string; const teamId = formData.get("teamId") as string; const adjustmentRaw = formData.get("adjustment"); const adjustment = adjustmentRaw !== null ? parseInt(adjustmentRaw as string, 10) : NaN; if (!seasonId || !teamId || isNaN(adjustment)) { return Response.json({ error: "seasonId, teamId, and adjustment are required" }, { status: 400 }); } const db = database(); const season = await db.query.seasons.findFirst({ where: eq(schema.seasons.id, seasonId), }); if (!season) { return Response.json({ error: "Season not found" }, { status: 404 }); } if (season.status !== "draft") { return Response.json({ error: "Draft is not currently active" }, { status: 409 }); } if (!(await isCommissioner(season.leagueId, userId))) { return Response.json( { error: "Only commissioners can adjust time banks" }, { status: 403 } ); } const [currentTimer] = await db .select() .from(schema.draftTimers) .where( and( eq(schema.draftTimers.seasonId, seasonId), eq(schema.draftTimers.teamId, teamId) ) ); let newTime: number; if (!currentTimer) { if (adjustment <= 0) { return Response.json({ error: "Timer not found for this team" }, { status: 404 }); } newTime = adjustment; await db.insert(schema.draftTimers).values({ seasonId, teamId, timeRemaining: newTime, }); } else { newTime = Math.max(0, currentTimer.timeRemaining + adjustment); await db .update(schema.draftTimers) .set({ timeRemaining: newTime, updatedAt: new Date() }) .where(eq(schema.draftTimers.id, currentTimer.id)); } try { getSocketIO() .to(`draft-${seasonId}`) .emit("timer-update", { seasonId, teamId, timeRemaining: newTime, currentPickNumber: season.currentPickNumber ?? 1, }); } catch (error) { console.error("Socket.IO error:", error); } return Response.json({ success: true, timeRemaining: newTime }); }