164 lines
6.5 KiB
SQL
164 lines
6.5 KiB
SQL
-- Nordic Storium Database Initialization
|
|
-- Simple and error-free setup
|
|
|
|
-- 1. Create the database if it doesn't exist
|
|
CREATE DATABASE IF NOT EXISTS nordic_storium
|
|
CHARACTER SET utf8mb4
|
|
COLLATE utf8mb4_unicode_ci;
|
|
|
|
-- 2. Use the database
|
|
USE nordic_storium;
|
|
|
|
-- 3. Create users table
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
email VARCHAR(255) UNIQUE NOT NULL,
|
|
username VARCHAR(50) UNIQUE NOT NULL,
|
|
password_hash VARCHAR(255),
|
|
full_name VARCHAR(100),
|
|
google_id VARCHAR(255) UNIQUE,
|
|
role ENUM('user', 'admin') DEFAULT 'user',
|
|
email_verified BOOLEAN DEFAULT FALSE,
|
|
verification_token VARCHAR(255),
|
|
newsletter_subscribed BOOLEAN DEFAULT FALSE,
|
|
two_factor_enabled BOOLEAN DEFAULT FALSE,
|
|
two_factor_secret VARCHAR(255),
|
|
personnummer VARCHAR(15),
|
|
mobile VARCHAR(20),
|
|
address VARCHAR(255),
|
|
zip_code VARCHAR(10),
|
|
city VARCHAR(100),
|
|
country VARCHAR(100) DEFAULT 'Sverige',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_email (email),
|
|
INDEX idx_username (username)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 4. Insert root admin user (password: 3DBFC7FEF43B45E887C8E54205C8EC8F)
|
|
INSERT IGNORE INTO users (email, username, password_hash, full_name, role, email_verified) VALUES
|
|
('root@nordicstorium.com', 'root', '$2b$10$MDURVVPDTo60o.W5rHJOPex3jwR8.s.xc5e1dpYF8DG7bu5SXXwLq', 'Root Administrator', 'admin', TRUE);
|
|
|
|
-- 5. Create categories table (Required for webshop)
|
|
CREATE TABLE IF NOT EXISTS categories (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
image_url VARCHAR(500),
|
|
show_on_homepage BOOLEAN DEFAULT FALSE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_name (name)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 6. Create products table (Full version)
|
|
CREATE TABLE IF NOT EXISTS products (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
category_id INT NOT NULL,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
price DECIMAL(10, 2) NOT NULL,
|
|
original_price DECIMAL(10, 2),
|
|
stock INT DEFAULT 0,
|
|
product_condition VARCHAR(50) DEFAULT 'Begagnad',
|
|
badge_text VARCHAR(50),
|
|
badge_color VARCHAR(20),
|
|
image_url VARCHAR(500),
|
|
show_on_homepage BOOLEAN DEFAULT FALSE,
|
|
brand VARCHAR(100),
|
|
stock_status ENUM('in_stock', 'out_of_stock', 'pre_order') DEFAULT 'in_stock',
|
|
width DECIMAL(10, 2),
|
|
height DECIMAL(10, 2),
|
|
depth DECIMAL(10, 2),
|
|
material VARCHAR(100),
|
|
color VARCHAR(50),
|
|
is_popular BOOLEAN DEFAULT FALSE,
|
|
is_new BOOLEAN DEFAULT FALSE,
|
|
is_trendy BOOLEAN DEFAULT FALSE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE RESTRICT,
|
|
INDEX idx_category (category_id),
|
|
INDEX idx_name (name),
|
|
INDEX idx_price (price)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 6a. Create product_categories table (Many-to-Many)
|
|
CREATE TABLE IF NOT EXISTS product_categories (
|
|
product_id INT NOT NULL,
|
|
category_id INT NOT NULL,
|
|
PRIMARY KEY (product_id, category_id),
|
|
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 6b. Create product_images table
|
|
CREATE TABLE IF NOT EXISTS product_images (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
product_id INT NOT NULL,
|
|
image_url VARCHAR(500) NOT NULL,
|
|
is_primary BOOLEAN DEFAULT FALSE,
|
|
display_order INT DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE,
|
|
INDEX idx_product_id (product_id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 6c. Create conversations table (Messaging System)
|
|
CREATE TABLE IF NOT EXISTS conversations (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
product_id INT,
|
|
subject VARCHAR(255) NOT NULL,
|
|
status ENUM('open', 'closed', 'archived') DEFAULT 'open',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE SET NULL,
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_product_id (product_id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 6d. Create messages table (Messaging System)
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
conversation_id INT NOT NULL,
|
|
sender_id INT,
|
|
sender_role ENUM('customer', 'admin', 'system') DEFAULT 'customer',
|
|
content TEXT NOT NULL,
|
|
is_read BOOLEAN DEFAULT FALSE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (sender_id) REFERENCES users(id) ON DELETE SET NULL,
|
|
INDEX idx_conversation_id (conversation_id),
|
|
INDEX idx_is_read (is_read)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 7. Insert sample data
|
|
INSERT IGNORE INTO categories (id, name, description) VALUES
|
|
(1, 'Furniture', 'Chairs, tables, and other furniture'),
|
|
(2, 'Decor', 'Home decoration items');
|
|
|
|
INSERT IGNORE INTO products (category_id, name, description, price, stock) VALUES
|
|
(1, 'Nordic Chair', 'Handcrafted wooden chair', 299.99, 10),
|
|
(2, 'Viking Shield', 'Decorative shield with Norse patterns', 199.99, 5),
|
|
(2, 'Rune Stone', 'Engraved stone with ancient symbols', 89.99, 20);
|
|
|
|
-- 8. Create user_sessions table for session management
|
|
CREATE TABLE IF NOT EXISTS user_sessions (
|
|
session_id VARCHAR(128) PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
expires_at DATETIME NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_expires_at (expires_at)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 9. Show what was created
|
|
SELECT 'Nordic Storium database initialized successfully!' as message;
|
|
SELECT COUNT(*) as user_count FROM users;
|
|
SELECT COUNT(*) as product_count FROM products;
|
|
SELECT TABLE_NAME, TABLE_ROWS
|
|
FROM INFORMATION_SCHEMA.TABLES
|
|
WHERE TABLE_SCHEMA = 'nordic_storium'; |