import "server-only"; import { Prisma } from "@prisma/client"; import { cache as reactCache } from "react"; import { prisma } from "@formbricks/database"; import { logger } from "@formbricks/logger"; import { ZId, ZOptionalNumber, ZString } from "@formbricks/types/common"; import { DatabaseError } from "@formbricks/types/errors"; import { TIntegration, TIntegrationInput, ZIntegrationType } from "@formbricks/types/integration"; import { ITEMS_PER_PAGE } from "../constants"; import { validateInputs } from "../utils/validate"; const transformIntegration = (integration: TIntegration): TIntegration => { return { ...integration, config: { ...integration.config, data: integration.config.data.map((data) => ({ ...data, createdAt: new Date(data.createdAt), })), }, }; }; export const createOrUpdateIntegration = async ( environmentId: string, integrationData: TIntegrationInput ): Promise => { validateInputs([environmentId, ZId]); try { const integration = await prisma.integration.upsert({ where: { type_environmentId: { environmentId, type: integrationData.type, }, }, update: { ...integrationData, environment: { connect: { id: environmentId } }, }, create: { ...integrationData, environment: { connect: { id: environmentId } }, }, }); return integration; } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { logger.error(error, "Error creating or updating integration"); throw new DatabaseError(error.message); } throw error; } }; export const getIntegrations = reactCache( async (environmentId: string, page?: number): Promise => { validateInputs([environmentId, ZId], [page, ZOptionalNumber]); try { const integrations = await prisma.integration.findMany({ where: { environmentId, }, take: page ? ITEMS_PER_PAGE : undefined, skip: page ? ITEMS_PER_PAGE * (page - 1) : undefined, }); return integrations.map((integration) => transformIntegration(integration)); } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { throw new DatabaseError(error.message); } throw error; } } ); export const getIntegration = reactCache(async (integrationId: string): Promise => { try { const integration = await prisma.integration.findUnique({ where: { id: integrationId, }, }); return integration ? transformIntegration(integration) : null; } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { throw new DatabaseError(error.message); } throw error; } }); export const getIntegrationByType = reactCache( async (environmentId: string, type: TIntegrationInput["type"]): Promise => { validateInputs([environmentId, ZId], [type, ZIntegrationType]); try { const integration = await prisma.integration.findUnique({ where: { type_environmentId: { environmentId, type, }, }, }); return integration ? transformIntegration(integration) : null; } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { throw new DatabaseError(error.message); } throw error; } } ); export const deleteIntegration = async (integrationId: string): Promise => { validateInputs([integrationId, ZString]); try { const integrationData = await prisma.integration.delete({ where: { id: integrationId, }, }); return integrationData; } catch (error) { if (error instanceof Prisma.PrismaClientKnownRequestError) { throw new DatabaseError(error.message); } throw error; } };