import { buyerAccount, sellerPasswordHash, stores, } from "./catalog-config.mjs"; const escapeSql = (value) => String(value).replace(/'/g, "''"); const stringLiteral = (value) => `'${escapeSql(value)}'`; const imageIdFor = (assetPath) => assetPath .split("/") .pop() .replace(/\.[^.]+$/, "") .replace(/[^a-z0-9-]/gi, "-") .toLowerCase(); const productRow = (product, storeSlug) => { const imagesJson = JSON.stringify([ { id: imageIdFor(product.assetPath), url: product.assetPath, alt: product.name, }, ]); return ` (${stringLiteral(product.name)}, ${product.price.toFixed(2)}, ${stringLiteral( product.description )}, ${product.inventory}, ${stringLiteral(imagesJson)}, (SELECT id FROM stores WHERE slug = ${stringLiteral( storeSlug )}))`; }; const storeRows = stores.map( (store) => ` (${stringLiteral(store.name)}, ${stringLiteral( store.industry )}, ${stringLiteral(store.description)}, ${stringLiteral(store.slug)})` ); const productRows = stores.flatMap((store) => store.products.map((product) => productRow(product, store.slug)) ); const userRows = [ ` (${stringLiteral(buyerAccount.name)}, ${stringLiteral( buyerAccount.email )}, ${stringLiteral( buyerAccount.passwordHash )}, NULL, UNIX_TIMESTAMP())`, ...stores.map( (store) => ` (${stringLiteral(store.name + " Seller")}, ${stringLiteral( store.email )}, ${stringLiteral( sellerPasswordHash )}, (SELECT id FROM stores WHERE slug = ${stringLiteral( store.slug )}), UNIX_TIMESTAMP())` ), ]; const sql = `USE onestopshop; DROP TABLE IF EXISTS sessions; DROP TABLE IF EXISTS users; DROP TABLE IF EXISTS orders; DROP TABLE IF EXISTS addresses; DROP TABLE IF EXISTS payments; DROP TABLE IF EXISTS carts; DROP TABLE IF EXISTS products; DROP TABLE IF EXISTS stores; CREATE TABLE stores ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, store_name VARCHAR(40), industry TEXT, description TEXT, slug VARCHAR(50), UNIQUE KEY store_name_index (store_name), UNIQUE KEY store_slug_index (slug) ); CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(120), email VARCHAR(191), password_hash TEXT, store_id INT NULL, created_at INT, UNIQUE KEY user_email_index (email) ); CREATE TABLE sessions ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, session_token VARCHAR(191), user_id INT, expires_at INT, UNIQUE KEY session_token_index (session_token) ); CREATE TABLE products ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name TEXT, price DECIMAL(10, 2) DEFAULT 0, description TEXT, inventory DECIMAL(10, 0) DEFAULT 0, images JSON, store_id INT ); CREATE TABLE carts ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, items JSON, payment_intent_id TEXT, client_secret TEXT, is_closed BOOLEAN DEFAULT FALSE ); CREATE TABLE payments ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, store_id INT, stripe_account_id TEXT, stripe_account_created_at INT, stripe_account_expires_at INT, details_submitted BOOLEAN DEFAULT FALSE ); CREATE TABLE addresses ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, line1 TEXT, line2 TEXT, city TEXT, state TEXT, postal_code TEXT, country TEXT ); CREATE TABLE orders ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, pretty_order_id INT, store_id INT, user_id INT NULL, items JSON, total DECIMAL(10, 2) DEFAULT 0, stripe_payment_intent_id VARCHAR(256), stripe_payment_intent_status TEXT, name TEXT, email TEXT, created_at INT, address INT, UNIQUE KEY stripe_payment_intent_id_index (stripe_payment_intent_id) ); INSERT INTO stores (store_name, industry, description, slug) VALUES ${storeRows.join(",\n")}; INSERT INTO products (name, price, description, inventory, images, store_id) VALUES ${productRows.join(",\n")}; INSERT INTO users (name, email, password_hash, store_id, created_at) VALUES ${userRows.join(",\n")}; `; process.stdout.write(sql);