-- Tasko Database Schema for PostgreSQL -- Run this script as postgres superuser, then connect as tasko_user -- Create database CREATE DATABASE tasko_db; -- Connect to the database \c tasko_db -- Create application user with limited privileges (best practice) CREATE USER tasko_user WITH PASSWORD 'tasko_password'; -- Grant connection privilege GRANT CONNECT ON DATABASE tasko_db TO tasko_user; -- Create schema CREATE SCHEMA IF NOT EXISTS public; -- Grant schema usage GRANT USAGE ON SCHEMA public TO tasko_user; -- Create tables CREATE TABLE users ( id VARCHAR(36) PRIMARY KEY, username VARCHAR(100) UNIQUE NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(64) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL ); CREATE TABLE tokens ( token VARCHAR(36) PRIMARY KEY, user_id VARCHAR(36) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE TABLE task_lists ( id VARCHAR(36) PRIMARY KEY, user_id VARCHAR(36) NOT NULL, name VARCHAR(200) NOT NULL, icon VARCHAR(10) DEFAULT '📝', color VARCHAR(7) DEFAULT '#667eea', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE TABLE tasks ( id VARCHAR(36) PRIMARY KEY, list_id VARCHAR(36) NOT NULL, user_id VARCHAR(36) NOT NULL, title VARCHAR(500) NOT NULL, description TEXT, completed BOOLEAN DEFAULT FALSE NOT NULL, priority VARCHAR(20) DEFAULT 'medium', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, FOREIGN KEY (list_id) REFERENCES task_lists(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); -- Create indexes for better query performance CREATE INDEX idx_tokens_user_id ON tokens(user_id); CREATE INDEX idx_task_lists_user_id ON task_lists(user_id); CREATE INDEX idx_tasks_list_id ON tasks(list_id); CREATE INDEX idx_tasks_user_id ON tasks(user_id); CREATE INDEX idx_tasks_completed ON tasks(completed); -- Grant privileges to tasko_user GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO tasko_user; -- Grant sequence privileges (for any future auto-increment columns) GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO tasko_user; -- Set default privileges for future tables ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO tasko_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO tasko_user; -- Display summary \dt \du