Add soft deletes via status column

- Add status ENUM('active','disabled','deleted') to 8 tables
- Change all physical DELETE to UPDATE status='deleted'
- All SELECT queries filter by status='active'
- toggleActive now alternates between active/disabled status
- Exceptions: monitoring_history, rate_limits, sessions keep physical purge
- audit_logs remains immutable
This commit is contained in:
2026-06-07 17:26:29 -04:00
parent 921d98bf60
commit 1741545318
6 changed files with 138 additions and 60 deletions

View File

@@ -0,0 +1,44 @@
-- ============================================================================
-- ServerManager Soft Deletes
-- Adds status column for soft deletes instead of physical row removal
-- Exceptions: monitoring_history, rate_limits, sessions (physical purge OK)
-- Exceptions: audit_logs (immutable, never deleted)
-- ============================================================================
ALTER TABLE `users`
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `updated_at`,
ADD INDEX `idx_users_status` (`status`);
ALTER TABLE `servers`
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `updated_at`,
ADD INDEX `idx_servers_status` (`status`);
ALTER TABLE `teams`
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `updated_at`,
ADD INDEX `idx_teams_status` (`status`);
ALTER TABLE `command_history`
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `executed_at`,
ADD INDEX `idx_command_history_status` (`status`);
ALTER TABLE `server_user`
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `role`,
ADD INDEX `idx_server_user_status` (`status`);
ALTER TABLE `team_user`
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `created_at`,
ADD INDEX `idx_team_user_status` (`status`);
ALTER TABLE `team_server`
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `role`,
ADD INDEX `idx_team_server_status` (`status`);
ALTER TABLE `api_tokens`
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `expires_at`,
ADD INDEX `idx_api_tokens_status` (`status`);
-- ============================================================================
-- FK constraints remain unchanged:
-- ON DELETE CASCADE only fires on physical DELETE, which we no longer do.
-- monitoring_history, rate_limits, sessions keep physical purge.
-- ============================================================================