import 'reflect-metadata'; import fs from 'fs/promises'; import path from 'path'; import { config as setupEnv } from 'dotenv-flow'; import { parse, unparse } from 'papaparse'; import { v4 as uuidv4 } from 'uuid'; import logger from '@/logger'; import { CSVPage } from '@/seed/types'; import { RetailerKind } from '@/types'; setupEnv(); const firebaseIdToUuidMap = new Map(); const mapFirebaseIdToUuid = (firebaseId: string): string => { const cachedUuid = firebaseIdToUuidMap.get(firebaseId); if (cachedUuid) return cachedUuid; const uuid = uuidv4(); firebaseIdToUuidMap.set(firebaseId, uuid); return uuid; }; const mapRetailerFromOldCsvToRetailerKind: Record = { walmart: null, frontera: null, target: RetailerKind.TARGET, homedepot: null, perigold: RetailerKind.PERIGOLD, amazon: RetailerKind.AMARA, englishelm: RetailerKind.ENGLISH_ELM, birchlane: RetailerKind.BIRCH_LANE, casagear: null, dotandbo: RetailerKind.DOT_AND_BO, stephaniecohenhome: null, casaone: null, potterybarn: null, sauder: null, highfashionhome: RetailerKind.HIGH_FASHION_HOME, worldmarket: RetailerKind.WORLD_MARKET, pier1: RetailerKind.PIER1_IMPORTS, jcpenney: RetailerKind.JC_PENNY, interiorhomescapes: RetailerKind.INTERIOR_HOME_SCAPES, afastores: null, officedepot: null, houzz: RetailerKind.HOUZZ, tribesigns: null, emmamason: RetailerKind.EMMA_MASON, burkedecor: RetailerKind.BURKE_DECOR, moro: null, allmodern: RetailerKind.ALL_MODERN, zoro: null, jossandmain: RetailerKind.JOSS_AND_MAIN, overstock: null, macys: RetailerKind.MACYS, '1stdibs': null, benjaminrugsandfurniture: null, theclassyhome: null, bisonoffice: null, eurway: null, wayfair: RetailerKind.WAYFAIR, honeycando: null, modshop1: null, homesquare: null, onekingslane: RetailerKind.ONE_KINGS_LANE, oldwoodde: null, memoky: null, hedgeapple: null, 'mackenzie-childs': null, ashleyfurniture: RetailerKind.ASHLEY_FURNITURE, unlimitedfurnituregroup: null, theyamazakihome: null, decormarket: null, urbanoutfitters: RetailerKind.URBAN_OUTFITTERS, cymax: null, graciousstyle: null, riverbendhome: null, lowes: null, luluandgeorgia: RetailerKind.LULU_AND_GEORGIA, scoutandnimble: RetailerKind.SCOUT_AND_NIMBLE, maisonette: null, hayneedle: null, bellacor: RetailerKind.BELLACOR, bedbathandbeyond: null, kathykuohome: RetailerKind.KATHY_KUO_HOME, liddiardhf: null, jacksonvillefurnituremart: null, bestbuy: null, baxtonstudiooutlet: null, dynamichomedecor: null, polyandbark: null, topmodern: RetailerKind.TOP_MODERN, franceandson: null, amara: RetailerKind.AMARA, gilt: null, totallyfurniture: null, }; /** * The purpose of this script is to generate a valid aggregate products csv file * from the legacy pages.csv. * * The primary purpose script will map the old firebase ids to valid uuids * and to make sure that all the data is valid. */ const main = async () => { const pages = parse( await fs.readFile( path.join(__dirname, '..', 'src', 'seed', 'pages.csv'), 'utf8' ), { header: true, dynamicTyping: true, } ).data; const possibleRetailersSet = new Set(); const pagesWithProperIds = pages .filter( (page): page is CSVPage & { retailer: string } => !!page.id && !!page.retailer && !!mapRetailerFromOldCsvToRetailerKind[page.retailer] ) .map((page) => { if (!page.firebaseId || !page.productFirebaseId) { throw new Error( `Page doesn't have firebaseId or productFirebaseId ${JSON.stringify( page )}` ); } possibleRetailersSet.add(page.retailer); return { id: mapFirebaseIdToUuid(page.firebaseId), availability: page.availability, distributor: page.distributor, distributorSKU: page.distributorSKU, img: page.img, name: page.name, productId: mapFirebaseIdToUuid(page.productFirebaseId), productSKU: page.productSKU, price: page.price, retailer: mapRetailerFromOldCsvToRetailerKind[page.retailer], url: page.url, urlQuery: page.urlQuery, asin: page.asin, dimensions: page.dimensions, colorCode: page.colorCode, urlOriginal: page.urlOriginal, discoverable: page.discoverable, }; }); await fs.writeFile( path.join(__dirname, '..', 'src', 'seed', 'aggregate-products.csv'), unparse(pagesWithProperIds) ); }; if (require.main === module) { console.time('generate-aggregate-products-from-old-pages'); main() .then(() => { console.timeEnd('generate-aggregate-products-from-old-pages'); }) .catch((error) => { logger.error(error); process.exit(1); }); }