brackt/app/routes/api/draft-actions.ts

95 lines
2.8 KiB
TypeScript

import { data, type ActionFunctionArgs } from "react-router";
import { getAuth } from "@clerk/react-router/server";
import {
addToQueue,
removeFromQueue,
reorderQueueWithSeason,
findTeamById,
getTeamQueue,
} from "~/models";
export async function action(args: ActionFunctionArgs) {
const { userId } = await getAuth(args);
if (!userId) {
return data({ error: "Unauthorized" }, { status: 401 });
}
const { request } = args;
const formData = await request.formData();
const actionType = formData.get("action");
const teamId = formData.get("teamId");
if (!teamId || typeof teamId !== "string") {
return data({ error: "Team ID is required" }, { status: 400 });
}
// Verify user owns this team
const team = await findTeamById(teamId);
if (!team || team.ownerId !== userId) {
return data({ error: "You do not own this team" }, { status: 403 });
}
try {
switch (actionType) {
case "add-to-queue": {
const participantId = formData.get("participantId");
const seasonId = formData.get("seasonId");
if (!participantId || typeof participantId !== "string") {
return data({ error: "Participant ID is required" }, { status: 400 });
}
if (!seasonId || typeof seasonId !== "string") {
return data({ error: "Season ID is required" }, { status: 400 });
}
// Get current queue to determine position
const currentQueue = await getTeamQueue(teamId);
const queuePosition = currentQueue.length + 1;
await addToQueue({
seasonId,
teamId,
participantId,
queuePosition,
});
return data({ success: true });
}
case "remove-from-queue": {
const queueItemId = formData.get("queueItemId");
if (!queueItemId || typeof queueItemId !== "string") {
return data({ error: "Queue item ID is required" }, { status: 400 });
}
await removeFromQueue(queueItemId);
return data({ success: true });
}
case "reorder-queue": {
const participantIds = formData.get("participantIds");
const seasonId = formData.get("seasonId");
if (!participantIds || typeof participantIds !== "string") {
return data({ error: "Participant IDs are required" }, { status: 400 });
}
if (!seasonId || typeof seasonId !== "string") {
return data({ error: "Season ID is required" }, { status: 400 });
}
const idsArray = JSON.parse(participantIds);
await reorderQueueWithSeason(seasonId, teamId, idsArray);
return data({ success: true });
}
default:
return data({ error: "Invalid action" }, { status: 400 });
}
} catch (error) {
console.error("Draft action error:", error);
return data({ error: "Failed to perform action" }, { status: 500 });
}
}