Skip to content

Commit 5800cb4

Browse files
committed
Made the run repository an interface, deferring just to CH for now
1 parent e23522a commit 5800cb4

File tree

8 files changed

+160
-78
lines changed

8 files changed

+160
-78
lines changed

apps/webapp/app/presenters/RunFilters.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
TaskRunListSearchFilters,
44
} from "~/components/runs/v3/RunFilters";
55
import { getRootOnlyFilterPreference } from "~/services/preferences/uiPreferences.server";
6-
import { type ParsedRunFilters } from "~/services/runsRepository.server";
6+
import { type ParsedRunFilters } from "~/services/runsRepository/runsRepository.server";
77

88
type FiltersFromRequest = ParsedRunFilters & Required<Pick<ParsedRunFilters, "rootOnly">>;
99

apps/webapp/app/presenters/v3/BulkActionPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { getUsername } from "~/utils/username";
22
import { BasePresenter } from "./basePresenter.server";
33
import { type BulkActionMode } from "~/components/BulkActionFilterSummary";
4-
import { parseRunListInputOptions } from "~/services/runsRepository.server";
4+
import { parseRunListInputOptions } from "~/services/runsRepository/runsRepository.server";
55
import { TaskRunListSearchFilters } from "~/components/runs/v3/RunFilters";
66

