| 1 |
CREATE TABLE IF NOT EXISTS products (
|
| 2 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 3 |
slug TEXT UNIQUE NOT NULL,
|
| 4 |
name TEXT NOT NULL,
|
| 5 |
description TEXT,
|
| 6 |
price INTEGER NOT NULL,
|
| 7 |
image_url TEXT,
|
| 8 |
active INTEGER DEFAULT 1,
|
| 9 |
printful_product_id TEXT,
|
| 10 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 11 |
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
| 12 |
);
|
| 13 |
|
| 14 |
CREATE TABLE IF NOT EXISTS variants (
|
| 15 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 16 |
product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE CASCADE,
|
| 17 |
size TEXT NOT NULL,
|
| 18 |
printful_variant_id TEXT,
|
| 19 |
stock INTEGER DEFAULT 0,
|
| 20 |
sort_order INTEGER DEFAULT 0
|
| 21 |
);
|
| 22 |
|
| 23 |
CREATE TABLE IF NOT EXISTS orders (
|
| 24 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 25 |
stripe_session_id TEXT UNIQUE,
|
| 26 |
stripe_payment_intent TEXT,
|
| 27 |
email TEXT,
|
| 28 |
status TEXT DEFAULT 'pending',
|
| 29 |
total INTEGER NOT NULL,
|
| 30 |
shipping_name TEXT,
|
| 31 |
shipping_address TEXT,
|
| 32 |
printful_order_id TEXT,
|
| 33 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
| 34 |
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
| 35 |
);
|
| 36 |
|
| 37 |
CREATE TABLE IF NOT EXISTS order_items (
|
| 38 |
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 39 |
order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
|
| 40 |
product_id INTEGER REFERENCES products(id),
|
| 41 |
variant_id INTEGER REFERENCES variants(id),
|
| 42 |
quantity INTEGER NOT NULL,
|
| 43 |
price INTEGER NOT NULL
|
| 44 |
);
|
| 45 |
|
| 46 |
INSERT INTO products (slug, name, description, price, image_url) VALUES
|
| 47 |
('linux-tux-tee', 'Linux Tux Tee', 'Classic penguin on a comfy tee. 100% cotton.', 2500, 'https://placehold.co/600x600/1a1a1a/3b82f6?text=Linux+Tux+Tee'),
|
| 48 |
('btw-i-use-arch-hoodie', 'BTW I Use Arch Hoodie', 'Let everyone know. Heavyweight fleece.', 4500, 'https://placehold.co/600x600/1a1a1a/3b82f6?text=Arch+Hoodie'),
|
| 49 |
('foss-freedom-cap', 'FOSS Freedom Cap', 'Embroidered dad hat for free software enjoyers.', 2000, 'https://placehold.co/600x600/1a1a1a/3b82f6?text=FOSS+Cap')
|
| 50 |
ON CONFLICT(slug) DO UPDATE SET image_url = excluded.image_url;
|
| 51 |
|
| 52 |
INSERT INTO variants (product_id, size, sort_order) VALUES
|
| 53 |
(1, 'S', 1), (1, 'M', 2), (1, 'L', 3), (1, 'XL', 4),
|
| 54 |
(2, 'S', 1), (2, 'M', 2), (2, 'L', 3), (2, 'XL', 4), (2, 'XXL', 5),
|
| 55 |
(3, 'One Size', 1);
|
| 56 |
|
| 57 |
CREATE INDEX IF NOT EXISTS idx_products_slug ON products(slug);
|
| 58 |
CREATE INDEX IF NOT EXISTS idx_products_active ON products(active);
|
| 59 |
CREATE INDEX IF NOT EXISTS idx_variants_product ON variants(product_id);
|
| 60 |
CREATE INDEX IF NOT EXISTS idx_orders_stripe ON orders(stripe_session_id);
|