v1.0.0.1
StocketBase
- SET NAMES utf8mb4;
- SET time_zone = '+00:00';
- SET FOREIGN_KEY_CHECKS = 0;
-
- CREATE TABLE IF NOT EXISTS team_accounts (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- username VARCHAR(64) NOT NULL,
- email VARCHAR(190) NULL,
- password_hash VARCHAR(255) NOT NULL,
- display_name VARCHAR(120) NOT NULL,
- role ENUM('super_admin','store_owner','store_manager','catalog_editor','product_editor','catalog_assistant') NOT NULL,
- avatar_path VARCHAR(255) NULL,
- bio TEXT NULL,
- totp_secret VARCHAR(64) NULL,
- totp_enabled TINYINT(1) NOT NULL DEFAULT 0,
- status ENUM('active','suspended') NOT NULL DEFAULT 'active',
- last_login_at DATETIME NULL,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- UNIQUE KEY uq_team_username (username),
- UNIQUE KEY uq_team_email (email)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS team_sessions (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- team_account_id INT UNSIGNED NOT NULL,
- session_token VARCHAR(128) NOT NULL,
- ip_address VARCHAR(64) NULL,
- user_agent VARCHAR(255) NULL,
- expires_at DATETIME NOT NULL,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- UNIQUE KEY uq_team_session_token (session_token),
- KEY idx_team_session_account (team_account_id),
- CONSTRAINT fk_team_session_account FOREIGN KEY (team_account_id) REFERENCES team_accounts(id) ON DELETE CASCADE
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS categories (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- name VARCHAR(120) NOT NULL,
- slug VARCHAR(140) NOT NULL,
- description VARCHAR(255) NULL,
- parent_id INT UNSIGNED NULL,
- sort_order INT NOT NULL DEFAULT 0,
- show_in_menu TINYINT(1) NOT NULL DEFAULT 1,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- UNIQUE KEY uq_category_slug (slug),
- KEY idx_category_parent (parent_id),
- CONSTRAINT fk_category_parent FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE SET NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS products (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- created_by INT UNSIGNED NULL,
- category_id INT UNSIGNED NULL,
- title VARCHAR(255) NOT NULL,
- slug VARCHAR(255) NOT NULL,
- excerpt VARCHAR(500) NULL,
- content_blocks LONGTEXT NOT NULL,
- cover_image_path VARCHAR(255) NULL,
- sku VARCHAR(64) NULL,
- product_kind ENUM('physical','digital','saas_plan') NOT NULL DEFAULT 'physical',
- price_cents INT UNSIGNED NULL,
- compare_at_price_cents INT UNSIGNED NULL,
- currency CHAR(3) NULL,
- billing_interval ENUM('month','year','one_time') NULL,
- track_inventory TINYINT(1) NOT NULL DEFAULT 0,
- stock_quantity INT NULL,
- weight_grams INT NULL,
- stripe_price_id VARCHAR(190) NULL,
- polar_product_id VARCHAR(190) NULL,
- sales_count INT UNSIGNED NOT NULL DEFAULT 0,
- status ENUM('draft','pending_review','scheduled','published','rejected','archived') NOT NULL DEFAULT 'draft',
- rejection_reason VARCHAR(500) NULL,
- seo_title VARCHAR(255) NULL,
- seo_description VARCHAR(500) NULL,
- views_count INT UNSIGNED NOT NULL DEFAULT 0,
- published_at DATETIME NULL,
- scheduled_at DATETIME NULL,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- UNIQUE KEY uq_product_slug (slug),
- KEY idx_product_author (created_by),
- KEY idx_product_category (category_id),
- KEY idx_product_status (status),
- KEY idx_product_published (published_at),
- CONSTRAINT fk_product_author FOREIGN KEY (created_by) REFERENCES team_accounts(id) ON DELETE SET NULL,
- CONSTRAINT fk_product_category FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE SET NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS product_variants (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- product_id INT UNSIGNED NOT NULL,
- name VARCHAR(120) NOT NULL,
- sku VARCHAR(64) NULL,
- price_cents INT UNSIGNED NULL,
- stock_quantity INT NULL,
- sort_order INT NOT NULL DEFAULT 0,
- is_default TINYINT(1) NOT NULL DEFAULT 0,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- KEY idx_variant_product (product_id),
- CONSTRAINT fk_variant_product FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS product_images (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- product_id INT UNSIGNED NOT NULL,
- image_path VARCHAR(255) NOT NULL,
- alt_text VARCHAR(255) NULL,
- sort_order INT NOT NULL DEFAULT 0,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- KEY idx_product_image_product (product_id),
- CONSTRAINT fk_product_image_product FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS pages (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- author_id INT UNSIGNED NULL,
- title VARCHAR(255) NOT NULL,
- slug VARCHAR(255) NOT NULL,
- content_blocks LONGTEXT NOT NULL,
- status ENUM('draft','published') NOT NULL DEFAULT 'draft',
- show_in_menu TINYINT(1) NOT NULL DEFAULT 0,
- sort_order INT NOT NULL DEFAULT 0,
- is_home TINYINT(1) NOT NULL DEFAULT 0,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- UNIQUE KEY uq_page_slug (slug),
- CONSTRAINT fk_page_author FOREIGN KEY (author_id) REFERENCES team_accounts(id) ON DELETE SET NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS site_settings (
- setting_key VARCHAR(120) NOT NULL PRIMARY KEY,
- setting_value LONGTEXT NULL,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS ads (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- name VARCHAR(120) NOT NULL,
- type ENUM('static_text','static_image','script') NOT NULL,
- placement VARCHAR(60) NOT NULL,
- content LONGTEXT NOT NULL,
- link_url VARCHAR(255) NULL,
- is_active TINYINT(1) NOT NULL DEFAULT 1,
- created_by INT UNSIGNED NULL,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- CONSTRAINT fk_ad_creator FOREIGN KEY (created_by) REFERENCES team_accounts(id) ON DELETE SET NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS analytics_scripts (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- name VARCHAR(120) NOT NULL,
- script_code LONGTEXT NOT NULL,
- placement ENUM('head','body_start','body_end') NOT NULL DEFAULT 'head',
- requires_consent TINYINT(1) NOT NULL DEFAULT 1,
- is_active TINYINT(1) NOT NULL DEFAULT 1,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS nav_items (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- item_type ENUM('category','page','custom') NOT NULL,
- ref_id INT UNSIGNED NULL,
- label VARCHAR(120) NULL,
- url VARCHAR(255) NULL,
- target ENUM('_self','_blank') NOT NULL DEFAULT '_self',
- icon_key VARCHAR(30) NULL,
- icon_svg MEDIUMTEXT NULL,
- sort_order INT NOT NULL DEFAULT 0,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- KEY idx_nav_sort (sort_order)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS discounts (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- code VARCHAR(60) NOT NULL,
- description VARCHAR(255) NULL,
- discount_type ENUM('percentage','fixed_amount') NOT NULL,
- value INT UNSIGNED NOT NULL,
- currency CHAR(3) NULL,
- min_order_cents INT UNSIGNED NULL,
- max_redemptions INT UNSIGNED NULL,
- times_redeemed INT UNSIGNED NOT NULL DEFAULT 0,
- starts_at DATETIME NULL,
- ends_at DATETIME NULL,
- is_active TINYINT(1) NOT NULL DEFAULT 1,
- created_by INT UNSIGNED NULL,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- UNIQUE KEY uq_discount_code (code),
- CONSTRAINT fk_discount_creator FOREIGN KEY (created_by) REFERENCES team_accounts(id) ON DELETE SET NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- CREATE TABLE IF NOT EXISTS product_files (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- product_id INT UNSIGNED NOT NULL,
- original_name VARCHAR(190) NOT NULL,
- stored_name CHAR(32) NOT NULL,
- mime_type VARCHAR(120) NOT NULL DEFAULT 'application/octet-stream',
- size_bytes BIGINT UNSIGNED NOT NULL DEFAULT 0,
- sha256 CHAR(64) NULL,
- sort_order INT NOT NULL DEFAULT 0,
- product_title VARCHAR(255) NULL,
- detached_at DATETIME NULL,
- button_label VARCHAR(120) NULL,
- download_count INT UNSIGNED NOT NULL DEFAULT 0,
- created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
- UNIQUE KEY uq_product_file_stored (stored_name),
- KEY idx_product_files_product (product_id)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
- SET FOREIGN_KEY_CHECKS = 1;
-