WebArena-ShopSmart / scripts /generate-bootstrap-sql.mjs
Jack
Clean import with LFS-tracked assets
6a30288
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);