diff --git a/apps/webapp/app/services/platform.v3.server.ts b/apps/webapp/app/services/platform.v3.server.ts index acb8ab0bb..514145971 100644 --- a/apps/webapp/app/services/platform.v3.server.ts +++ b/apps/webapp/app/services/platform.v3.server.ts @@ -214,6 +214,27 @@ export async function reportComputeUsage(request: Request) { body: await request.text(), }); } + +export async function getEntitlement(organizationId: string) { + const client = getClient(); + if (!client) return undefined; + try { + const result = await client.getEntitlement(organizationId); + if (!result.success) { + logger.error("Error getting entitlement", { error: result.error }); + return { + hasAccess: true as const, + }; + } + return result; + } catch (e) { + logger.error("Error getting entitlement", { error: e }); + return { + hasAccess: true as const, + }; + } +} + export async function projectCreated(organization: Organization, project: Project) { if (project.version === "V2" || !isCloud()) { await createEnvironment(organization, project, "STAGING"); diff --git a/apps/webapp/app/v3/services/triggerTask.server.ts b/apps/webapp/app/v3/services/triggerTask.server.ts index ff8c6be57..6c3b037f2 100644 --- a/apps/webapp/app/v3/services/triggerTask.server.ts +++ b/apps/webapp/app/v3/services/triggerTask.server.ts @@ -12,6 +12,7 @@ import { eventRepository } from "../eventRepository.server"; import { generateFriendlyId } from "../friendlyIdentifiers"; import { uploadToObjectStore } from "../r2.server"; import { BaseService } from "./baseService.server"; +import { getEntitlement } from "~/services/platform.v3.server"; export type TriggerTaskServiceOptions = { idempotencyKey?: string; @@ -23,6 +24,12 @@ export type TriggerTaskServiceOptions = { customIcon?: string; }; +export class OutOfEntitlementError extends Error { + constructor() { + super("You can't trigger a task because you have run out of credits."); + } +} + export class TriggerTaskService extends BaseService { public async call( taskId: string, @@ -51,6 +58,13 @@ export class TriggerTaskService extends BaseService { return existingRun; } + if (environment.type !== "DEVELOPMENT") { + const result = await getEntitlement(environment.organizationId); + if (result && result.hasAccess === false) { + throw new OutOfEntitlementError(); + } + } + return await eventRepository.traceEvent( taskId, {