37035-vm/db/schema.sql
Flatlogic Bot 6872ff9a04 first
2025-12-18 12:41:47 +00:00

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`;