Files
formbricks/apps/web/app/api/v1/users/route.ts
T
Shubham Palriwala c6678a2607 fix: add authorization for Survey actions (#870)
* poc: use server session and api key validation on deletion

* feat: use server session and api key validation on deletion and creation

* feat: packages/lib/apiKey for apiKey services and auth

* shubham/auth-for-api-key

* fix: caching

* feat: handle authorization for action creation, update, delete

* feat: handle authorization for survey creation, updation & deletion

* feat: use cached method across and wrapper for authzn check

* fix: use cached wrapper & introduce more authzn check for survey services in actions

* fix: club caching methods and use authzn errors

* feat: add caching in canUserAccessApiKey

* feat: add caching in canUserAccessAction and use Authzn error

* fix: rename action to actionClass wherever needed

* feat: use caching in core method and update hasEnvAccess call

* fix: use authzn specific error

* fix: use cache getActionClass

* fix: make changes

* fix: import

* fix: import and suggested changes

* fix: rename action and use cache tag

* feat: use services to create team

* fix: atomic services for product & team creation

* improve teamUpdateInput

* use services in signup process

* redirect to prod environment when new product is created

* fix signup bug

---------

Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
2023-10-03 21:43:34 +02:00

88 lines
2.7 KiB
TypeScript

import { sendInviteAcceptedEmail, sendVerificationEmail } from "@/lib/email";
import { prisma } from "@formbricks/database";
import { EMAIL_VERIFICATION_DISABLED, INVITE_DISABLED, SIGNUP_ENABLED } from "@formbricks/lib/constants";
import { verifyInviteToken } from "@formbricks/lib/jwt";
import { deleteInvite } from "@formbricks/lib/services/invite";
import { createMembership } from "@formbricks/lib/services/membership";
import { createProduct } from "@formbricks/lib/services/product";
import { createProfile } from "@formbricks/lib/services/profile";
import { createTeam } from "@formbricks/lib/services/team";
import { NextResponse } from "next/server";
export async function POST(request: Request) {
let { inviteToken, ...user } = await request.json();
if (inviteToken ? INVITE_DISABLED : !SIGNUP_ENABLED) {
return NextResponse.json({ error: "Signup disabled" }, { status: 403 });
}
user = { ...user, ...{ email: user.email.toLowerCase() } };
let inviteId;
try {
let invite;
if (inviteToken) {
let inviteTokenData = await verifyInviteToken(inviteToken);
inviteId = inviteTokenData?.inviteId;
invite = await prisma.invite.findUnique({
where: { id: inviteId },
include: {
creator: true,
},
});
if (!invite) {
return NextResponse.json({ error: "Invalid invite ID" }, { status: 400 });
}
// create a user and assign him to the team
const profile = await createProfile(user);
await createMembership(invite.teamId, profile.id, {
accepted: true,
role: invite.role,
});
if (!EMAIL_VERIFICATION_DISABLED) {
await sendVerificationEmail(profile);
}
await sendInviteAcceptedEmail(invite.creator.name, user.name, invite.creator.email);
await deleteInvite(inviteId);
return NextResponse.json(profile);
} else {
const team = await createTeam({
name: `${user.name}'s Team`,
});
await createProduct(team.id, { name: "My Product" });
const profile = await createProfile(user);
await createMembership(team.id, profile.id, { role: "owner", accepted: true });
if (!EMAIL_VERIFICATION_DISABLED) {
await sendVerificationEmail(profile);
}
return NextResponse.json(profile);
}
} catch (e) {
if (e.code === "P2002") {
return NextResponse.json(
{
error: "user with this email address already exists",
errorCode: e.code,
},
{ status: 409 }
);
} else {
return NextResponse.json(
{
error: e.message,
errorCode: e.code,
},
{ status: 500 }
);
}
}
}