-- Verras Portal SQL Schema -- All tables use InnoDB engine for transaction support and foreign key constraints. -- Table for admin users CREATE TABLE IF NOT EXISTS `admins` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `email` VARCHAR(255) NOT NULL UNIQUE, `password_hash` VARCHAR(255) NOT NULL, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB; -- Insert default admin user (password: admin) INSERT INTO `admins` (`email`, `password_hash`) VALUES ('admin@example.com', '$2y$10$9JERAeTYWKsOhAujmqRqHOOxGZBwVFWRgj8kMIGXs4wEVxW.ogr5C') ON DUPLICATE KEY UPDATE `password_hash`=`password_hash`; -- Table for external stores and their API keys CREATE TABLE IF NOT EXISTS `stores` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `api_key` VARCHAR(255) NOT NULL UNIQUE, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB; -- Table for supported languages CREATE TABLE IF NOT EXISTS `languages` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `code` VARCHAR(10) NOT NULL UNIQUE, `name` VARCHAR(50) NOT NULL ) ENGINE=InnoDB; -- Table for products CREATE TABLE IF NOT EXISTS `products` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `sku` VARCHAR(100) NOT NULL UNIQUE, `price` DECIMAL(10, 2) NOT NULL, `image_url` VARCHAR(2048), `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB; -- Table for product translations CREATE TABLE IF NOT EXISTS `product_translations` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `product_id` INT NOT NULL, `language_code` VARCHAR(10) NOT NULL, `name` VARCHAR(255) NOT NULL, `description` TEXT, UNIQUE KEY `product_lang_unique` (`product_id`, `language_code`), FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE CASCADE, FOREIGN KEY (`language_code`) REFERENCES `languages`(`code`) ON DELETE CASCADE ) ENGINE=InnoDB; -- Table for general content (banners, about us, etc.) CREATE TABLE IF NOT EXISTS `content` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `slug` VARCHAR(100) NOT NULL UNIQUE, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB; -- Table for content translations CREATE TABLE IF NOT EXISTS `content_translations` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `content_id` INT NOT NULL, `language_code` VARCHAR(10) NOT NULL, `content_text` TEXT, UNIQUE KEY `content_lang_unique` (`content_id`, `language_code`), FOREIGN KEY (`content_id`) REFERENCES `content`(`id`) ON DELETE CASCADE, FOREIGN KEY (`language_code`) REFERENCES `languages`(`code`) ON DELETE CASCADE ) ENGINE=InnoDB; -- Table for orders CREATE TABLE IF NOT EXISTS `orders` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `store_id` INT NOT NULL, `status` ENUM('pending', 'succeeded', 'failed') NOT NULL DEFAULT 'pending', `stripe_payment_intent_id` VARCHAR(255) UNIQUE, `total_amount` DECIMAL(10, 2) NOT NULL, `currency` VARCHAR(10) NOT NULL, `customer_details` JSON, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (`store_id`) REFERENCES `stores`(`id`) ON DELETE RESTRICT ) ENGINE=InnoDB; -- Table for items within an order CREATE TABLE IF NOT EXISTS `order_items` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `order_id` INT NOT NULL, `product_id` INT NOT NULL, `quantity` INT NOT NULL, `price_at_purchase` DECIMAL(10, 2) NOT NULL, FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE CASCADE, FOREIGN KEY (`product_id`) REFERENCES `products`(`id`) ON DELETE RESTRICT ) ENGINE=InnoDB; -- Table for application settings (e.g., Stripe keys) CREATE TABLE IF NOT EXISTS `settings` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `key_name` VARCHAR(255) NOT NULL UNIQUE, `key_value` TEXT, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB; -- Insert default languages INSERT INTO `languages` (`code`, `name`) VALUES ('en', 'English'), ('es', 'Spanish') ON DUPLICATE KEY UPDATE `name`=`name`;