93 lines
3.2 KiB
TypeScript
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 };
|
|
}
|