-- Create blog post categories CREATE TABLE blog_categories ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), name VARCHAR(50) NOT NULL UNIQUE, description TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Create blog posts table CREATE TABLE blog_posts ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), title VARCHAR(255) NOT NULL, slug VARCHAR(255) NOT NULL UNIQUE, content TEXT NOT NULL, excerpt TEXT, author_id UUID NOT NULL REFERENCES users(id), category_id UUID REFERENCES blog_categories(id), status VARCHAR(20) NOT NULL DEFAULT 'draft', -- draft, published, archived featured_image_path VARCHAR(255), published_at TIMESTAMP WITH TIME ZONE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Create blog post tags junction table CREATE TABLE blog_post_tags ( post_id UUID NOT NULL REFERENCES blog_posts(id) ON DELETE CASCADE, tag_id UUID NOT NULL REFERENCES tags(id) ON DELETE CASCADE, PRIMARY KEY (post_id, tag_id) ); -- Create blog post images table CREATE TABLE blog_post_images ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), post_id UUID NOT NULL REFERENCES blog_posts(id) ON DELETE CASCADE, image_path VARCHAR(255) NOT NULL, caption TEXT, display_order INT NOT NULL DEFAULT 0, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Create blog comments table CREATE TABLE blog_comments ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), post_id UUID NOT NULL REFERENCES blog_posts(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES users(id), parent_id UUID REFERENCES blog_comments(id) ON DELETE CASCADE, content TEXT NOT NULL, is_approved BOOLEAN DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Create indexes for performance CREATE INDEX idx_blog_posts_author ON blog_posts(author_id); CREATE INDEX idx_blog_posts_category ON blog_posts(category_id); CREATE INDEX idx_blog_posts_status ON blog_posts(status); CREATE INDEX idx_blog_posts_published_at ON blog_posts(published_at); CREATE INDEX idx_blog_posts_slug ON blog_posts(slug); CREATE INDEX idx_blog_comments_post ON blog_comments(post_id); CREATE INDEX idx_blog_comments_user ON blog_comments(user_id); CREATE INDEX idx_blog_comments_parent ON blog_comments(parent_id); CREATE INDEX idx_blog_post_images_post ON blog_post_images(post_id); -- Create triggers to automatically update the updated_at column CREATE TRIGGER update_blog_categories_modtime BEFORE UPDATE ON blog_categories FOR EACH ROW EXECUTE FUNCTION update_modified_column(); CREATE TRIGGER update_blog_posts_modtime BEFORE UPDATE ON blog_posts FOR EACH ROW EXECUTE FUNCTION update_modified_column(); CREATE TRIGGER update_blog_comments_modtime BEFORE UPDATE ON blog_comments FOR EACH ROW EXECUTE FUNCTION update_modified_column(); -- Insert default blog categories INSERT INTO blog_categories (name, description) VALUES ('Announcements', 'Official announcements and company news'), ('Collections', 'Information about product collections and releases'), ('Tutorials', 'How-to guides and instructional content'), ('Behind the Scenes', 'Stories about our sourcing and process');