98 lines
2.6 KiB
TypeScript
98 lines
2.6 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { auth } from "@clerk/nextjs/server";
|
|
import { getDatabase } from "@/lib/database";
|
|
import { ensureUserSynced } from "@/lib/sync-user";
|
|
import log from "@/lib/logger";
|
|
|
|
/**
|
|
* DELETE /api/trainer-client/[id]
|
|
* Delete (deactivate) a trainer-client assignment
|
|
*/
|
|
export async function DELETE(
|
|
request: NextRequest,
|
|
{ params }: { params: Promise<{ id: string }> },
|
|
) {
|
|
try {
|
|
const { userId: authUserId } = await auth();
|
|
if (!authUserId) {
|
|
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
}
|
|
|
|
const db = await getDatabase();
|
|
const currentUser = await ensureUserSynced(authUserId, db);
|
|
|
|
if (!currentUser) {
|
|
return NextResponse.json({ error: "Forbidden" }, { status: 403 });
|
|
}
|
|
|
|
// Only admins can delete assignments
|
|
if (currentUser.role !== "admin" && currentUser.role !== "superAdmin") {
|
|
return NextResponse.json(
|
|
{ error: "Only admins can remove trainer-client assignments" },
|
|
{ status: 403 },
|
|
);
|
|
}
|
|
|
|
const { id } = await params;
|
|
|
|
const allAssignments = await db.getAllTrainerClientAssignments();
|
|
const assignment = allAssignments.find((a) => a.id === id);
|
|
|
|
if (!assignment) {
|
|
return NextResponse.json(
|
|
{ error: "Assignment not found" },
|
|
{ status: 404 },
|
|
);
|
|
}
|
|
|
|
if (currentUser.role !== "superAdmin") {
|
|
if (!currentUser.gymId) {
|
|
return NextResponse.json({ error: "No gym assigned" }, { status: 403 });
|
|
}
|
|
|
|
const [trainer, client] = await Promise.all([
|
|
db.getUserById(assignment.trainerId),
|
|
db.getUserById(assignment.clientId),
|
|
]);
|
|
|
|
if (
|
|
!trainer ||
|
|
!client ||
|
|
trainer.gymId !== currentUser.gymId ||
|
|
client.gymId !== currentUser.gymId
|
|
) {
|
|
return NextResponse.json(
|
|
{ error: "Cannot modify assignments from other gyms" },
|
|
{ status: 403 },
|
|
);
|
|
}
|
|
}
|
|
|
|
// Deactivate the assignment
|
|
const result = await db.deactivateTrainerClientAssignment(id);
|
|
|
|
if (!result) {
|
|
return NextResponse.json(
|
|
{ error: "Failed to deactivate assignment" },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
|
|
log.info("Trainer-client assignment deactivated", {
|
|
assignmentId: id,
|
|
deactivatedBy: currentUser.id,
|
|
});
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: "Assignment deactivated successfully",
|
|
});
|
|
} catch (error) {
|
|
log.error("Failed to delete trainer-client assignment", error);
|
|
return NextResponse.json(
|
|
{ error: "Internal server error" },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
}
|