37 lines
1.2 KiB
MySQL
37 lines
1.2 KiB
MySQL
|
|
-- 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();
|