-- Create orders and order_items tables (missing from prior migrations) -- Required before 100_orders_discount.sql which ALTERs orders CREATE TABLE IF NOT EXISTS orders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), buyer_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, total_amount DECIMAL(10,2) NOT NULL, currency VARCHAR(3) DEFAULT 'EUR', status VARCHAR(50) DEFAULT 'pending', payment_intent TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_orders_buyer_id ON orders(buyer_id); CREATE INDEX IF NOT EXISTS idx_orders_status ON orders(status); CREATE INDEX IF NOT EXISTS idx_orders_created_at ON orders(created_at DESC); CREATE TABLE IF NOT EXISTS order_items ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), order_id UUID NOT NULL REFERENCES orders(id) ON DELETE CASCADE, product_id UUID NOT NULL REFERENCES products(id) ON DELETE CASCADE, price DECIMAL(10,2) NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_order_items_order_id ON order_items(order_id); CREATE INDEX IF NOT EXISTS idx_order_items_product_id ON order_items(product_id); -- Licenses table (for purchased licenses) CREATE TABLE IF NOT EXISTS licenses ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), buyer_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, track_id UUID NOT NULL REFERENCES tracks(id) ON DELETE CASCADE, product_id UUID NOT NULL REFERENCES products(id) ON DELETE CASCADE, order_id UUID NOT NULL REFERENCES orders(id) ON DELETE CASCADE, type VARCHAR(50) NOT NULL, rights JSONB, downloads_left INT DEFAULT 3, created_at TIMESTAMPTZ DEFAULT NOW(), expires_at TIMESTAMPTZ, revoked_at TIMESTAMPTZ ); CREATE INDEX IF NOT EXISTS idx_licenses_buyer_id ON licenses(buyer_id); CREATE INDEX IF NOT EXISTS idx_licenses_order_id ON licenses(order_id);