From 518c9fdd195bf228fbea1264f7260141cbebcbe2 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 27 Mar 2026 05:43:49 +0000 Subject: [PATCH] update migration --- db/migrations/016_split_mailbox_tables.sql | 96 +++++++++++++++------- 1 file changed, 66 insertions(+), 30 deletions(-) diff --git a/db/migrations/016_split_mailbox_tables.sql b/db/migrations/016_split_mailbox_tables.sql index 3de8ae4..5e5a0fc 100644 --- a/db/migrations/016_split_mailbox_tables.sql +++ b/db/migrations/016_split_mailbox_tables.sql @@ -128,46 +128,82 @@ CREATE TABLE IF NOT EXISTS internal_comments ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 4. Migrate data (using INSERT IGNORE to allow re-running partially failed migrations) -INSERT IGNORE INTO inbound_mail (id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at) -SELECT id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at -FROM mailbox WHERE type = 'inbound'; +-- We wrap these in conditional checks to ensure they only run if 'mailbox' exists. -INSERT IGNORE INTO inbound_attachments (id, mail_id, display_name, file_path, file_name, file_size, created_at) -SELECT a.id, a.mail_id, a.display_name, a.file_path, a.file_name, a.file_size, a.created_at -FROM attachments a JOIN mailbox m ON a.mail_id = m.id WHERE m.type = 'inbound'; +SET @mailbox_exists = (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'mailbox'); -INSERT IGNORE INTO inbound_comments (id, mail_id, user_id, comment, referred_user_id, created_at) -SELECT c.id, c.mail_id, c.user_id, c.comment, c.referred_user_id, c.created_at -FROM comments c JOIN mailbox m ON c.mail_id = m.id WHERE m.type = 'inbound'; +-- Inbound Mail +SET @sql = IF(@mailbox_exists > 0, + "INSERT IGNORE INTO inbound_mail (id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at) SELECT id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at FROM mailbox WHERE type = 'inbound'", + "SELECT 1"); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; -INSERT IGNORE INTO outbound_mail (id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at) -SELECT id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at -FROM mailbox WHERE type = 'outbound'; +SET @sql = IF(@mailbox_exists > 0, + "INSERT IGNORE INTO inbound_attachments (id, mail_id, display_name, file_path, file_name, file_size, created_at) SELECT a.id, a.mail_id, a.display_name, a.file_path, a.file_name, a.file_size, a.created_at FROM attachments a JOIN mailbox m ON a.mail_id = m.id WHERE m.type = 'inbound'", + "SELECT 1"); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; -INSERT IGNORE INTO outbound_attachments (id, mail_id, display_name, file_path, file_name, file_size, created_at) -SELECT a.id, a.mail_id, a.display_name, a.file_path, a.file_name, a.file_size, a.created_at -FROM attachments a JOIN mailbox m ON a.mail_id = m.id WHERE m.type = 'outbound'; +SET @sql = IF(@mailbox_exists > 0, + "INSERT IGNORE INTO inbound_comments (id, mail_id, user_id, comment, referred_user_id, created_at) SELECT c.id, c.mail_id, c.user_id, c.comment, c.referred_user_id, c.created_at FROM comments c JOIN mailbox m ON c.mail_id = m.id WHERE m.type = 'inbound'", + "SELECT 1"); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; -INSERT IGNORE INTO outbound_comments (id, mail_id, user_id, comment, referred_user_id, created_at) -SELECT c.id, c.mail_id, c.user_id, c.comment, c.referred_user_id, c.created_at -FROM comments c JOIN mailbox m ON c.mail_id = m.id WHERE m.type = 'outbound'; +-- Outbound Mail +SET @sql = IF(@mailbox_exists > 0, + "INSERT IGNORE INTO outbound_mail (id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at) SELECT id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at FROM mailbox WHERE type = 'outbound'", + "SELECT 1"); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; -INSERT IGNORE INTO internal_mail (id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at) -SELECT id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at -FROM mailbox WHERE type = 'internal'; +SET @sql = IF(@mailbox_exists > 0, + "INSERT IGNORE INTO outbound_attachments (id, mail_id, display_name, file_path, file_name, file_size, created_at) SELECT a.id, a.mail_id, a.display_name, a.file_path, a.file_name, a.file_size, a.created_at FROM attachments a JOIN mailbox m ON a.mail_id = m.id WHERE m.type = 'outbound'", + "SELECT 1"); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; -INSERT IGNORE INTO internal_attachments (id, mail_id, display_name, file_path, file_name, file_size, created_at) -SELECT a.id, a.mail_id, a.display_name, a.file_path, a.file_name, a.file_size, a.created_at -FROM attachments a JOIN mailbox m ON a.mail_id = m.id WHERE m.type = 'internal'; +SET @sql = IF(@mailbox_exists > 0, + "INSERT IGNORE INTO outbound_comments (id, mail_id, user_id, comment, referred_user_id, created_at) SELECT c.id, c.mail_id, c.user_id, c.comment, c.referred_user_id, c.created_at FROM comments c JOIN mailbox m ON c.mail_id = m.id WHERE m.type = 'outbound'", + "SELECT 1"); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; -INSERT IGNORE INTO internal_comments (id, mail_id, user_id, comment, referred_user_id, created_at) -SELECT c.id, c.mail_id, c.user_id, c.comment, c.referred_user_id, c.created_at -FROM comments c JOIN mailbox m ON c.mail_id = m.id WHERE m.type = 'internal'; +-- Internal Mail +SET @sql = IF(@mailbox_exists > 0, + "INSERT IGNORE INTO internal_mail (id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at) SELECT id, ref_no, date_registered, due_date, sender, recipient, subject, description, status_id, assigned_to, created_by, created_at, updated_at FROM mailbox WHERE type = 'internal'", + "SELECT 1"); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql = IF(@mailbox_exists > 0, + "INSERT IGNORE INTO internal_attachments (id, mail_id, display_name, file_path, file_name, file_size, created_at) SELECT a.id, a.mail_id, a.display_name, a.file_path, a.file_name, a.file_size, a.created_at FROM attachments a JOIN mailbox m ON a.mail_id = m.id WHERE m.type = 'internal'", + "SELECT 1"); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql = IF(@mailbox_exists > 0, + "INSERT IGNORE INTO internal_comments (id, mail_id, user_id, comment, referred_user_id, created_at) SELECT c.id, c.mail_id, c.user_id, c.comment, c.referred_user_id, c.created_at FROM comments c JOIN mailbox m ON c.mail_id = m.id WHERE m.type = 'internal'", + "SELECT 1"); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; -- 5. Rename old tables instead of dropping for safety --- Using a check because RENAME TABLE fails if the target exists +-- Only rename if 'mailbox' exists and 'mailbox_old' does not SET @old_mailbox = (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'mailbox_old'); -SET @sql_rename = IF(@old_mailbox = 0, 'RENAME TABLE mailbox TO mailbox_old, attachments TO attachments_old, comments TO comments_old', 'SELECT 1'); +SET @mailbox_exists = (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'mailbox'); + +SET @sql_rename = IF(@old_mailbox = 0 AND @mailbox_exists > 0, 'RENAME TABLE mailbox TO mailbox_old, attachments TO attachments_old, comments TO comments_old', 'SELECT 1'); PREPARE stmt FROM @sql_rename; EXECUTE stmt; -DEALLOCATE PREPARE stmt; \ No newline at end of file +DEALLOCATE PREPARE stmt;