mirror of
https://github.com/eliasstepanik/core.git
synced 2026-01-11 16:58:28 +00:00
101 lines
2.8 KiB
TypeScript
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;
|
|
},
|
|
});
|