brackt/app/routes/api/queue.add.ts

59 lines
1.9 KiB
TypeScript

import { getAuth } from "@clerk/react-router/server";
import { database } from "~/database/context";
import * as schema from "~/database/schema";
import { eq } from "drizzle-orm";
import { addToQueue, getTeamQueue, isParticipantInQueue } from "~/models/draft-queue";
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");
const teamId = formData.get("teamId");
const participantId = formData.get("participantId");
if (!seasonId || !teamId || !participantId) {
return Response.json({ error: "Missing required fields" }, { status: 400 });
}
const db = database();
// Verify user owns this team
const team = await db.query.teams.findFirst({
where: eq(schema.teams.id, teamId as string),
});
if (!team || team.ownerId !== userId) {
return Response.json({ error: "Unauthorized" }, { status: 403 });
}
// Check if participant is already in queue
const alreadyInQueue = await isParticipantInQueue(teamId as string, participantId as string);
if (alreadyInQueue) {
return Response.json({ error: "Participant already in queue" }, { status: 400 });
}
// Get current queue to determine position
const currentQueue = await getTeamQueue(teamId as string);
const queuePosition = currentQueue.length + 1;
// Add to queue
const queueItem = await addToQueue({
seasonId: seasonId as string,
teamId: teamId as string,
participantId: participantId as string,
queuePosition,
});
// TODO: Emit socket event for real-time update
// const io = getSocketIO();
// io.to(`draft-${seasonId}`).emit("queue-updated", { teamId, queue: [...currentQueue, queueItem] });
return Response.json({ success: true, queueItem });
}