In questo capitolo vedremo come perfezionare l'importazione dei prodotti di WooCommerce importando anche l'immagine principale di ciascun prodotto.
Creiamo la directory /public/images/products/
dove salveremo le immagini. Quindi installiamo il modulo request:
npm install request --save
Ora creiamo una funzione di utility che accetta come parametro un prodotto delle REST API ed effettua il download dell'immagine principale restituendo il nuovo URL dell'immagine o null
in caso di errore:
'use strict';
const request = require('request');
const fs = require('fs');
const path = require('path');
const ABSPATH = path.dirname(process.mainModule.filename);
const UPLOAD_DIR = ABSPATH + '/public/images/products/';
module.exports = {
importProductImage: (product) => {
let featuredImageSrc = product.featured_src;
let imageName = featuredImageSrc.substring(featuredImageSrc.lastIndexOf('/') + 1);
let imageSrc = '/public/images/products/' + imageName;
try {
request(featuredImageSrc).pipe(fs.createWriteStream(UPLOAD_DIR + imageName));
return imageSrc;
} catch(e) {
return null;
}
}
};
Abbiamo definito come costante il path assoluto alla cartella delle immagini dei prodotti per poi usarlo nel download dell'immagine in evidenza. Il download avviene reindirizzando il risultato ottenuto dalla richiesta GET allo stream di scrittura di Node che salva fisicamente l'immagine usando il nome originale preso dall'URL dell'immagine originale.
A questo punto aggiungiamo la funzione di utility alla funzione di middleware dell'App:
const productUtils = require('./lib/products-utils');
app.use( (req, res, next ) => {
req.API = API;
req.crypto = crypto;
req.db = new db();
req.utils = productUtils;
next();
});
Ora dobbiamo solo modificare la nostra route di importazione:
importProducts: async (req, res) => {
try {
let data = await req.API.products();
let products = data.products;
req.db.connect().then(client => {
let db = client.db('wc');
let prods = db.collection('products');
products.forEach(product => {
let id = product.id;
prods.count({id: id}, (err, num) => {
if(!err) {
if( num === 0 ) {
let importedImage = req.utils.importProductImage(product);
if(importedImage !== null) {
product.featured_src = importedImage;
}
prods.insert(product);
}
}
});
});
res.redirect('/dashboard/import/?imported=1');
});
} catch(err) {
res.redirect('/dashboard/import');
}
}
Se l'importazione dell'immagine ha avuto successo, sostituiamo l'URL dell'immagine originale con il nuovo URL ottenuto dalla funzione di importazione.