import { type Class, hasFunction } from '@travetto/runtime'; import type { BulkOperation, ModelBulkSupport } from '../types/bulk.ts'; import type { ModelType } from '../types/model.ts'; import { type ModelCrudProvider, ModelCrudUtil } from './crud.ts'; export type BulkPreStore = { insertedIds: Map; upsertedIds: Map; updatedIds: Map; existingUpsertedIds: Map; operations: BulkOperation[]; }; export class ModelBulkUtil { /** * Type guard for determining if service supports bulk operation */ static isSupported = hasFunction('processBulk'); /** * Prepares bulk operations for storage * @param cls * @param operations * @param provider */ static async preStore(cls: Class, operations: BulkOperation[], provider: ModelCrudProvider): Promise> { const insertedIds = new Map(); const upsertedIds = new Map(); const updatedIds = new Map(); const existingUpsertedIds = new Map(); // Pre store let i = 0; for (const operation of operations) { if ('insert' in operation && operation.insert) { operation.insert = await ModelCrudUtil.preStore(cls, operation.insert, provider); insertedIds.set(i, operation.insert.id!); } else if ('update' in operation && operation.update) { operation.update = await ModelCrudUtil.preStore(cls, operation.update, provider); updatedIds.set(i, operation.update.id); } else if ('upsert' in operation && operation.upsert) { const isNew = !operation.upsert.id; operation.upsert = await ModelCrudUtil.preStore(cls, operation.upsert, provider); if (isNew) { upsertedIds.set(i, operation.upsert.id!); } else { existingUpsertedIds.set(i, operation.upsert.id!); } } i += 1; } return { insertedIds, upsertedIds, updatedIds, existingUpsertedIds, operations }; } }