61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
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,
|
|
};
|
|
}
|
|
}
|