UNPKG

@unchainedshop/plugins

Version:

Official plugin collection for the Unchained Engine with payment, delivery, and pricing adapters

53 lines (52 loc) 2.36 kB
import { createLogger } from '@unchainedshop/logger'; const logger = createLogger('unchained:bulk-import'); export async function bulkImportHandler(request, context) { try { const hasPermission = await context.roles?.userHasPermission(context, 'bulkImport', []); if (!hasPermission) { return Response.json({ error: 'Permission denied', message: 'User does not have bulkImport permission' }, { status: 403 }); } const url = new URL(request.url); const input = { createShouldUpsertIfIDExists: url.searchParams.get('createShouldUpsertIfIDExists') === 'true', updateShouldUpsertIfIDNotExists: url.searchParams.get('updateShouldUpsertIfIDNotExists') === 'true', skipCacheInvalidation: url.searchParams.get('skipCacheInvalidation') === 'true', remoteAddress: context.remoteAddress, }; const date = new Date().toISOString(); const stream = context.rawRequest; if (!stream) { return Response.json({ error: 'No request stream available' }, { status: 400 }); } const file = await context.services.files.uploadFileFromStream({ directoryName: 'bulk-import-streams', rawFile: Promise.resolve({ filename: `${date}.json`, createReadStream: () => stream, }), chunkSizeBytes: 1024 * 1024 * 5, meta: {}, }); const validationStream = await context.services.files.createDownloadStream({ fileId: file._id, }); if (!validationStream) { throw new Error('Could not create download stream from uploaded file'); } await context.bulkImporter.validateEventStream(validationStream); input.payloadId = file._id; input.payloadSize = file.size; const purgedInput = Object.fromEntries(Object.entries(input).filter(([, value]) => Boolean(value))); const work = await context.modules.worker.addWork({ type: 'BULK_IMPORT', input: purgedInput, retries: 0, priority: 10, }); return Response.json(work, { status: 200 }); } catch (e) { logger.error(e); return Response.json({ name: e.name, code: e.code, message: e.message }, { status: 503 }); } }