90 lines
2.4 KiB
TypeScript
90 lines
2.4 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { auth, clerkClient } from "@clerk/nextjs/server";
|
|
import log from "@/lib/logger";
|
|
|
|
/**
|
|
* POST /api/invitations/[id]/resend
|
|
*
|
|
* Resend an invitation with same parameters
|
|
*/
|
|
export async function POST(
|
|
request: NextRequest,
|
|
{ params }: { params: Promise<{ id: string }> },
|
|
) {
|
|
try {
|
|
const { userId } = await auth();
|
|
if (!userId) {
|
|
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
}
|
|
|
|
const { id: invitationId } = await params;
|
|
|
|
// Fetch pending invitations to find the one being resent
|
|
const client = await clerkClient();
|
|
const invitationList = await client.invitations.getInvitationList({
|
|
status: "pending",
|
|
});
|
|
|
|
// Find the invitation
|
|
const invitation = invitationList.data.find(
|
|
(inv) => inv.id === invitationId,
|
|
);
|
|
|
|
if (!invitation) {
|
|
return NextResponse.json(
|
|
{ error: "Invitation not found or already processed" },
|
|
{ status: 404 },
|
|
);
|
|
}
|
|
|
|
const metadata = invitation.publicMetadata as any;
|
|
|
|
// Check if current user created this invitation
|
|
if (metadata?.createdBy !== userId) {
|
|
return NextResponse.json(
|
|
{ error: "Forbidden - You can only resend invitations you created" },
|
|
{ status: 403 },
|
|
);
|
|
}
|
|
|
|
// Create new invitation with same parameters
|
|
const role = metadata?.role;
|
|
|
|
// Determine redirect URL based on role
|
|
const isStaffRole = ["admin", "trainer", "superAdmin"].includes(role);
|
|
const redirectUrl = isStaffRole
|
|
? `${process.env.NEXT_PUBLIC_APP_URL || "http://localhost:3000"}/sign-up`
|
|
: undefined;
|
|
|
|
const newInvitation = await client.invitations.createInvitation({
|
|
emailAddress: invitation.emailAddress,
|
|
publicMetadata: invitation.publicMetadata || undefined,
|
|
redirectUrl,
|
|
ignoreExisting: true,
|
|
});
|
|
|
|
log.info("Invitation resent", {
|
|
originalId: invitationId,
|
|
newId: newInvitation.id,
|
|
email: invitation.emailAddress,
|
|
resentBy: userId,
|
|
});
|
|
|
|
return NextResponse.json({
|
|
data: {
|
|
invitation: {
|
|
id: newInvitation.id,
|
|
email: newInvitation.emailAddress,
|
|
status: newInvitation.status,
|
|
},
|
|
},
|
|
});
|
|
} catch (error) {
|
|
log.error("POST /api/invitations/[id]/resend error:", error);
|
|
return NextResponse.json(
|
|
{ error: "Failed to resend invitation" },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
}
|