97 lines
3.7 KiB
SQL
97 lines
3.7 KiB
SQL
-- 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,
|
|
`name_translations` JSON,
|
|
`description_translations` JSON,
|
|
`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 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,
|
|
`stripe_publishable_key` VARCHAR(255),
|
|
`stripe_secret_key` VARCHAR(255),
|
|
`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`; |