import prisma from "@calcom/prisma"; import type { Workflow } from "./types"; export const workflowSelect = { id: true, trigger: true, time: true, timeUnit: true, userId: true, teamId: true, name: true, steps: { select: { id: true, action: true, sendTo: true, reminderBody: true, emailSubject: true, template: true, numberVerificationPending: true, sender: true, includeCalendarEvent: true, numberRequired: true, }, }, }; export const getAllWorkflows = async ( eventTypeWorkflows: Workflow[], userId?: number | null, teamId?: number | null, orgId?: number | null, workflowsLockedForUser = true ) => { const allWorkflows = eventTypeWorkflows; if (orgId) { if (teamId) { const orgTeamWorkflowsRel = await prisma.workflowsOnTeams.findMany({ where: { teamId: teamId, }, select: { workflow: { select: workflowSelect, }, }, }); const orgTeamWorkflows = orgTeamWorkflowsRel?.map((workflowRel) => workflowRel.workflow) ?? []; allWorkflows.push(...orgTeamWorkflows); } else if (userId) { const orgUserWorkflowsRel = await prisma.workflowsOnTeams.findMany({ where: { team: { members: { some: { userId: userId, accepted: true, }, }, }, }, select: { workflow: { select: workflowSelect, }, team: true, }, }); const orgUserWorkflows = orgUserWorkflowsRel.map((workflowRel) => workflowRel.workflow) ?? []; allWorkflows.push(...orgUserWorkflows); } // get workflows that are active on all const activeOnAllOrgWorkflows = await prisma.workflow.findMany({ where: { teamId: orgId, isActiveOnAll: true, }, select: workflowSelect, }); allWorkflows.push(...activeOnAllOrgWorkflows); } if (teamId) { const activeOnAllTeamWorkflows = await prisma.workflow.findMany({ where: { teamId, isActiveOnAll: true, }, select: workflowSelect, }); allWorkflows.push(...activeOnAllTeamWorkflows); } if ((!teamId || !workflowsLockedForUser) && userId) { const activeOnAllUserWorkflows = await prisma.workflow.findMany({ where: { userId, teamId: null, isActiveOnAll: true, }, select: workflowSelect, }); allWorkflows.push(...activeOnAllUserWorkflows); } // remove all the duplicate workflows from allWorkflows const seen = new Set(); const workflows = allWorkflows.filter((workflow) => { const duplicate = seen.has(workflow.id); seen.add(workflow.id); return !duplicate; }); return workflows; };