Files
triggerdotdev--trigger.dev/apps/webapp/app/v3/services/billingLimit/billingLimitQueuedRuns.server.ts
T
2026-07-13 13:32:57 +08:00

99 lines
2.7 KiB
TypeScript

import type { PrismaClient, TaskRunStatus } from "@trigger.dev/database";
import { QUEUED_STATUSES, RUNNING_STATUSES } from "~/components/runs/v3/TaskRunStatus";
import { prisma } from "~/db.server";
import { clickhouseFactory } from "~/services/clickhouse/clickhouseFactoryInstance.server";
import { RunsRepository } from "~/services/runsRepository/runsRepository.server";
import { BILLABLE_ENVIRONMENT_TYPES } from "./billingLimitConstants";
export type BillableEnvironmentRef = {
id: string;
projectId: string;
};
export async function getBillableEnvironmentsForBillingLimit(
organizationId: string,
prismaClient: PrismaClient = prisma
): Promise<BillableEnvironmentRef[]> {
return prismaClient.runtimeEnvironment.findMany({
where: {
organizationId,
type: { in: [...BILLABLE_ENVIRONMENT_TYPES] },
},
select: {
id: true,
projectId: true,
},
});
}
export async function createBillingLimitRunsRepository(organizationId: string) {
const clickhouse = await clickhouseFactory.getClickhouseForOrganization(
organizationId,
"standard"
);
return new RunsRepository({
clickhouse,
prisma: prisma as PrismaClient,
});
}
export async function countQueuedRunsForBillableEnvironment(
runsRepository: RunsRepository,
organizationId: string,
environment: BillableEnvironmentRef
): Promise<number> {
return countRunsForBillableEnvironment(runsRepository, organizationId, environment, [
...QUEUED_STATUSES,
]);
}
export async function countInProgressRunsForBillableEnvironment(
runsRepository: RunsRepository,
organizationId: string,
environment: BillableEnvironmentRef
): Promise<number> {
return countRunsForBillableEnvironment(runsRepository, organizationId, environment, [
...RUNNING_STATUSES,
]);
}
async function countRunsForBillableEnvironment(
runsRepository: RunsRepository,
organizationId: string,
environment: BillableEnvironmentRef,
statuses: TaskRunStatus[]
): Promise<number> {
return runsRepository.countRuns({
organizationId,
projectId: environment.projectId,
environmentId: environment.id,
statuses,
});
}
/** Same source as BillingLimitBulkCancelService — ClickHouse countRuns(QUEUED_STATUSES). */
export async function countBillableQueuedRunsForOrganization(
organizationId: string
): Promise<number> {
const environments = await getBillableEnvironmentsForBillingLimit(organizationId);
if (environments.length === 0) {
return 0;
}
const runsRepository = await createBillingLimitRunsRepository(organizationId);
let total = 0;
for (const environment of environments) {
total += await countQueuedRunsForBillableEnvironment(
runsRepository,
organizationId,
environment
);
}
return total;
}