From a176c484b9fce406fc3109d911814dbcfcf8d92b Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Sun, 22 Jan 2023 19:50:56 +0100 Subject: [PATCH] Created the member.ts controller --- src/controller/member.ts | 79 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/controller/member.ts diff --git a/src/controller/member.ts b/src/controller/member.ts new file mode 100644 index 0000000..8ccb041 --- /dev/null +++ b/src/controller/member.ts @@ -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(); +};