Created the member.ts controller

This commit is contained in:
Mathias Wagner 2023-01-22 19:50:56 +01:00
parent c330d78fb3
commit a176c484b9
Signed by: Mathias
GPG Key ID: B8DC354B0A1F5B44

79
src/controller/member.ts Normal file
View File

@ -0,0 +1,79 @@
import { checkProjectAccess } from "@controller/projects";
import { IKeyRole } from "@models/AccessKey";
import { encryptClearField } from "@utils/decryption";
import { IMember, Member } from "@models/Member";
import { Account } from "@models/Account";
import { sendMail } from "@utils/email";
import { getSimpleAccountObjectById } from "@controller/account";
export const sendInvitationMail = async (email: string, username: string, projectName: string) => {
sendMail({
to: email,
subject: `Einladung für ${projectName} - LicenseAPI`,
text: `Hallo ${username}. Du wurdest in das Projekt ${projectName} eingeladen. Schau ins Dashboard um die Einladung zu akzeptieren`,
});
};
export const mapMember = async (member: IMember) => {
const user = await getSimpleAccountObjectById(String(member.memberId));
return { user, role: member.role, accepted: member.accepted };
};
export const listMembers = async (userId: string, projectId: string) => {
const access = await checkProjectAccess(IKeyRole.VIEW)(userId, projectId);
if ("code" in access) return access;
const members = await Member.find({ projectId: encryptClearField(String(access._id)) });
return await Promise.all(members.map(member => mapMember(member)));
};
export const inviteMember = async (userId: string, projectId: string, configuration: { user: string, role: IKeyRole }) => {
const access = await checkProjectAccess(IKeyRole.MANAGE)(userId, projectId);
if ("code" in access) return access;
const account = await Account.findOne().or([{
username: encryptClearField(configuration.user),
allowInvites: true,
}, { email: encryptClearField(configuration.user), verified: true, allowInvites: true }]);
if (account === null) return { code: 1002, message: "The provided account does not exist or disabled invites" };
if (String(account._id) === userId) return { code: 1005, message: "You cannot invite yourself" };
const member = await Member.findOne({
projectId: encryptClearField(String(access._id)),
memberId: encryptClearField(String(account._id)),
});
if (member !== null) return { code: 1006, message: "This member is already part of this project" };
await Member.create({ memberId: account._id, role: configuration?.role, projectId: projectId });
await sendInvitationMail(account.email, account.username, access.name);
};
export const updateMemberRole = async (userId: string, projectId: string, configuration: { userId: string, role: IKeyRole }) => {
const access = await checkProjectAccess(IKeyRole.MANAGE)(userId, projectId);
if ("code" in access) return access;
const member = await Member.findOne({
projectId: encryptClearField(String(access._id)),
memberId: encryptClearField(String(configuration.userId)),
});
if (member === null) return { code: 1002, message: "The provided member is not part of this project" };
await member.updateOne({ role: configuration.role });
};
export const deleteMember = async (userId: string, projectId: string, configuration: { userId: string }) => {
const access = await checkProjectAccess(IKeyRole.MANAGE)(userId, projectId);
if ("code" in access) return access;
const member = await Member.findOne({
projectId: encryptClearField(String(access._id)),
memberId: encryptClearField(String(configuration.userId)),
});
if (member === null) return { code: 1002, message: "The provided member is not part of this project" };
await member.delete();
};