db: add initial schema and catalog wave2 migrations

This commit is contained in:
dualfroz committed 2026-08-23 19:03:43 +02:00
1 parent 2a1d701846
commit 21852bfc7f
2 files changed
+134

No files matched your search

+54
View File
@@ -0,0 +1,54 @@
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT NOT NULL UNIQUE,
passwordHash TEXT NOT NULL,
name TEXT NOT NULL DEFAULT '',
isAdmin INTEGER NOT NULL DEFAULT 0,
createdAt TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS categories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
description TEXT NOT NULL DEFAULT ''
);
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
categoryId INTEGER REFERENCES categories(id) ON DELETE SET NULL,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
description TEXT NOT NULL DEFAULT '',
priceCents INTEGER NOT NULL DEFAULT 0,
stockQuantity INTEGER NOT NULL DEFAULT 0,
imageUrl TEXT NOT NULL DEFAULT '',
isActive INTEGER NOT NULL DEFAULT 1,
createdAt TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
userId INTEGER NOT NULL REFERENCES users(id),
status TEXT NOT NULL DEFAULT 'pending',
totalCents INTEGER NOT NULL DEFAULT 0,
currency TEXT NOT NULL DEFAULT 'usd',
stripeSessionId TEXT,
createdAt TEXT NOT NULL,
paidAt TEXT,
fulfilledAt TEXT,
cancelledAt TEXT
);
CREATE TABLE IF NOT EXISTS orderItems (
id INTEGER PRIMARY KEY AUTOINCREMENT,
orderId INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
productId INTEGER REFERENCES products(id) ON DELETE SET NULL,
productName TEXT NOT NULL,
unitPriceCents INTEGER NOT NULL,
quantity INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS idxProductsCategory ON products(categoryId);
CREATE INDEX IF NOT EXISTS idxOrdersUser ON orders(userId);
CREATE INDEX IF NOT EXISTS idxOrderItemsOrder ON orderItems(orderId);
+80
View File
@@ -0,0 +1,80 @@
-- Wave 2: variants, attributes, coupons, reviews, wishlist, roles, mail-ready orders
CREATE TABLE IF NOT EXISTS attributes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE
);
CREATE TABLE IF NOT EXISTS attributeValues (
id INTEGER PRIMARY KEY AUTOINCREMENT,
attributeId INTEGER NOT NULL REFERENCES attributes(id) ON DELETE CASCADE,
value TEXT NOT NULL,
slug TEXT NOT NULL,
position INTEGER NOT NULL DEFAULT 0
);
CREATE UNIQUE INDEX IF NOT EXISTS idxAttributeValueUnique ON attributeValues(attributeId, slug);
CREATE TABLE IF NOT EXISTS productVariants (
id INTEGER PRIMARY KEY AUTOINCREMENT,
productId INTEGER NOT NULL REFERENCES products(id) ON DELETE CASCADE,
sku TEXT NOT NULL UNIQUE,
priceCents INTEGER NOT NULL DEFAULT 0,
stockQuantity INTEGER NOT NULL DEFAULT 0,
isActive INTEGER NOT NULL DEFAULT 1,
createdAt TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idxVariantsProduct ON productVariants(productId);
CREATE TABLE IF NOT EXISTS variantOptions (
variantId INTEGER NOT NULL REFERENCES productVariants(id) ON DELETE CASCADE,
attributeId INTEGER NOT NULL REFERENCES attributes(id) ON DELETE CASCADE,
attributeValueId INTEGER NOT NULL REFERENCES attributeValues(id) ON DELETE CASCADE,
PRIMARY KEY (variantId, attributeId)
);
CREATE INDEX IF NOT EXISTS idxVariantOptionsValue ON variantOptions(attributeValueId);
CREATE TABLE IF NOT EXISTS coupons (
id INTEGER PRIMARY KEY AUTOINCREMENT,
code TEXT NOT NULL UNIQUE,
type TEXT NOT NULL DEFAULT 'percent',
value INTEGER NOT NULL DEFAULT 0,
minSubtotalCents INTEGER NOT NULL DEFAULT 0,
maxRedemptions INTEGER,
redeemedCount INTEGER NOT NULL DEFAULT 0,
startsAt TEXT,
expiresAt TEXT,
isActive INTEGER NOT NULL DEFAULT 1,
createdAt TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS reviews (
id INTEGER PRIMARY KEY AUTOINCREMENT,
productId INTEGER NOT NULL REFERENCES products(id) ON DELETE CASCADE,
userId INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
rating INTEGER NOT NULL,
title TEXT NOT NULL DEFAULT '',
body TEXT NOT NULL DEFAULT '',
status TEXT NOT NULL DEFAULT 'pending',
createdAt TEXT NOT NULL,
moderatedAt TEXT
);
CREATE INDEX IF NOT EXISTS idxReviewsProduct ON reviews(productId, status);
CREATE UNIQUE INDEX IF NOT EXISTS idxReviewsUserProduct ON reviews(userId, productId);
CREATE TABLE IF NOT EXISTS wishlistItems (
id INTEGER PRIMARY KEY AUTOINCREMENT,
userId INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
productId INTEGER NOT NULL REFERENCES products(id) ON DELETE CASCADE,
createdAt TEXT NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS idxWishlistUserProduct ON wishlistItems(userId, productId);
ALTER TABLE users ADD COLUMN role TEXT NOT NULL DEFAULT 'customer';
UPDATE users SET role = 'admin' WHERE isAdmin = 1;
ALTER TABLE orders ADD COLUMN discountCents INTEGER NOT NULL DEFAULT 0;
ALTER TABLE orders ADD COLUMN couponCode TEXT;
ALTER TABLE orderItems ADD COLUMN variantId INTEGER;
ALTER TABLE orderItems ADD COLUMN variantLabel TEXT NOT NULL DEFAULT '';