/home/techb158/balavpn.abdallabala.com/src/app/api/auth/invite
Edit: /home/techb158/balavpn.abdallabala.com/src/app/api/auth/invite/route.js (1734B)
const { prisma } = require("../../../../lib/prisma");
const { randomToken, sha256 } = require("../../../../lib/crypto");
const { requireOrganizationActor } = require("../../../../lib/request-context");
const { jsonResponse, errorResponse, parseJson } = require("../../../../lib/http");
const { sendInviteEmail } = require("../../../../lib/email");
export async function POST(request) {
try {
const body = await parseJson(request);
const organizationId = body.organizationId;
const { actor } = await requireOrganizationActor(request, organizationId, "organization:manage");
const token = randomToken();
const existingUser = await prisma.user.findUnique({ where: { email: body.email }, select: { platformRole: true } });
if (existingUser && existingUser.platformRole !== "NONE") {
return jsonResponse({ error: "Cannot invite platform administrators" }, 403);
}
const invitation = await prisma.invitation.create({
data: {
organizationId,
email: body.email,
roleCode: body.roleCode || "viewer",
tokenHash: sha256(token, process.env.COSMIC_INVITE_SECRET),
expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 7),
invitedById: actor.id
}
});
const org = await prisma.organization.findUnique({ where: { id: organizationId }, select: { name: true } });
const inviteLink = `${process.env.NEXT_PUBLIC_APP_URL || ''}/accept-invite?token=${token}`;
sendInviteEmail({ email: body.email, inviteLink, invitedByName: actor.displayName || 'Someone', organizationName: org?.name || 'the organization' }).catch(() => {});
return jsonResponse({ invitation, token }, 201);
} catch (error) {
return errorResponse(error);
}
}