Anonymous Bitcoin-only fashion e-commerce with: - Vue 3 + Tailwind 4 frontend with glassmorphism dark/light design system - Express 5 + SQLite backend with BTCPay Server integration - Nostr identity (NIP-07/keypair) for anonymous purchase tracking - ChaCha20-Poly1305 encrypted shipping addresses - Admin panel with order/product/stock management - SVG logo splash animation with clip-path reveal - 5 seeded products across 4 categories Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import type Database from 'better-sqlite3'
|
|
|
|
export function initSchema(db: Database.Database): void {
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS products (
|
|
id TEXT PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
slug TEXT NOT NULL UNIQUE,
|
|
description TEXT NOT NULL DEFAULT '',
|
|
price_sats INTEGER NOT NULL,
|
|
images TEXT NOT NULL DEFAULT '[]',
|
|
sizes TEXT NOT NULL DEFAULT '[]',
|
|
category TEXT NOT NULL DEFAULT 'general',
|
|
is_active INTEGER NOT NULL DEFAULT 1,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS orders (
|
|
id TEXT PRIMARY KEY,
|
|
nostr_pubkey TEXT,
|
|
email TEXT,
|
|
btcpay_invoice_id TEXT,
|
|
status TEXT NOT NULL DEFAULT 'pending',
|
|
shipping_address_encrypted TEXT,
|
|
items TEXT NOT NULL,
|
|
total_sats INTEGER NOT NULL,
|
|
note TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS order_events (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
order_id TEXT NOT NULL REFERENCES orders(id),
|
|
status TEXT NOT NULL,
|
|
note TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS admin_sessions (
|
|
token TEXT PRIMARY KEY,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
expires_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_orders_status ON orders(status);
|
|
CREATE INDEX IF NOT EXISTS idx_orders_nostr ON orders(nostr_pubkey);
|
|
CREATE INDEX IF NOT EXISTS idx_order_events_order ON order_events(order_id);
|
|
CREATE INDEX IF NOT EXISTS idx_products_slug ON products(slug);
|
|
CREATE INDEX IF NOT EXISTS idx_products_category ON products(category);
|
|
`)
|
|
}
|