84 lines
No EOL
3.3 KiB
SQL
84 lines
No EOL
3.3 KiB
SQL
-- 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'); |