mirror of
https://github.com/Litlyx/litlyx
synced 2025-12-11 16:28:37 +01:00
new selfhosted version
This commit is contained in:
94
dashboard/server/api/members/add.post.ts
Normal file
94
dashboard/server/api/members/add.post.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
|
||||
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 };
|
||||
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user