import { type BulkActionType } from "@trigger.dev/database"; import { bulkActionVerb } from "~/components/runs/v3/BulkAction"; import { BULK_ACTION_RUN_LIMIT } from "~/consts"; import { logger } from "~/services/logger.server"; import { generateFriendlyId } from "../../friendlyIdentifiers"; import { BaseService } from "../baseService.server"; import { PerformBulkActionService } from "./performBulkAction.server"; type BulkAction = { projectId: string; action: BulkActionType; runIds: string[]; }; export class CreateBulkActionService extends BaseService { public async call({ projectId, action, runIds }: BulkAction) { const group = await this._prisma.bulkActionGroup.create({ data: { friendlyId: generateFriendlyId("bulk"), projectId, type: action, }, }); //limit to the first X runs const passedTooManyRuns = runIds.length > BULK_ACTION_RUN_LIMIT; runIds = runIds.slice(0, BULK_ACTION_RUN_LIMIT); const _items = await this._prisma.bulkActionItem.createMany({ data: runIds.map((runId) => ({ friendlyId: generateFriendlyId("bulkitem"), type: action, groupId: group.id, sourceRunId: runId, })), }); logger.debug("Created bulk action group", { groupId: group.id, action, runIds, }); await PerformBulkActionService.enqueue(group.id, this._prisma); let message = bulkActionVerb(action); if (passedTooManyRuns) { message += ` the first ${BULK_ACTION_RUN_LIMIT} runs`; } else { message += ` ${runIds.length} runs`; } return { id: group.id, friendlyId: group.friendlyId, runCount: runIds.length, message, }; } }