mirror of
https://github.com/Litlyx/litlyx
synced 2025-12-10 15:58:38 +01:00
94 lines
2.8 KiB
TypeScript
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 };
|
|
|
|
|
|
}); |