-- Consolidated Bookmann Database Schema -- This file contains the complete current schema for the Bookmann ebook management system -- Create users table CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email VARCHAR(255) UNIQUE NOT NULL, username VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, first_name VARCHAR(255), last_name VARCHAR(255), role VARCHAR(20) NOT NULL DEFAULT 'user' CHECK (role IN ('admin', 'user')), theme VARCHAR(50) DEFAULT 'tokyo-night', scan_frequency_minutes INTEGER DEFAULT 60, auto_scan_enabled BOOLEAN DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Create ebooks table CREATE TABLE ebooks ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), title VARCHAR(255) NOT NULL, author VARCHAR(255), isbn VARCHAR(13), description TEXT, file_path VARCHAR(500) NOT NULL, file_size BIGINT, mime_type VARCHAR(100), cover_image_path VARCHAR(500), series VARCHAR(255), series_number INTEGER, tags TEXT, asin VARCHAR(20), date_published DATE, publisher VARCHAR(255), contributors TEXT, added_by_admin_id UUID REFERENCES users(id) ON DELETE SET NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Create reading_progress table CREATE TABLE reading_progress ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), ebook_id UUID NOT NULL REFERENCES ebooks(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, current_page INTEGER DEFAULT 0, total_pages INTEGER, last_read_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), UNIQUE(ebook_id, user_id) ); -- Create ebook_ratings table CREATE TABLE ebook_ratings ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), ebook_id UUID NOT NULL REFERENCES ebooks(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, rating INTEGER NOT NULL CHECK (rating >= 1 AND rating <= 10), -- 10-point scale for half-star precision created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), UNIQUE(ebook_id, user_id) ); -- Create user_ebook_folders table for multiple folders per user CREATE TABLE user_ebook_folders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, folder_path VARCHAR(500) NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), UNIQUE(user_id, folder_path), CONSTRAINT admin_only_folder CHECK (EXISTS ( SELECT 1 FROM users WHERE id = user_id AND role = 'admin' )) ); -- Create indexes for better query performance CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_users_username ON users(username); CREATE INDEX idx_ebooks_title ON ebooks(title); CREATE INDEX idx_ebooks_author ON ebooks(author); CREATE INDEX idx_ebooks_added_by_admin_id ON ebooks(added_by_admin_id); CREATE INDEX idx_reading_progress_ebook_id ON reading_progress(ebook_id); CREATE INDEX idx_reading_progress_user_id ON reading_progress(user_id); CREATE INDEX idx_ebook_ratings_ebook_id ON ebook_ratings(ebook_id); CREATE INDEX idx_ebook_ratings_user_id ON ebook_ratings(user_id); CREATE INDEX idx_user_ebook_folders_user_id ON user_ebook_folders(user_id); -- Add comment explaining the rating system COMMENT ON COLUMN ebook_ratings.rating IS 'Rating scale 1-10 (odd numbers = half-stars: 1,3,5,7,9 = 0.5,1.5,2.5,3.5,4.5 stars)'; -- Role System Notes: -- - All users default to 'user' role -- - Admin users can: add/edit/delete folders, scan ebooks, modify ebook metadata, delete ebooks -- - Regular users can: view all ebooks, rate ebooks, track reading progress, manage their profile -- - To create first admin: UPDATE users SET role = 'admin' WHERE email = 'your-admin-email'; -- - Only admins can manage folders and ebook metadata