-- Migration 180: Personal user notes for bottom bar -- Date: 2026-04-24 CREATE TABLE IF NOT EXISTS user_notes ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(user_id) ON DELETE CASCADE, title VARCHAR(200) NOT NULL DEFAULT '', content TEXT NOT NULL, is_pinned BOOLEAN NOT NULL DEFAULT FALSE, is_archived BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMP NULL ); CREATE INDEX IF NOT EXISTS idx_user_notes_user_active ON user_notes (user_id, is_archived, is_pinned, updated_at DESC) WHERE deleted_at IS NULL; CREATE INDEX IF NOT EXISTS idx_user_notes_user_updated ON user_notes (user_id, updated_at DESC) WHERE deleted_at IS NULL; CREATE OR REPLACE FUNCTION update_user_notes_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS trg_user_notes_updated_at ON user_notes; CREATE TRIGGER trg_user_notes_updated_at BEFORE UPDATE ON user_notes FOR EACH ROW EXECUTE FUNCTION update_user_notes_updated_at();