77
type BulkActionOptions = {

apps/webapp/app/presenters/v3/CreateBulkActionPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { type PrismaClient } from "@trigger.dev/database";
22
import { CreateBulkActionSearchParams } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.bulkaction";
33
import { clickhouseClient } from "~/services/clickhouseInstance.server";
4-
import { RunsRepository } from "~/services/runsRepository.server";
4+
import { RunsRepository } from "~/services/runsRepository/runsRepository.server";
55
import { getRunFiltersFromRequest } from "../RunFilters.server";
66
import { BasePresenter } from "./basePresenter.server";
77

apps/webapp/app/presenters/v3/NextRunListPresenter.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { type Direction } from "~/components/ListPagination";
99
import { timeFilters } from "~/components/runs/v3/SharedFilters";
1010
import { findDisplayableEnvironment } from "~/models/runtimeEnvironment.server";
1111
import { getAllTaskIdentifiers } from "~/models/task.server";
12-
import { RunsRepository } from "~/services/runsRepository.server";
12+
import { RunsRepository } from "~/services/runsRepository/runsRepository.server";
1313
import { machinePresetFromRun } from "~/v3/machinePresets.server";
1414
import { ServiceValidationError } from "~/v3/services/baseService.server";
1515
import { isCancellableRunStatus, isFinalRunStatus, isPendingRunStatus } from "~/v3/taskStatus";

apps/webapp/app/services/runsRepository.server.ts renamed to apps/webapp/app/services/runsRepository/clickhouseRunsRepository.server.ts

Lines changed: 12 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,16 @@
1-
import { type ClickHouse, type ClickhouseQueryBuilder } from "@internal/clickhouse";
2-
import { type Tracer } from "@internal/tracing";
3-
import { type Logger, type LogLevel } from "@trigger.dev/core/logger";
4-
import { MachinePresetName } from "@trigger.dev/core/v3";
5-
import { BulkActionId, RunId } from "@trigger.dev/core/v3/isomorphic";
6-
import { TaskRunStatus } from "@trigger.dev/database";
7-
import parseDuration from "parse-duration";
8-
import { z } from "zod";
91
import { timeFilters } from "~/components/runs/v3/SharedFilters";
10-
import { type PrismaClient } from "~/db.server";
11-
12-
export type RunsRepositoryOptions = {
13-
clickhouse: ClickHouse;
14-
prisma: PrismaClient;
15-
logger?: Logger;
16-
logLevel?: LogLevel;
17-
tracer?: Tracer;
18-
};
19-
20-
const RunStatus = z.enum(Object.values(TaskRunStatus) as [TaskRunStatus, ...TaskRunStatus[]]);
21-
22-
const RunListInputOptionsSchema = z.object({
23-
organizationId: z.string(),
24-
projectId: z.string(),
25-
environmentId: z.string(),
26-
//filters
27-
tasks: z.array(z.string()).optional(),
28-
versions: z.array(z.string()).optional(),
29-
statuses: z.array(RunStatus).optional(),
30-
tags: z.array(z.string()).optional(),
31-
scheduleId: z.string().optional(),
32-
period: z.string().optional(),
33-
from: z.number().optional(),
34-
to: z.number().optional(),
35-
isTest: z.boolean().optional(),
36-
rootOnly: z.boolean().optional(),
37-
batchId: z.string().optional(),
38-
runId: z.array(z.string()).optional(),
39-
bulkId: z.string().optional(),
40-
queues: z.array(z.string()).optional(),
41-
machines: MachinePresetName.array().optional(),
42-
});
43-
44-
export type RunListInputOptions = z.infer<typeof RunListInputOptionsSchema>;
45-
export type RunListInputFilters = Omit<
46-
RunListInputOptions,
47-
"organizationId" | "projectId" | "environmentId"
48-
>;
49-
50-
export type ParsedRunFilters = RunListInputFilters & {
51-
cursor?: string;
52-
direction?: "forward" | "backward";
53-
};
54-
55-
type FilterRunsOptions = Omit<RunListInputOptions, "period"> & {
56-
period: number | undefined;
57-
};
58-
59-
type Pagination = {
60-
page: {
61-
size: number;
62-
cursor?: string;
63-
direction?: "forward" | "backward";
64-
};
65-
};
66-
67-
export type ListRunsOptions = RunListInputOptions & Pagination;
68-
69-
export class RunsRepository {
2+
import {
3+
type FilterRunsOptions,
4+
type RunListInputOptions,
5+
type IRunsRepository,
6+
type ListRunsOptions,
7+
type RunsRepositoryOptions,
8+
} from "./runsRepository.server";
9+
import parseDuration from "parse-duration";
10+
import { BulkActionId, RunId } from "@trigger.dev/core/v3/isomorphic";
11+
import { type ClickhouseQueryBuilder } from "@internal/clickhouse";
12+
13+
export class ClickHouseRunsRepository implements IRunsRepository {
7014
constructor(private readonly options: RunsRepositoryOptions) {}
7115

7216
async listRunIds(options: ListRunsOptions) {
@@ -373,7 +317,3 @@ function applyRunFiltersToQueryBuilder<T>(
373317
});
374318
}
375319
}
376-
377-
export function parseRunListInputOptions(data: any): RunListInputOptions {
378-
return RunListInputOptionsSchema.parse(data);
379-
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import { type ClickHouse, type ClickhouseQueryBuilder } from "@internal/clickhouse";
2+
import { type Tracer } from "@internal/tracing";
3+
import { type Logger, type LogLevel } from "@trigger.dev/core/logger";
4+
import { MachinePresetName } from "@trigger.dev/core/v3";
5+
import { BulkActionId, RunId } from "@trigger.dev/core/v3/isomorphic";
6+
import { Prisma, TaskRunStatus } from "@trigger.dev/database";
7+
import parseDuration from "parse-duration";
8+
import { z } from "zod";
9+
import { timeFilters } from "~/components/runs/v3/SharedFilters";
10+
import { type PrismaClient } from "~/db.server";
11+
import { ClickHouseRunsRepository } from "./clickhouseRunsRepository.server";
12+
13+
export type RunsRepositoryOptions = {
14+
clickhouse: ClickHouse;
15+
prisma: PrismaClient;
16+
logger?: Logger;
17+
logLevel?: LogLevel;
18+
tracer?: Tracer;
19+
};
20+
21+
const RunStatus = z.enum(Object.values(TaskRunStatus) as [TaskRunStatus, ...TaskRunStatus[]]);
22+
23+
const RunListInputOptionsSchema = z.object({
24+
organizationId: z.string(),
25+
projectId: z.string(),
26+
environmentId: z.string(),
27+
//filters
28+
tasks: z.array(z.string()).optional(),
29+
versions: z.array(z.string()).optional(),
30+
statuses: z.array(RunStatus).optional(),
31+
tags: z.array(z.string()).optional(),
32+
scheduleId: z.string().optional(),
33+
period: z.string().optional(),
34+
from: z.number().optional(),
35+
to: z.number().optional(),
36+
isTest: z.boolean().optional(),
37+
rootOnly: z.boolean().optional(),
38+
batchId: z.string().optional(),
39+
runId: z.array(z.string()).optional(),
40+
bulkId: z.string().optional(),
41+
queues: z.array(z.string()).optional(),
42+
machines: MachinePresetName.array().optional(),
43+
});
44+
45+
export type RunListInputOptions = z.infer<typeof RunListInputOptionsSchema>;
46+
export type RunListInputFilters = Omit<
47+
RunListInputOptions,
48+
"organizationId" | "projectId" | "environmentId"
49+
>;
50+
51+
export type ParsedRunFilters = RunListInputFilters & {
52+
cursor?: string;
53+
direction?: "forward" | "backward";
54+
};
55+
56+
export type FilterRunsOptions = Omit<RunListInputOptions, "period"> & {
57+
period: number | undefined;
58+
};
59+
60+
type Pagination = {
61+
page: {
62+
size: number;
63+
cursor?: string;
64+
direction?: "forward" | "backward";
65+
};
66+
};
67+
68+
type ListedRun = Prisma.TaskRunGetPayload<{
69+
select: {
70+
id: true;
71+
friendlyId: true;
72+
taskIdentifier: true;
73+
taskVersion: true;
74+
runtimeEnvironmentId: true;
75+
status: true;
76+
createdAt: true;
77+
startedAt: true;
78+
lockedAt: true;
79+
delayUntil: true;
80+
updatedAt: true;
81+
completedAt: true;
82+
isTest: true;
83+
spanId: true;
84+
idempotencyKey: true;
85+
ttl: true;
86+
expiredAt: true;
87+
costInCents: true;
88+
baseCostInCents: true;
89+
usageDurationMs: true;
90+
runTags: true;
91+
depth: true;
92+
rootTaskRunId: true;
93+
batchId: true;
94+
metadata: true;
95+
metadataType: true;
96+
machinePreset: true;
97+
queue: true;
98+
};
99+
}>;
100+
101+
export type ListRunsOptions = RunListInputOptions & Pagination;
102+
103+
export interface IRunsRepository {
104+
listRunIds(options: ListRunsOptions): Promise<string[]>;
105+
listRuns(options: ListRunsOptions): Promise<{
106+
runs: ListedRun[];
107+
pagination: {
108+
nextCursor: string | null;
109+
previousCursor: string | null;
110+
};
111+
}>;
112+
countRuns(options: RunListInputOptions): Promise<number>;
113+
}
114+
115+
export class RunsRepository implements IRunsRepository {
116+
private readonly clickHouseRunsRepository: ClickHouseRunsRepository;
117+
constructor(private readonly options: RunsRepositoryOptions) {
118+
this.clickHouseRunsRepository = new ClickHouseRunsRepository(options);
119+
}
120+
121+
listRunIds(options: ListRunsOptions): Promise<string[]> {
122+
return this.clickHouseRunsRepository.listRunIds(options);
123+
}
124+
125+
listRuns(options: ListRunsOptions): Promise<{
126+
runs: ListedRun[];
127+
pagination: {
128+
nextCursor: string | null;
129+
previousCursor: string | null;
130+
};
131+
}> {
132+
return this.clickHouseRunsRepository.listRuns(options);
133+
}
134+
135+
countRuns(options: RunListInputOptions): Promise<number> {
136+
return this.clickHouseRunsRepository.countRuns(options);
137+
}
138+
}
139+
140+
export function parseRunListInputOptions(data: any): RunListInputOptions {
141+
return RunListInputOptionsSchema.parse(data);
142+
}

apps/webapp/app/v3/services/bulk/BulkActionV2.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
parseRunListInputOptions,
1313
type RunListInputFilters,
1414
RunsRepository,
15-
} from "~/services/runsRepository.server";
15+
} from "~/services/runsRepository/runsRepository.server";
1616
import { BaseService } from "../baseService.server";
1717
import { commonWorker } from "~/v3/commonWorker.server";
1818
import { env } from "~/env.server";

apps/webapp/test/runsRepository.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { containerTest } from "@internal/testcontainers";
22
import { setTimeout } from "node:timers/promises";
3-
import { RunsRepository } from "~/services/runsRepository.server";
3+
import { RunsRepository } from "~/services/runsRepository/runsRepository.server";
44
import { setupClickhouseReplication } from "./utils/replicationUtils";
55

66
vi.setConfig({ testTimeout: 60_000 });

0 commit comments

Comments
 (0)