CREATE TABLE ias_mail_messages ( id BIGSERIAL PRIMARY KEY, source_key VARCHAR(512) NOT NULL, mailbox VARCHAR(255) NOT NULL, uid VARCHAR(255) NOT NULL, message_id TEXT, from_label TEXT NOT NULL DEFAULT '', subject TEXT NOT NULL DEFAULT '', summary TEXT NOT NULL DEFAULT '', content_preview TEXT NOT NULL DEFAULT '', preview_page_id BIGINT REFERENCES ias_web_pages(id) ON DELETE SET NULL, preview_url TEXT, received_at TIMESTAMPTZ, raw_size BIGINT NOT NULL DEFAULT 0, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE (source_key, mailbox, uid) ); CREATE INDEX idx_ias_mail_messages_created ON ias_mail_messages(created_at DESC); CREATE INDEX idx_ias_mail_messages_received ON ias_mail_messages(received_at DESC); INSERT INTO ias_upgrade_logs ( version, released_at, title, description, changes ) VALUES ( '0.1.4', '2026-07-06T00:00:00+08:00', 'Mail polling and standalone HTTP module', 'Added a standalone mail module for IMAP polling and notifications, moved HTTP serving and web preview pages into a standalone Rust module, and added mail persistence tables.', '[ "Added the standalone Rust mail module for IMAP mailbox polling, message parsing, database deduplication, preview-page creation, and user notifications.", "Added the standalone Rust ias-http module for HTTP serving, health checks, and reusable web preview pages.", "Moved the existing web preview routes out of service and into ias-http.", "Added /mail-api/messages and /mail-api/messages/{id} for inspecting stored mail records.", "Added the ias_mail_messages database table and persisted the 0.1.4 upgrade record.", "Added mail polling configuration through IA_MAIL_* environment variables; polling stays disabled when mailbox settings are absent." ]'::jsonb ) ON CONFLICT (version) DO UPDATE SET released_at = EXCLUDED.released_at, title = EXCLUDED.title, description = EXCLUDED.description, changes = EXCLUDED.changes;