core/apps/webapp/app/trigger/integrations/integration-run.ts
2025-07-11 18:32:26 +05:30

101 lines
2.8 KiB
TypeScript

import createLoadRemoteModule, {
createRequires,
} from "@paciolan/remote-module-loader";
import { logger, task } from "@trigger.dev/sdk/v3";
import axios from "axios";
import {
type IntegrationDefinitionV2,
type IntegrationAccount,
} from "@core/database";
import { deletePersonalAccessToken } from "../utils/utils";
import { type IntegrationEventType } from "@core/types";
const fetcher = async (url: string) => {
// Handle remote URLs with axios
const response = await axios.get(url);
return response.data;
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const loadRemoteModule = async (requires: any) =>
createLoadRemoteModule({ fetcher, requires });
function createAxiosInstance(token: string) {
const instance = axios.create();
instance.interceptors.request.use((config) => {
// Check if URL starts with /api and doesn't have a full host
if (config.url?.startsWith("/api")) {
config.url = `${process.env.BACKEND_HOST}${config.url.replace("/api/", "/")}`;
}
if (
config.url?.includes(process.env.FRONTEND_HOST || "") ||
config.url?.includes(process.env.BACKEND_HOST || "")
) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
return instance;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const getRequires = (axios: any) => createRequires({ axios });
export const integrationRun = task({
id: "integration-run",
run: async ({
pat,
patId,
eventBody,
integrationAccount,
integrationDefinition,
event,
}: {
pat: string;
patId: string;
// This is the event you want to pass to the integration
event: IntegrationEventType;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
eventBody?: any;
integrationDefinition: IntegrationDefinitionV2;
integrationAccount?: IntegrationAccount;
}) => {
const remoteModuleLoad = await loadRemoteModule(
getRequires(createAxiosInstance(pat)),
);
logger.info(
`${integrationDefinition.url}/${integrationDefinition.version}/index.cjs`,
);
const integrationFunction = await remoteModuleLoad(
`${integrationDefinition.url}/${integrationDefinition.version}/index.cjs`,
);
// const integrationFunction = await remoteModuleLoad(
// `${integrationDefinition.url}`,
// );
// Construct the proper IntegrationEventPayload structure
const integrationEventPayload = {
event,
eventBody: { ...eventBody, integrationDefinition },
config: integrationAccount?.integrationConfiguration || {},
};
const result = await integrationFunction.run(integrationEventPayload);
await deletePersonalAccessToken(patId);
logger.info("Personal access token deleted");
return result;
},
});