import { getAuth } from "@clerk/react-router/server"; import { database } from "~/database/context"; import * as schema from "~/database/schema"; import { eq, and } from "drizzle-orm"; import { getSocketIO } from "../../../server/socket"; export async function action(args: any) { const { request } = args; const auth = await getAuth(args); const userId = (auth as any).userId as string | null; if (!userId) { return Response.json({ error: "Unauthorized" }, { status: 401 }); } const formData = await request.formData(); const seasonId = formData.get("seasonId") as string; if (!seasonId) { return Response.json({ error: "Missing seasonId" }, { status: 400 }); } const db = database(); // Get season details const season = await db.query.seasons.findFirst({ where: eq(schema.seasons.id, seasonId), }); if (!season) { return Response.json({ error: "Season not found" }, { status: 404 }); } // Check if user is commissioner const isCommissioner = await db.query.commissioners.findFirst({ where: and( eq(schema.commissioners.leagueId, season.leagueId), eq(schema.commissioners.userId, userId) ), }); if (!isCommissioner) { return Response.json({ error: "Only commissioners can start the draft" }, { status: 403 }); } // Check if draft already started if (season.status === "draft" || season.status === "active" || season.status === "completed") { return Response.json({ error: "Draft already started or completed" }, { status: 400 }); } // Update season status to draft await db .update(schema.seasons) .set({ status: "draft", currentPickNumber: 1, }) .where(eq(schema.seasons.id, seasonId)); // Initialize timers for all teams const draftSlots = await db.query.draftSlots.findMany({ where: eq(schema.draftSlots.seasonId, seasonId), }); const initialTime = season.draftInitialTime || 120; // Default 2 minutes // Delete existing timers for this season await db .delete(schema.draftTimers) .where(eq(schema.draftTimers.seasonId, seasonId)); // Insert new timers for all teams for (const slot of draftSlots) { await db .insert(schema.draftTimers) .values({ seasonId, teamId: slot.teamId, timeRemaining: initialTime, }); } // Emit socket event try { getSocketIO().to(`draft-${seasonId}`).emit("draft-started", { seasonId, currentPickNumber: 1, }); } catch (error) { console.error("Socket.IO error:", error); } return Response.json({ success: true }); }