Files
litlyx/dashboard/server/api/members/add.post.ts
2025-11-28 16:49:20 +01:00

94 lines
2.8 KiB
TypeScript

import { TeamMemberModel } from "@schema/TeamMemberSchema";
import { UserModel } from "@schema/UserSchema";
import { z } from "zod";
import { getPlanFromId } from "~/shared/data/PLANS";
import { PremiumModel } from "~/shared/schema/PremiumSchema";
const ZEmailBody = z.object({
email: z.string().email('Not a valid email')
});
export default defineEventHandler(async event => {
const ctx = await getRequestContext(event, 'pid');
const { project_id, user_id, project } = ctx;
const { email } = await readValidatedBody(event, ZEmailBody.parse);
const { BASE_URL } = useRuntimeConfig();
const link = `${BASE_URL}/accept_invite?project_id=${project_id.toString()}`;
const premiumData = await PremiumModel.findOne({ user_id });
if (!premiumData) throw createError({ status: 400, message: 'Error getting premiumData. Please contact support.' });
const price = getPlanFromId(premiumData.premium_type);
if (!price) throw createError({ status: 400, message: 'Error getting price. Please contact support.' });
const maxMembers = price.features.members;
const currentMembers = await TeamMemberModel.countDocuments({ project_id });
if (currentMembers >= maxMembers) throw createError({ status: 400, message: 'MEMBERS_LIMIT_REACHED' });
const targetUser = await UserModel.findOne({ email });
if (targetUser) {
if (targetUser._id.toString() == user_id) throw createError({ status: 400, message: 'Cannot invite yourself' });
const exists = await TeamMemberModel.exists({ project_id, user_id });
if (exists) throw createError({ status: 400, message: 'Member already invited' });
await TeamMemberModel.create({
project_id,
user_id: targetUser.id,
pending: true,
role: 'GUEST',
permission: {
webAnalytics: true,
events: false,
ai: false,
domains: ['*']
}
});
setImmediate(() => {
const tRpc = useTRPC();
tRpc.emails.email.sendInviteEmail.mutate({ email, project_name: project.name, link });
});
} else {
const exist = await TeamMemberModel.exists({ project_id, email });
if (exist) return setResponseStatus(event, 400, 'Member already invited');
await TeamMemberModel.create({
project_id,
email,
pending: true,
role: 'GUEST',
permission: {
webAnalytics: true,
events: false,
ai: false,
domains: ['*']
}
});
setImmediate(() => {
const tRpc = useTRPC();
tRpc.emails.email.sendInviteEmail.mutate({ email, project_name: project.name, link });
});
}
return { ok: true };
});