const { safeJsonParse } = require("../utils/http"); const prisma = require("../utils/prisma"); const Invite = { makeCode: () => { const uuidAPIKey = require("uuid-apikey"); return uuidAPIKey.create().apiKey; }, create: async function ({ createdByUserId = 0, workspaceIds = [] }) { try { const invite = await prisma.invites.create({ data: { code: this.makeCode(), createdBy: createdByUserId, workspaceIds: JSON.stringify(workspaceIds), }, }); return { invite, error: null }; } catch (error) { console.error("FAILED TO CREATE INVITE.", error.message); return { invite: null, error: error.message }; } }, deactivate: async function (inviteId = null) { try { await prisma.invites.update({ where: { id: Number(inviteId) }, data: { status: "disabled" }, }); return { success: true, error: null }; } catch (error) { console.error(error.message); return { success: false, error: error.message }; } }, markClaimed: async function (inviteId = null, user) { try { const invite = await prisma.invites.update({ where: { id: Number(inviteId) }, data: { status: "claimed", claimedBy: user.id }, }); try { if (!!invite?.workspaceIds) { const { Workspace } = require("./workspace"); const { WorkspaceUser } = require("./workspaceUsers"); const workspaceIds = (await Workspace.where({})).map( (workspace) => workspace.id ); const ids = safeJsonParse(invite.workspaceIds) .map((id) => Number(id)) .filter((id) => workspaceIds.includes(id)); if (ids.length !== 0) await WorkspaceUser.createMany(user.id, ids); } } catch (e) { console.error( "Could not add user to workspaces automatically", e.message ); } return { success: true, error: null }; } catch (error) { console.error(error.message); return { success: false, error: error.message }; } }, get: async function (clause = {}) { try { const invite = await prisma.invites.findFirst({ where: clause }); return invite || null; } catch (error) { console.error(error.message); return null; } }, count: async function (clause = {}) { try { const count = await prisma.invites.count({ where: clause }); return count; } catch (error) { console.error(error.message); return 0; } }, delete: async function (clause = {}) { try { await prisma.invites.deleteMany({ where: clause }); return true; } catch (error) { console.error(error.message); return false; } }, where: async function (clause = {}, limit) { try { const invites = await prisma.invites.findMany({ where: clause, take: limit || undefined, }); return invites; } catch (error) { console.error(error.message); return []; } }, whereWithUsers: async function (clause = {}, limit) { const { User } = require("./user"); try { const invites = await this.where(clause, limit); for (const invite of invites) { if (invite.claimedBy) { const acceptedUser = await User.get({ id: invite.claimedBy }); invite.claimedBy = { id: acceptedUser?.id, username: acceptedUser?.username, }; } if (invite.createdBy) { const createdUser = await User.get({ id: invite.createdBy }); invite.createdBy = { id: createdUser?.id, username: createdUser?.username, }; } } return invites; } catch (error) { console.error(error.message); return []; } }, }; module.exports = { Invite };