Major Features: - Add comprehensive audit logging system with AuditService - Create AuditLogs database migration for tracking changes - Implement TestValidationService for test data validation - Add FRONTEND_TEST_MANAGEMENT_PROMPT.md documentation Controllers: - Update TestsController with improved test management Models: - Enhance PatientModel with additional functionality - Update TestDefSiteModel for better site management Database: - Add CreateAuditLogs migration (2026-02-20-000011) - Update TestSeeder with new test data Services: - Add AuditService for comprehensive audit trail logging Documentation: - Update AGENTS.md with improved guidelines - Update audit-logging-plan.md with implementation details - Add FRONTEND_TEST_MANAGEMENT_PROMPT.md for frontend guidance API Documentation: - Update api-docs.bundled.yaml - Update tests.yaml schema definitions - Update tests.yaml paths Testing: - Enhance TestsControllerTest with new test cases - Update TestDefModelsTest for model coverage
163 lines
10 KiB
PHP
163 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Database\Migrations;
|
|
|
|
use CodeIgniter\Database\Migration;
|
|
|
|
class CreateAuditLogs extends Migration {
|
|
public function up() {
|
|
// Drop old audit tables if they exist
|
|
$this->forge->dropTable('patreglog', true);
|
|
$this->forge->dropTable('patvisitlog', true);
|
|
$this->forge->dropTable('specimenlog', true);
|
|
|
|
// Create data_audit_log table
|
|
$this->forge->addField([
|
|
'id' => ['type' => 'BIGINT', 'constraint' => 20, 'unsigned' => true, 'auto_increment' => true],
|
|
'operation' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => false],
|
|
'entity_type' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => false],
|
|
'entity_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => false],
|
|
'table_name' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'field_name' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'previous_value' => ['type' => 'JSON', 'null' => true],
|
|
'new_value' => ['type' => 'JSON', 'null' => true],
|
|
'mechanism' => ['type' => 'ENUM', 'constraint' => ['MANUAL', 'AUTOMATIC'], 'null' => false, 'default' => 'MANUAL'],
|
|
'application_id' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
|
|
'web_page' => ['type' => 'VARCHAR', 'constraint' => 500, 'null' => true],
|
|
'session_id' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'event_type' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'site_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => true],
|
|
'workstation_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => true],
|
|
'pc_name' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'ip_address' => ['type' => 'VARCHAR', 'constraint' => 45, 'null' => true],
|
|
'user_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => false],
|
|
'created_at' => ['type' => 'DATETIME', 'null' => false],
|
|
'reason' => ['type' => 'TEXT', 'null' => true],
|
|
'context' => ['type' => 'JSON', 'null' => true]
|
|
]);
|
|
$this->forge->addKey('id', true);
|
|
$this->forge->addKey('idx_operation_created', ['operation', 'created_at']);
|
|
$this->forge->addKey('idx_entity', ['entity_type', 'entity_id', 'created_at']);
|
|
$this->forge->addKey('idx_user_created', ['user_id', 'created_at']);
|
|
$this->forge->addKey('idx_mechanism', ['mechanism', 'created_at']);
|
|
$this->forge->addKey('idx_table', ['table_name', 'created_at']);
|
|
$this->forge->addKey('idx_site', ['site_id', 'created_at']);
|
|
$this->forge->addKey('idx_created', 'created_at');
|
|
$this->forge->addKey('idx_session', ['session_id', 'created_at']);
|
|
$this->forge->createTable('data_audit_log', true);
|
|
|
|
// Create service_audit_log table
|
|
$this->forge->addField([
|
|
'id' => ['type' => 'BIGINT', 'constraint' => 20, 'unsigned' => true, 'auto_increment' => true],
|
|
'operation' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => false],
|
|
'entity_type' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => false],
|
|
'entity_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => false],
|
|
'service_class' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
|
|
'resource_type' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'resource_details' => ['type' => 'JSON', 'null' => true],
|
|
'previous_value' => ['type' => 'JSON', 'null' => true],
|
|
'new_value' => ['type' => 'JSON', 'null' => true],
|
|
'mechanism' => ['type' => 'ENUM', 'constraint' => ['MANUAL', 'AUTOMATIC'], 'null' => false, 'default' => 'AUTOMATIC'],
|
|
'application_id' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
|
|
'service_name' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'session_id' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'event_type' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'site_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => true],
|
|
'workstation_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => true],
|
|
'pc_name' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'ip_address' => ['type' => 'VARCHAR', 'constraint' => 45, 'null' => true],
|
|
'port' => ['type' => 'INT', 'null' => true],
|
|
'user_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => false],
|
|
'created_at' => ['type' => 'DATETIME', 'null' => false],
|
|
'reason' => ['type' => 'TEXT', 'null' => true],
|
|
'context' => ['type' => 'JSON', 'null' => true]
|
|
]);
|
|
$this->forge->addKey('id', true);
|
|
$this->forge->addKey('idx_operation_created', ['operation', 'created_at']);
|
|
$this->forge->addKey('idx_entity', ['entity_type', 'entity_id', 'created_at']);
|
|
$this->forge->addKey('idx_service_class', ['service_class', 'created_at']);
|
|
$this->forge->addKey('idx_user_created', ['user_id', 'created_at']);
|
|
$this->forge->addKey('idx_mechanism', ['mechanism', 'created_at']);
|
|
$this->forge->addKey('idx_site', ['site_id', 'created_at']);
|
|
$this->forge->addKey('idx_created', 'created_at');
|
|
$this->forge->createTable('service_audit_log', true);
|
|
|
|
// Create security_audit_log table
|
|
$this->forge->addField([
|
|
'id' => ['type' => 'BIGINT', 'constraint' => 20, 'unsigned' => true, 'auto_increment' => true],
|
|
'operation' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => false],
|
|
'entity_type' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => false],
|
|
'entity_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => false],
|
|
'security_class' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
|
|
'resource_path' => ['type' => 'VARCHAR', 'constraint' => 500, 'null' => true],
|
|
'previous_value' => ['type' => 'JSON', 'null' => true],
|
|
'new_value' => ['type' => 'JSON', 'null' => true],
|
|
'mechanism' => ['type' => 'ENUM', 'constraint' => ['MANUAL', 'AUTOMATIC'], 'null' => false, 'default' => 'MANUAL'],
|
|
'application_id' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
|
|
'web_page' => ['type' => 'VARCHAR', 'constraint' => 500, 'null' => true],
|
|
'session_id' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'event_type' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'site_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => true],
|
|
'workstation_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => true],
|
|
'pc_name' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'ip_address' => ['type' => 'VARCHAR', 'constraint' => 45, 'null' => true],
|
|
'user_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => false],
|
|
'created_at' => ['type' => 'DATETIME', 'null' => false],
|
|
'reason' => ['type' => 'TEXT', 'null' => true],
|
|
'context' => ['type' => 'JSON', 'null' => true]
|
|
]);
|
|
$this->forge->addKey('id', true);
|
|
$this->forge->addKey('idx_operation_created', ['operation', 'created_at']);
|
|
$this->forge->addKey('idx_entity', ['entity_type', 'entity_id', 'created_at']);
|
|
$this->forge->addKey('idx_security_class', ['security_class', 'created_at']);
|
|
$this->forge->addKey('idx_user_created', ['user_id', 'created_at']);
|
|
$this->forge->addKey('idx_event_type', ['event_type', 'created_at']);
|
|
$this->forge->addKey('idx_site', ['site_id', 'created_at']);
|
|
$this->forge->addKey('idx_created', 'created_at');
|
|
$this->forge->addKey('idx_session', ['session_id', 'created_at']);
|
|
$this->forge->createTable('security_audit_log', true);
|
|
|
|
// Create error_audit_log table
|
|
$this->forge->addField([
|
|
'id' => ['type' => 'BIGINT', 'constraint' => 20, 'unsigned' => true, 'auto_increment' => true],
|
|
'operation' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => false],
|
|
'entity_type' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => false],
|
|
'entity_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => false],
|
|
'error_code' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
|
|
'error_message' => ['type' => 'TEXT', 'null' => true],
|
|
'error_details' => ['type' => 'JSON', 'null' => true],
|
|
'previous_value' => ['type' => 'JSON', 'null' => true],
|
|
'new_value' => ['type' => 'JSON', 'null' => true],
|
|
'mechanism' => ['type' => 'ENUM', 'constraint' => ['MANUAL', 'AUTOMATIC'], 'null' => false, 'default' => 'MANUAL'],
|
|
'application_id' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
|
|
'web_page' => ['type' => 'VARCHAR', 'constraint' => 500, 'null' => true],
|
|
'session_id' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'event_type' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'site_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => true],
|
|
'workstation_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => true],
|
|
'pc_name' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => true],
|
|
'ip_address' => ['type' => 'VARCHAR', 'constraint' => 45, 'null' => true],
|
|
'user_id' => ['type' => 'VARCHAR', 'constraint' => 36, 'null' => false],
|
|
'created_at' => ['type' => 'DATETIME', 'null' => false],
|
|
'reason' => ['type' => 'TEXT', 'null' => true],
|
|
'context' => ['type' => 'JSON', 'null' => true]
|
|
]);
|
|
$this->forge->addKey('id', true);
|
|
$this->forge->addKey('idx_operation_created', ['operation', 'created_at']);
|
|
$this->forge->addKey('idx_entity', ['entity_type', 'entity_id', 'created_at']);
|
|
$this->forge->addKey('idx_error_code', ['error_code', 'created_at']);
|
|
$this->forge->addKey('idx_event_type', ['event_type', 'created_at']);
|
|
$this->forge->addKey('idx_user_created', ['user_id', 'created_at']);
|
|
$this->forge->addKey('idx_site', ['site_id', 'created_at']);
|
|
$this->forge->addKey('idx_created', 'created_at');
|
|
$this->forge->createTable('error_audit_log', true);
|
|
}
|
|
|
|
public function down() {
|
|
$this->forge->dropTable('error_audit_log');
|
|
$this->forge->dropTable('security_audit_log');
|
|
$this->forge->dropTable('service_audit_log');
|
|
$this->forge->dropTable('data_audit_log');
|
|
}
|
|
}
|