UNPKG

@pipedream/printify

Version:

Pipedream Printify Components

228 lines (220 loc) 6.27 kB
import fs from "fs"; import { checkTmp, isValidHttpUrl, } from "../../common/utils.mjs"; import printify from "../../printify.app.mjs"; export default { key: "printify-create-product", name: "Create a Product", description: "Creates a new product on Printify. [See the documentation](https://developers.printify.com/#create-a-new-product)", version: "0.0.1", type: "action", props: { printify, shopId: { propDefinition: [ printify, "shopId", ], }, title: { propDefinition: [ printify, "title", ], }, description: { propDefinition: [ printify, "description", ], }, tags: { propDefinition: [ printify, "tags", ], optional: true, }, blueprintId: { propDefinition: [ printify, "blueprintId", ], }, printProviderId: { propDefinition: [ printify, "printProviderId", ({ blueprintId }) => ({ blueprintId, }), ], reloadProps: true, }, }, async additionalProps() { const props = {}; if (this.printProviderId) { props.variantCount = { type: "integer", label: "Print Provide Variant Quantity", description: "The quantity of variants.", min: 1, reloadProps: true, }; props.imageCount = { type: "integer", label: "Image Quantity", description: "The quantity of images.", min: 1, reloadProps: true, }; } if (this.variantCount) { for (let i = 1; i <= this.variantCount; i++) { props[`variant_${i}`] = { type: "string", label: `Variant ${i}`, description: `Print Provide Variant ${i}.`, options: async () => { const { variants } = await this.printify.listPrintProviderVariants({ blueprintId: this.blueprintId, printProviderId: this.printProviderId, }); return variants.map(({ id: value, title: label, }) => ({ label, value, })); }, }; props[`variantPrice_${i}`] = { type: "integer", label: `Variant Price ${i}`, description: `The price of the variant ${i}.`, }; props[`variantEnabled_${i}`] = { type: "boolean", label: `Variant Enabled ${i}`, description: `Whether the variant ${i} is enable or not.`, }; } } if (this.imageCount) { for (let i = 1; i <= this.imageCount; i++) { props[`position_${i}`] = { type: "string", label: `Position ${i}`, description: `The placeholder position ${i}`, }; props[`imageName_${i}`] = { type: "string", label: `Image Name ${i}`, description: `The name of the image ${i}.`, }; props[`imagePath_${i}`] = { type: "string", label: `Image Path or URL ${i}`, description: `The URL or path to a file in the \`/tmp\` directory of the image ${i}. [See the documentation on working with files](https://pipedream.com/docs/code/nodejs/working-with-files/#writing-a-file-to-tmp).`, }; props[`imageX_${i}`] = { type: "string", label: `X Coordinates ${i}`, description: `The X coordinates of image ${i}`, }; props[`imageY_${i}`] = { type: "string", label: `Y Coordinates ${i}`, description: `The Y coordinates of image ${i}`, }; props[`imageScale_${i}`] = { type: "string", label: `Scale ${i}`, description: `The scale of image ${i}`, }; props[`imageAngle_${i}`] = { type: "integer", label: `Angle ${i}`, description: `The angle of image ${i}`, }; } } return props; }, async run({ $ }) { const variants = []; const placeholders = []; for (let i = 1; i <= this.variantCount; i++) { variants.push({ id: this[`variant_${i}`], price: this[`variantPrice_${i}`], is_enabled: this[`variantEnabled_${i}`], }); } for (let i = 1; i <= this.imageCount; i++) { const imageString = this[`imagePath_${i}`]; let file = ""; let fieldName = ""; if (isValidHttpUrl(imageString)) { file = imageString; fieldName = "url"; } else { file = fs.readFileSync(checkTmp(imageString)); file = Buffer.from(file).toString("base64"); fieldName = "contents"; } const responseImage = await this.printify.uploadImage({ data: { file_name: this[`imageName_${i}`], [fieldName]: file, }, }); const verifyPos = placeholders.findIndex((item) => item.position === this[`position_${i}`]); if (verifyPos === -1) { placeholders.push({ position: this[`position_${i}`], images: [ { id: responseImage.id, x: this[`imageX_${i}`], y: this[`imageY_${i}`], scale: this[`imageScale_${i}`], angle: this[`imageAngle_${i}`], }, ], }); } else { placeholders[verifyPos].images.push( { id: responseImage.id, x: this[`imageX_${i}`], y: this[`imageY_${i}`], scale: this[`imageScale_${i}`], angle: this[`imageAngle_${i}`], }, ); } } const response = await this.printify.createProduct({ shopId: this.shopId, data: { title: this.title, description: this.description, tags: this.tags, blueprint_id: this.blueprintId, print_provider_id: this.printProviderId, print_areas: [ { variant_ids: variants.map((variant) => variant.id), placeholders: placeholders, }, ], variants, }, }); $.export("$summary", `Successfully created a new product with ID: ${response.id}`); return response; }, };