Data4Autos-Shopify-Frontend/app/utils/shopify-products.server.js
metatroncubeswdev 6cb1d01b0c Inital commit
2025-06-27 18:48:53 -04:00

96 lines
3.0 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// app/utils/shopify-products.server.js
/**
* Given a Turn14 item object and a Shopify Admin client,
* creates the product + media + joins the specified collection +
* sets price + sets SKU.
*/
export async function createFullProductFromTurn14Item(admin, item, collectionId) {
// 1⃣ Create product + media + join collection
const createRes = await admin.graphql(
`mutation CreateFullProduct($product: ProductCreateInput!, $media: [CreateMediaInput!]) {
productCreate(product: $product, media: $media) {
product {
id
variants(first:1) {
nodes {
id
inventoryItem { id }
}
}
}
userErrors { field message }
}
}`,
{
variables: {
product: {
title: item.attributes.product_name,
descriptionHtml: item.attributes.part_description,
vendor: item.attributes.brand.name,
productType: item.attributes.category,
handle: item.attributes.part_number.toLowerCase(),
tags: [item.attributes.category, item.attributes.subcategory],
collectionsToJoin: collectionId ? [collectionId] : [],
status: "ACTIVE",
},
media: [{
originalSource: item.attributes.images?.[0]?.url,
mediaContentType: "IMAGE",
alt: `${item.attributes.product_name} image`,
}],
},
}
);
const { productCreate } = await createRes.json();
if (productCreate.userErrors.length) {
throw new Error(productCreate.userErrors.map(e => e.message).join(", "));
}
const newProduct = productCreate.product;
const variantNode = newProduct.variants.nodes[0];
const variantId = variantNode.id;
const inventoryItemId = variantNode.inventoryItem.id;
// 2⃣ Update price
const priceRes = await admin.graphql(
`mutation UpdatePrice($productId: ID!, $variants: [ProductVariantsBulkInput!]!) {
productVariantsBulkUpdate(productId: $productId, variants: $variants) {
productVariants { id price }
userErrors { field message }
}
}`,
{
variables: {
productId: newProduct.id,
variants: [{ id: variantId, price: parseFloat(item.attributes.price) || 0 }],
},
}
);
const { productVariantsBulkUpdate } = await priceRes.json();
if (productVariantsBulkUpdate.userErrors.length) {
throw new Error(productVariantsBulkUpdate.userErrors.map(e => e.message).join(", "));
}
// 3⃣ Set SKU
const skuRes = await admin.graphql(
`mutation SetSKU($id: ID!, $input: InventoryItemInput!) {
inventoryItemUpdate(id: $id, input: $input) {
inventoryItem { sku }
userErrors { field message }
}
}`,
{
variables: {
id: inventoryItemId,
input: { sku: item.attributes.part_number },
},
}
);
const { inventoryItemUpdate } = await skuRes.json();
if (inventoryItemUpdate.userErrors.length) {
throw new Error(inventoryItemUpdate.userErrors.map(e => e.message).join(", "));
}
return { productId: newProduct.id };
}