migrations/Version20251103115049.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. /**
  7.  * Auto-generated Migration: Please modify to your needs!
  8.  */
  9. final class Version20251103115049 extends AbstractMigration
  10. {
  11.     public function getDescription(): string
  12.     {
  13.         return 'Create tables for backoffice user activity logging: std_users_login_audit and std_pages_edit_log';
  14.     }
  15.     public function up(Schema $schema): void
  16.     {
  17.         // Create std_users_login_audit table
  18.         $this->addSql("
  19.             CREATE TABLE std_users_login_audit (
  20.                 id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'Unique identifier',
  21.                 user_id INT UNSIGNED NOT NULL COMMENT 'Reference to std_users',
  22.                 session_id VARCHAR(255) NOT NULL COMMENT 'PHP session identifier',
  23.                 login_timestamp DATETIME NOT NULL COMMENT 'Login date and time',
  24.                 logout_timestamp DATETIME DEFAULT NULL COMMENT 'Logout date and time',
  25.                 session_duration INT UNSIGNED DEFAULT NULL COMMENT 'Session duration in seconds',
  26.                 ip_address VARCHAR(45) DEFAULT NULL COMMENT 'Client IP address (IPv4 or IPv6)',
  27.                 user_agent TEXT DEFAULT NULL COMMENT 'Client user agent string',
  28.                 browser VARCHAR(100) DEFAULT NULL COMMENT 'Browser name',
  29.                 browser_version VARCHAR(50) DEFAULT NULL COMMENT 'Browser version',
  30.                 platform VARCHAR(100) DEFAULT NULL COMMENT 'Operating system platform',
  31.                 device_type VARCHAR(50) DEFAULT NULL COMMENT 'Device type (desktop, mobile, tablet)',
  32.                 is_successful TINYINT(1) NOT NULL DEFAULT 1 COMMENT 'Flag indicating if login was successful',
  33.                 failure_reason VARCHAR(255) DEFAULT NULL COMMENT 'Reason for login failure',
  34.                 INDEX fk_std_users_login_audit_user (user_id),
  35.                 INDEX idx_login_timestamp (login_timestamp),
  36.                 INDEX idx_session_id (session_id),
  37.                 PRIMARY KEY(id),
  38.                 CONSTRAINT fk_std_users_login_audit_user FOREIGN KEY (user_id) REFERENCES std_users (id) ON DELETE CASCADE
  39.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB COMMENT = 'Audit log for backoffice user logins'
  40.         ");
  41.         // Create std_pages_edit_log table
  42.         $this->addSql("
  43.             CREATE TABLE std_pages_edit_log (
  44.                 id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'Unique identifier',
  45.                 page_id INT UNSIGNED NOT NULL COMMENT 'Reference to std_pages',
  46.                 user_id INT UNSIGNED NOT NULL COMMENT 'Reference to std_users',
  47.                 content_type_id INT UNSIGNED NOT NULL COMMENT 'Reference to std_content_types',
  48.                 edit_date DATE NOT NULL COMMENT 'Date of the edit (no time component)',
  49.                 edit_timestamp DATETIME NOT NULL COMMENT 'Exact timestamp of the edit',
  50.                 action_type VARCHAR(20) NOT NULL COMMENT 'Type of action: create, update, delete',
  51.                 page_name VARCHAR(255) DEFAULT NULL COMMENT 'Page name at time of edit',
  52.                 content_type_name VARCHAR(100) DEFAULT NULL COMMENT 'Content type name at time of edit',
  53.                 edit_count INT UNSIGNED NOT NULL DEFAULT 1 COMMENT 'Number of edits on this date by this user',
  54.                 fields_changed TEXT DEFAULT NULL COMMENT 'JSON array of changed field names',
  55.                 ip_address VARCHAR(45) DEFAULT NULL COMMENT 'Client IP address',
  56.                 INDEX fk_std_pages_edit_log_page (page_id),
  57.                 INDEX fk_std_pages_edit_log_user (user_id),
  58.                 INDEX fk_std_pages_edit_log_content_type (content_type_id),
  59.                 INDEX idx_edit_date (edit_date),
  60.                 INDEX idx_page_date (page_id, edit_date),
  61.                 PRIMARY KEY(id),
  62.                 CONSTRAINT fk_std_pages_edit_log_page FOREIGN KEY (page_id) REFERENCES std_pages (id) ON DELETE CASCADE,
  63.                 CONSTRAINT fk_std_pages_edit_log_user FOREIGN KEY (user_id) REFERENCES std_users (id) ON DELETE CASCADE,
  64.                 CONSTRAINT fk_std_pages_edit_log_content_type FOREIGN KEY (content_type_id) REFERENCES std_content_types (id) ON DELETE CASCADE
  65.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB COMMENT = 'Log of daily edited content (std_pages)'
  66.         ");
  67.     }
  68.     public function down(Schema $schema): void
  69.     {
  70.         // Drop tables in reverse order
  71.         $this->addSql('DROP TABLE IF EXISTS std_pages_edit_log');
  72.         $this->addSql('DROP TABLE IF EXISTS std_users_login_audit');
  73.     }
  74. }