-- Core books table and basic infrastructure
-- Split from original 001_create_books_structure.sql for better organization
-- Create books table
CREATE TABLE books (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
title TEXT NOT NULL,
description TEXT,
status TEXT DEFAULT 'Planning' CHECK (status IN ('Planning', 'Draft', 'In Progress', 'Completed', 'Published')),
word_count INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE NOT NULL,
-- Metadata
cover_image_url TEXT,
genre TEXT,
target_word_count INTEGER,
-- Settings
settings JSONB DEFAULT '{}'::jsonb
);
-- Create indexes for performance
CREATE INDEX idx_books_user_id ON books(user_id);
CREATE INDEX idx_books_status ON books(status);
CREATE INDEX idx_books_updated_at ON books(updated_at);
-- Create a function to update the updated_at timestamp (shared utility)
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
-- Create trigger for updated_at on books
CREATE TRIGGER update_books_updated_at
BEFORE UPDATE ON books
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
-- Row Level Security (RLS) policies
-- Enable RLS
ALTER TABLE books ENABLE ROW LEVEL SECURITY;
-- Books policies
CREATE POLICY "Users can view their own books" ON books
FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "Users can create their own books" ON books
FOR INSERT WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update their own books" ON books
FOR UPDATE USING (auth.uid() = user_id);
CREATE POLICY "Users can delete their own books" ON books
FOR DELETE USING (auth.uid() = user_id);