/home/techb158/balavpn.abdallabala.com/src/app/api/auth/accept-invite
Edit: /home/techb158/balavpn.abdallabala.com/src/app/api/auth/accept-invite/route.js (1639B)
const { prisma } = require("../../../../lib/prisma");
const { sha256 } = require("../../../../lib/crypto");
const { jsonResponse, errorResponse, parseJson } = require("../../../../lib/http");
export async function POST(request) {
try {
const body = await parseJson(request);
const tokenHash = sha256(body.token, process.env.COSMIC_INVITE_SECRET);
const invitation = await prisma.invitation.findUnique({ where: { tokenHash } });
if (!invitation || invitation.acceptedAt || invitation.expiresAt < new Date()) {
const error = new Error("Invitation is invalid or expired.");
error.status = 400;
throw error;
}
const role = await prisma.role.findUniqueOrThrow({ where: { code: invitation.roleCode } });
const user = await prisma.user.upsert({
where: { email: invitation.email },
update: { displayName: body.displayName || invitation.email },
create: {
email: invitation.email,
displayName: body.displayName || invitation.email,
emailVerifiedAt: new Date()
}
});
const membership = await prisma.membership.upsert({
where: { organizationId_userId: { organizationId: invitation.organizationId, userId: user.id } },
update: { roleId: role.id, status: "ACTIVE" },
create: {
organizationId: invitation.organizationId,
userId: user.id,
roleId: role.id,
status: "ACTIVE"
}
});
await prisma.invitation.update({ where: { id: invitation.id }, data: { acceptedAt: new Date() } });
return jsonResponse({ user, membership });
} catch (error) {
return errorResponse(error);
}
}