|
|
|
@@ -22,9 +22,14 @@ import { csvRowsToObjects, parseCsv } from "../../../lib/csv";
|
|
|
|
|
//
|
|
|
|
|
// Las fotos se descargan del origen y se re-alojan en el mismo
|
|
|
|
|
// MinIO/S3 que ya usa el resto del catalogo (uploadFilesWorkflow ->
|
|
|
|
|
// mismo File Module Provider de medusa-config.ts, ya corre en el NAS),
|
|
|
|
|
// bajo el prefijo import-products/ para separarlas de ari-products/
|
|
|
|
|
// (subidas manuales desde el Admin).
|
|
|
|
|
// mismo File Module Provider de medusa-config.ts, ya corre en el NAS).
|
|
|
|
|
// El bucket (S3_BUCKET=ari-products) es plano -- el provider de S3 de
|
|
|
|
|
// Medusa descarta cualquier subcarpeta del filename (usa solo
|
|
|
|
|
// path.parse().name + ulid, confirmado leyendo
|
|
|
|
|
// @medusajs/file-s3/dist/services/s3-file.js), asi que no hay una
|
|
|
|
|
// carpeta separada real para lo importado -- queda mezclado con el
|
|
|
|
|
// resto de fotos del catalogo, mismo criterio de nombres unicos por
|
|
|
|
|
// ulid que ya usa todo el sitio.
|
|
|
|
|
|
|
|
|
|
const MAX_IMAGE_BYTES = 8 * 1024 * 1024;
|
|
|
|
|
const IMAGE_FETCH_TIMEOUT_MS = 15000;
|
|
|
|
@@ -116,8 +121,13 @@ export async function POST(req: MedusaRequest<{ csv: string }>, res: MedusaRespo
|
|
|
|
|
stockLocationService.listStockLocations({}),
|
|
|
|
|
fulfillmentService.listShippingProfiles({}),
|
|
|
|
|
salesChannelService.listSalesChannels({}),
|
|
|
|
|
productService.listProductCategories({}),
|
|
|
|
|
productService.listProductCollections({}),
|
|
|
|
|
// select explicito -- sin el, name/title llegaban undefined (el
|
|
|
|
|
// default de estos module services no siempre trae todos los
|
|
|
|
|
// escalares, a diferencia de la capa HTTP del Admin API, confirmado
|
|
|
|
|
// en vivo: la ruta /admin/product-categories con fields=id,name si
|
|
|
|
|
// los trae completos).
|
|
|
|
|
productService.listProductCategories({}, { select: ["id", "name"] }),
|
|
|
|
|
productService.listProductCollections({}, { select: ["id", "title"] }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const locationId = locations[0]?.id;
|
|
|
|
@@ -131,8 +141,12 @@ export async function POST(req: MedusaRequest<{ csv: string }>, res: MedusaRespo
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const categoryByName = new Map(categories.map((c) => [c.name.toLowerCase().trim(), c.id]));
|
|
|
|
|
const collectionByName = new Map(collections.map((c) => [c.title.toLowerCase().trim(), c.id]));
|
|
|
|
|
const categoryByName = new Map(
|
|
|
|
|
categories.filter((c) => c.name).map((c) => [c.name.toLowerCase().trim(), c.id]),
|
|
|
|
|
);
|
|
|
|
|
const collectionByName = new Map(
|
|
|
|
|
collections.filter((c) => c.title).map((c) => [c.title.toLowerCase().trim(), c.id]),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const results: RowResult[] = [];
|
|
|
|
|
|
|
|
|
@@ -155,7 +169,7 @@ export async function POST(req: MedusaRequest<{ csv: string }>, res: MedusaRespo
|
|
|
|
|
const { result: uploadedFiles } = await uploadFilesWorkflow(req.scope).run({
|
|
|
|
|
input: {
|
|
|
|
|
files: downloaded.map((file, i) => ({
|
|
|
|
|
filename: `import-products/${Date.now()}-${index}-${i}.${file.extension}`,
|
|
|
|
|
filename: `${Date.now()}-${index}-${i}.${file.extension}`,
|
|
|
|
|
mimeType: file.mimeType,
|
|
|
|
|
content: file.content,
|
|
|
|
|
access: "public" as const,
|
|
|
|
|