mirror of
https://github.com/hanzo-apps/dataroom.git
synced 2026-10-30 14:47:36 +00:00
142 lines
4.0 KiB
TypeScript
142 lines
4.0 KiB
TypeScript
import { NextApiRequest, NextApiResponse } from "next";
|
|
|
|
import { authOptions } from "@/pages/api/auth/[...nextauth]";
|
|
import { getServerSession } from "next-auth/next";
|
|
import { z } from "zod";
|
|
|
|
import { errorhandler } from "@/lib/errorHandler";
|
|
import prisma from "@/lib/prisma";
|
|
import { CustomUser } from "@/lib/types";
|
|
|
|
// Zod schema for survey data - flexible for future options
|
|
const surveyDataSchema = z.object({
|
|
dealType: z
|
|
.enum([
|
|
"startup-fundraising",
|
|
"fund-management",
|
|
"mergers-acquisitions",
|
|
"project-management",
|
|
"sales",
|
|
"financial-operations",
|
|
"real-estate",
|
|
"other",
|
|
])
|
|
.optional()
|
|
.nullable(),
|
|
dealTypeOther: z.string().max(200).optional().nullable(),
|
|
dealSize: z
|
|
.enum(["0-500k", "500k-5m", "5m-10m", "10m-100m", "100m+"])
|
|
.optional()
|
|
.nullable(),
|
|
dismissed: z.boolean().optional().nullable(),
|
|
dismissedAt: z.string().datetime().optional().nullable(),
|
|
dismissedBy: z.string().optional().nullable(),
|
|
});
|
|
|
|
export type SurveyData = z.infer<typeof surveyDataSchema>;
|
|
|
|
export default async function handler(
|
|
req: NextApiRequest,
|
|
res: NextApiResponse,
|
|
) {
|
|
const session = await getServerSession(req, res, authOptions);
|
|
|
|
if (!session) {
|
|
return res.status(401).json({ error: "Unauthorized" });
|
|
}
|
|
|
|
const { teamId } = req.query as { teamId: string };
|
|
const userId = (session.user as CustomUser).id;
|
|
|
|
const teamAccess = await prisma.userTeam.findUnique({
|
|
where: {
|
|
userId_teamId: {
|
|
userId,
|
|
teamId,
|
|
},
|
|
},
|
|
});
|
|
|
|
if (!teamAccess) {
|
|
return res.status(403).json({ error: "Forbidden" });
|
|
}
|
|
|
|
if (req.method === "GET") {
|
|
try {
|
|
const team = await prisma.team.findUnique({
|
|
where: { id: teamId },
|
|
select: { surveyData: true },
|
|
});
|
|
|
|
const surveyData = (team?.surveyData as SurveyData) || {};
|
|
|
|
return res.status(200).json({
|
|
dealType: surveyData.dealType || null,
|
|
dealTypeOther: surveyData.dealTypeOther || null,
|
|
dealSize: surveyData.dealSize || null,
|
|
dismissed: surveyData.dismissed || false,
|
|
dismissedAt: surveyData.dismissedAt || null,
|
|
dismissedBy: surveyData.dismissedBy || null,
|
|
});
|
|
} catch (error) {
|
|
return errorhandler(error, res);
|
|
}
|
|
} else if (req.method === "POST") {
|
|
try {
|
|
const validationResult = surveyDataSchema.safeParse(req.body);
|
|
|
|
if (!validationResult.success) {
|
|
return res.status(400).json({
|
|
error: "Invalid survey data",
|
|
details: validationResult.error.errors,
|
|
});
|
|
}
|
|
|
|
const { dealType, dealTypeOther, dealSize, dismissed, dismissedAt } =
|
|
validationResult.data;
|
|
|
|
// Get current survey data to merge with new data
|
|
const team = await prisma.team.findUnique({
|
|
where: { id: teamId },
|
|
select: { surveyData: true },
|
|
});
|
|
|
|
const currentSurveyData = (team?.surveyData as SurveyData) || {};
|
|
|
|
const isSurveyComplete =
|
|
(dealType ?? currentSurveyData.dealType) &&
|
|
((dealType ?? currentSurveyData.dealType) === "project-management" ||
|
|
(dealSize ?? currentSurveyData.dealSize));
|
|
|
|
const updatedSurveyData: SurveyData = {
|
|
...currentSurveyData,
|
|
...(dealType !== undefined && { dealType }),
|
|
...(dealTypeOther !== undefined && { dealTypeOther }),
|
|
...(dealSize !== undefined && { dealSize }),
|
|
...(dismissed !== undefined && { dismissed }),
|
|
...(dismissedAt !== undefined && { dismissedAt }),
|
|
...(dismissed && { dismissedBy: userId }),
|
|
...(isSurveyComplete &&
|
|
currentSurveyData.dismissed && {
|
|
dismissed: null,
|
|
dismissedAt: null,
|
|
dismissedBy: null,
|
|
}),
|
|
};
|
|
|
|
await prisma.team.update({
|
|
where: { id: teamId },
|
|
data: {
|
|
surveyData: updatedSurveyData,
|
|
},
|
|
});
|
|
|
|
return res.status(200).json({ success: true });
|
|
} catch (error) {
|
|
return errorhandler(error, res);
|
|
}
|
|
} else {
|
|
return res.status(405).json({ error: "Method not allowed" });
|
|
}
|
|
}
|