177 lines
8.1 KiB
SQL
177 lines
8.1 KiB
SQL
-- Migration: Split mailbox into separate tables for each module
|
|
-- This addresses the architectural concern of having all modules in a single table
|
|
|
|
-- 1. Create INBOUND tables
|
|
CREATE TABLE IF NOT EXISTS inbound_mail (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
ref_no VARCHAR(50) NOT NULL UNIQUE,
|
|
date_registered DATE NOT NULL,
|
|
due_date DATE NULL,
|
|
sender VARCHAR(255),
|
|
recipient VARCHAR(255),
|
|
subject VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
status_id INT,
|
|
assigned_to INT,
|
|
created_by INT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (assigned_to) REFERENCES users(id) ON DELETE SET NULL,
|
|
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS inbound_attachments (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
mail_id INT NOT NULL,
|
|
display_name VARCHAR(255),
|
|
file_path VARCHAR(255) NOT NULL,
|
|
file_name VARCHAR(255) NOT NULL,
|
|
file_size INT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (mail_id) REFERENCES inbound_mail(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS inbound_comments (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
mail_id INT NOT NULL,
|
|
user_id INT,
|
|
comment TEXT NOT NULL,
|
|
referred_user_id INT DEFAULT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (mail_id) REFERENCES inbound_mail(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
|
|
FOREIGN KEY (referred_user_id) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 2. Create OUTBOUND tables
|
|
CREATE TABLE IF NOT EXISTS outbound_mail (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
ref_no VARCHAR(50) NOT NULL UNIQUE,
|
|
date_registered DATE NOT NULL,
|
|
due_date DATE NULL,
|
|
sender VARCHAR(255),
|
|
recipient VARCHAR(255),
|
|
subject VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
status_id INT,
|
|
assigned_to INT,
|
|
created_by INT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (assigned_to) REFERENCES users(id) ON DELETE SET NULL,
|
|
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS outbound_attachments (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
mail_id INT NOT NULL,
|
|
display_name VARCHAR(255),
|
|
file_path VARCHAR(255) NOT NULL,
|
|
file_name VARCHAR(255) NOT NULL,
|
|
file_size INT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (mail_id) REFERENCES outbound_mail(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS outbound_comments (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
mail_id INT NOT NULL,
|
|
user_id INT,
|
|
comment TEXT NOT NULL,
|
|
referred_user_id INT DEFAULT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (mail_id) REFERENCES outbound_mail(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
|
|
FOREIGN KEY (referred_user_id) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 3. Create INTERNAL tables
|
|
CREATE TABLE IF NOT EXISTS internal_mail (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
ref_no VARCHAR(50) NOT NULL UNIQUE,
|
|
date_registered DATE NOT NULL,
|
|
due_date DATE NULL,
|
|
sender VARCHAR(255),
|
|
recipient VARCHAR(255),
|
|
subject VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
status_id INT,
|
|
assigned_to INT,
|
|
created_by INT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (assigned_to) REFERENCES users(id) ON DELETE SET NULL,
|
|
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS internal_attachments (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
mail_id INT NOT NULL,
|
|
display_name VARCHAR(255),
|
|
file_path VARCHAR(255) NOT NULL,
|
|
file_name VARCHAR(255) NOT NULL,
|
|
file_size INT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (mail_id) REFERENCES internal_mail(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS internal_comments (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
mail_id INT NOT NULL,
|
|
user_id INT,
|
|
comment TEXT NOT NULL,
|
|
referred_user_id INT DEFAULT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (mail_id) REFERENCES internal_mail(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
|
|
FOREIGN KEY (referred_user_id) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 4. Migrate data from old mailbox table
|
|
-- We'll use a temporary mapping for IDs if we were strict, but since we are splitting, we can just insert.
|
|
-- Note: Original IDs will change, which means attachments and comments must be migrated carefully.
|
|
|
|
-- Migrate Inbound
|
|
INSERT 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';
|
|
|
|
INSERT 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';
|
|
|
|
INSERT 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';
|
|
|
|
-- Migrate Outbound
|
|
INSERT 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';
|
|
|
|
INSERT 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';
|
|
|
|
INSERT 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';
|
|
|
|
-- Migrate Internal
|
|
INSERT 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';
|
|
|
|
INSERT 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';
|
|
|
|
INSERT 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';
|
|
|
|
-- 5. Rename old tables instead of dropping for safety
|
|
RENAME TABLE mailbox TO mailbox_old;
|
|
RENAME TABLE attachments TO attachments_old;
|
|
RENAME TABLE comments TO comments_old;
|