/home/techb158/balavpn.abdallabala.com/src/app/api/auth/accept-invite
NameSizeModeActions
route.js16390644editdlrm
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); } }