db: add initial schema and catalog wave2 migrations
This commit is contained in:
1 parent
2a1d701846
commit
21852bfc7f
2 files changed
+134
No files matched your search
@@ -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);
|
||||||
@@ -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 '';
|
||||||
Reference in new issue
Block a user