ALTER TABLE `user` ADD COLUMN `password_changed_at` DATETIME NULL AFTER `last_login`; CREATE TABLE IF NOT EXISTS `user_login_session` ( id BIGINT PRIMARY KEY, user_id BIGINT NOT NULL, access_token_id VARCHAR(64) NOT NULL, refresh_token_id VARCHAR(64) NOT NULL, user_agent VARCHAR(512), ip VARCHAR(64), last_active_at DATETIME NOT NULL, expires_at DATETIME NOT NULL, revoked_at DATETIME, created_at DATETIME, UNIQUE KEY uk_session_access (access_token_id), UNIQUE KEY uk_session_refresh (refresh_token_id), KEY idx_session_user_active (user_id, revoked_at, expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `invoice_profile` ( id BIGINT PRIMARY KEY, user_id BIGINT NOT NULL, title VARCHAR(128) NOT NULL, taxpayer_number VARCHAR(64) NOT NULL, email VARCHAR(128) NOT NULL, is_default TINYINT DEFAULT 0, created_at DATETIME, updated_at DATETIME, KEY idx_invoice_profile_user (user_id, is_default) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `invoice_request` ( id BIGINT PRIMARY KEY, user_id BIGINT NOT NULL, order_id BIGINT NOT NULL, amount DECIMAL(10,2) NOT NULL, title VARCHAR(128) NOT NULL, taxpayer_number VARCHAR(64) NOT NULL, email VARCHAR(128) NOT NULL, status VARCHAR(16) DEFAULT 'pending', invoice_number VARCHAR(64), admin_remark VARCHAR(256), requested_at DATETIME, processed_at DATETIME, UNIQUE KEY uk_invoice_order (order_id), KEY idx_invoice_request_user (user_id, requested_at), KEY idx_invoice_request_status (status, requested_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE INDEX idx_download_log_user_created ON download_log (user_id, created_at DESC);