-- 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.se', '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, parent_id INT DEFAULT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_name (name), FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE SET NULL ) 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';