Files
triggerdotdev--trigger.dev/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.live.ts
2026-07-13 13:32:57 +08:00

93 lines
3.2 KiB
TypeScript

import { type LoaderFunctionArgs } from "@remix-run/server-runtime";
import { z } from "zod";
import { $replica } from "~/db.server";
import { mapRunToLiveFields } from "~/presenters/v3/mapRunToLiveFields.server";
import { getRunFiltersFromRequest } from "~/presenters/RunFilters.server";
import { clickhouseFactory } from "~/services/clickhouse/clickhouseFactoryInstance.server";
import { loadProjectEnvironmentFromRequest } from "~/services/loadProjectEnvironmentFromRequest.server";
import { RunsRepository } from "~/services/runsRepository/runsRepository.server";
import { runIdsQueryParam } from "~/utils/searchParams";
const SearchParamsSchema = z.object({
runIds: runIdsQueryParam,
includeNewRuns: z
.string()
.optional()
.transform((value) => value === "true"),
since: z.coerce.number().optional(),
});
export async function loader({ request, params }: LoaderFunctionArgs) {
const url = new URL(request.url);
const { runIds, includeNewRuns, since } = SearchParamsSchema.parse(
Object.fromEntries(url.searchParams)
);
const newRunsSince = includeNewRuns && since !== undefined ? since : undefined;
if (runIds.length === 0 && newRunsSince === undefined) {
return { runs: [] };
}
const { project, environment } = await loadProjectEnvironmentFromRequest(request, params);
const clickhouse = await clickhouseFactory.getClickhouseForOrganization(
project.organizationId,
"standard"
);
const runsRepository = new RunsRepository({ clickhouse, prisma: $replica });
const [runs, newRunsResult] = await Promise.all([
runIds.length > 0
? runsRepository
.listRuns({
organizationId: project.organizationId,
projectId: project.id,
environmentId: environment.id,
runId: runIds,
page: { size: 100 },
})
.then(({ runs: listedRuns }) => listedRuns.map(mapRunToLiveFields))
: Promise.resolve([]),
newRunsSince !== undefined
? (async () => {
const filters = await getRunFiltersFromRequest(request);
if (filters.to !== undefined && filters.to <= newRunsSince) {
return { count: 0, since: newRunsSince };
}
const { runIds: newRunIds } = await runsRepository.listRunIds({
organizationId: project.organizationId,
projectId: project.id,
environmentId: environment.id,
tasks: filters.tasks,
versions: filters.versions,
statuses: filters.statuses,
tags: filters.tags,
scheduleId: filters.scheduleId,
period: filters.period,
from: Math.max(filters.from ?? 0, newRunsSince + 1),
to: filters.to,
rootOnly: filters.rootOnly,
batchId: filters.batchId,
runId: filters.runId,
bulkId: filters.bulkId,
queues: filters.queues,
machines: filters.machines,
errorId: filters.errorId,
page: { size: 100 },
});
return { count: newRunIds.length, since: newRunsSince };
})()
: Promise.resolve(undefined),
]);
if (newRunsResult) {
return { runs, ...newRunsResult };
}
return { runs };
}