<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20251103115049 extends AbstractMigration
{
public function getDescription(): string
{
return 'Create tables for backoffice user activity logging: std_users_login_audit and std_pages_edit_log';
}
public function up(Schema $schema): void
{
// Create std_users_login_audit table
$this->addSql("
CREATE TABLE std_users_login_audit (
id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'Unique identifier',
user_id INT UNSIGNED NOT NULL COMMENT 'Reference to std_users',
session_id VARCHAR(255) NOT NULL COMMENT 'PHP session identifier',
login_timestamp DATETIME NOT NULL COMMENT 'Login date and time',
logout_timestamp DATETIME DEFAULT NULL COMMENT 'Logout date and time',
session_duration INT UNSIGNED DEFAULT NULL COMMENT 'Session duration in seconds',
ip_address VARCHAR(45) DEFAULT NULL COMMENT 'Client IP address (IPv4 or IPv6)',
user_agent TEXT DEFAULT NULL COMMENT 'Client user agent string',
browser VARCHAR(100) DEFAULT NULL COMMENT 'Browser name',
browser_version VARCHAR(50) DEFAULT NULL COMMENT 'Browser version',
platform VARCHAR(100) DEFAULT NULL COMMENT 'Operating system platform',
device_type VARCHAR(50) DEFAULT NULL COMMENT 'Device type (desktop, mobile, tablet)',
is_successful TINYINT(1) NOT NULL DEFAULT 1 COMMENT 'Flag indicating if login was successful',
failure_reason VARCHAR(255) DEFAULT NULL COMMENT 'Reason for login failure',
INDEX fk_std_users_login_audit_user (user_id),
INDEX idx_login_timestamp (login_timestamp),
INDEX idx_session_id (session_id),
PRIMARY KEY(id),
CONSTRAINT fk_std_users_login_audit_user FOREIGN KEY (user_id) REFERENCES std_users (id) ON DELETE CASCADE
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB COMMENT = 'Audit log for backoffice user logins'
");
// Create std_pages_edit_log table
$this->addSql("
CREATE TABLE std_pages_edit_log (
id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'Unique identifier',
page_id INT UNSIGNED NOT NULL COMMENT 'Reference to std_pages',
user_id INT UNSIGNED NOT NULL COMMENT 'Reference to std_users',
content_type_id INT UNSIGNED NOT NULL COMMENT 'Reference to std_content_types',
edit_date DATE NOT NULL COMMENT 'Date of the edit (no time component)',
edit_timestamp DATETIME NOT NULL COMMENT 'Exact timestamp of the edit',
action_type VARCHAR(20) NOT NULL COMMENT 'Type of action: create, update, delete',
page_name VARCHAR(255) DEFAULT NULL COMMENT 'Page name at time of edit',
content_type_name VARCHAR(100) DEFAULT NULL COMMENT 'Content type name at time of edit',
edit_count INT UNSIGNED NOT NULL DEFAULT 1 COMMENT 'Number of edits on this date by this user',
fields_changed TEXT DEFAULT NULL COMMENT 'JSON array of changed field names',
ip_address VARCHAR(45) DEFAULT NULL COMMENT 'Client IP address',
INDEX fk_std_pages_edit_log_page (page_id),
INDEX fk_std_pages_edit_log_user (user_id),
INDEX fk_std_pages_edit_log_content_type (content_type_id),
INDEX idx_edit_date (edit_date),
INDEX idx_page_date (page_id, edit_date),
PRIMARY KEY(id),
CONSTRAINT fk_std_pages_edit_log_page FOREIGN KEY (page_id) REFERENCES std_pages (id) ON DELETE CASCADE,
CONSTRAINT fk_std_pages_edit_log_user FOREIGN KEY (user_id) REFERENCES std_users (id) ON DELETE CASCADE,
CONSTRAINT fk_std_pages_edit_log_content_type FOREIGN KEY (content_type_id) REFERENCES std_content_types (id) ON DELETE CASCADE
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB COMMENT = 'Log of daily edited content (std_pages)'
");
}
public function down(Schema $schema): void
{
// Drop tables in reverse order
$this->addSql('DROP TABLE IF EXISTS std_pages_edit_log');
$this->addSql('DROP TABLE IF EXISTS std_users_login_audit');
}
}