95 lines
2.8 KiB
TypeScript
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 });
|
|
}
|
|
}
|