core/apps/webapp/app/trigger/integrations/integration-run.ts
Harshith Mullapudi fa8d2064e1 Feat: v2
2025-07-07 13:46:26 +05:30

91 lines
2.4 KiB
TypeScript

import createLoadRemoteModule, {
createRequires,
} from '@paciolan/remote-module-loader';
import {
IntegrationAccount,
IntegrationDefinition,
} from '@redplanethq/sol-sdk';
import { logger, task } from '@trigger.dev/sdk/v3';
import axios from 'axios';
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,
eventBody,
integrationAccount,
integrationDefinition,
event,
}: {
pat: string;
// This is the event you want to pass to the integration
// eslint-disable-next-line @typescript-eslint/no-explicit-any
event: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
eventBody?: any;
integrationDefinition: IntegrationDefinition;
integrationAccount?: IntegrationAccount;
}) => {
const remoteModuleLoad = await loadRemoteModule(
getRequires(createAxiosInstance(pat)),
);
logger.info(
`${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`,
);
const integrationFunction = await remoteModuleLoad(
`${integrationDefinition.url}/${integrationDefinition.version}/backend/index.js`,
);
// const integrationFunction = await remoteModuleLoad(
// `${integrationDefinition.url}`,
// );
return await integrationFunction.run({
integrationAccount,
integrationDefinition,
event,
eventBody: {
...(eventBody ? eventBody : {}),
},
});
},
});