79 lines
2.1 KiB
TypeScript
79 lines
2.1 KiB
TypeScript
import type { PrismaClient } from "~/db.server";
|
|
import { prisma } from "~/db.server";
|
|
import { workerQueue } from "../worker.server";
|
|
import { createHttpSourceRequest } from "~/utils/createHttpSourceRequest";
|
|
import { RuntimeEnvironmentType } from "~/database-types";
|
|
|
|
export class HandleHttpSourceService {
|
|
#prismaClient: PrismaClient;
|
|
|
|
constructor(prismaClient: PrismaClient = prisma) {
|
|
this.#prismaClient = prismaClient;
|
|
}
|
|
|
|
public async call(id: string, request: Request) {
|
|
const triggerSource = await this.#prismaClient.triggerSource.findUnique({
|
|
where: { id },
|
|
include: {
|
|
endpoint: true,
|
|
environment: true,
|
|
secretReference: true,
|
|
organization: true,
|
|
},
|
|
});
|
|
|
|
if (!triggerSource) {
|
|
return { status: 404 };
|
|
}
|
|
|
|
if (!triggerSource.active) {
|
|
return { status: 200 };
|
|
}
|
|
|
|
if (!triggerSource.endpoint.url) {
|
|
return { status: 404 };
|
|
}
|
|
|
|
if (!triggerSource.organization.runsEnabled) {
|
|
return { status: 404 };
|
|
}
|
|
|
|
if (!triggerSource.interactive) {
|
|
const sourceRequest = await createHttpSourceRequest(request);
|
|
|
|
await this.#prismaClient.$transaction(async (tx) => {
|
|
// Create a request delivery and then enqueue it to be delivered
|
|
const delivery = await tx.httpSourceRequestDelivery.create({
|
|
data: {
|
|
sourceId: triggerSource.id,
|
|
endpointId: triggerSource.endpointId,
|
|
environmentId: triggerSource.environmentId,
|
|
url: sourceRequest.url,
|
|
method: sourceRequest.method,
|
|
headers: sourceRequest.headers,
|
|
body: sourceRequest.rawBody,
|
|
},
|
|
});
|
|
|
|
await workerQueue.enqueue(
|
|
"deliverHttpSourceRequest",
|
|
{
|
|
id: delivery.id,
|
|
},
|
|
{
|
|
tx,
|
|
maxAttempts:
|
|
triggerSource.environment.type === RuntimeEnvironmentType.DEVELOPMENT ? 1 : undefined,
|
|
}
|
|
);
|
|
});
|
|
|
|
return { status: 200 };
|
|
}
|
|
|
|
// TODO: implement interactive webhooks
|
|
|
|
return { status: 200 };
|
|
}
|
|
}
|