Protokoll #14449

ID14449
Zeitstempel2025-12-25 10:39:59.736577
Clientroot
IP
Warning: Undefined array key "request_ip" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13

Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens2,187 (Input: 0, Output: 0)
Dauer102 ms
Request-Zeit
Warning: Undefined array key "request_timestamp" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 18
Response-Zeit-

Warning: Undefined array key "error_message" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 22

Request

{
    "event": "PreToolUse",
    "tool_name": "Edit",
    "tool_input": {
        "file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/Logging\/AuditLogger.php",
        "old_string": "use Infrastructure\\Config\\DatabaseFactory;\nuse PDO;\n\nfinal class AuditLogger\n{\n    private string $correlationId;\n    private PDO $db;\n\n    private const LOG_LEVELS = ['debug', 'info', 'warning', 'error'];\n\n    public function __construct(?string $correlationId = null)\n    {\n        $this->correlationId = $correlationId\n            ?? $_SERVER['HTTP_X_CORRELATION_ID']\n            ?? $_SERVER['CORRELATION_ID']\n            ?? $this->generateCorrelationId();\n\n        $this->db = DatabaseFactory::dev();\n    }",
        "new_string": "use PDO;\n\nfinal class AuditLogger\n{\n    private string $correlationId;\n    private PDO $db;\n\n    private const LOG_LEVELS = ['debug', 'info', 'warning', 'error'];\n\n    public function __construct(PDO $pdo, ?string $correlationId = null)\n    {\n        $this->db = $pdo;\n        $this->correlationId = $correlationId\n            ?? $_SERVER['HTTP_X_CORRELATION_ID']\n            ?? $_SERVER['CORRELATION_ID']\n            ?? $this->generateCorrelationId();\n    }"
    }
}

Response

{
    "tool_response": {
        "filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/Logging\/AuditLogger.php",
        "oldString": "use Infrastructure\\Config\\DatabaseFactory;\nuse PDO;\n\nfinal class AuditLogger\n{\n    private string $correlationId;\n    private PDO $db;\n\n    private const LOG_LEVELS = ['debug', 'info', 'warning', 'error'];\n\n    public function __construct(?string $correlationId = null)\n    {\n        $this->correlationId = $correlationId\n            ?? $_SERVER['HTTP_X_CORRELATION_ID']\n            ?? $_SERVER['CORRELATION_ID']\n            ?? $this->generateCorrelationId();\n\n        $this->db = DatabaseFactory::dev();\n    }",
        "newString": "use PDO;\n\nfinal class AuditLogger\n{\n    private string $correlationId;\n    private PDO $db;\n\n    private const LOG_LEVELS = ['debug', 'info', 'warning', 'error'];\n\n    public function __construct(PDO $pdo, ?string $correlationId = null)\n    {\n        $this->db = $pdo;\n        $this->correlationId = $correlationId\n            ?? $_SERVER['HTTP_X_CORRELATION_ID']\n            ?? $_SERVER['CORRELATION_ID']\n            ?? $this->generateCorrelationId();\n    }",
        "originalFile": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Infrastructure\\Logging;\n\n\/\/ @responsibility: Audit-Logging mit Correlation-ID und strukturiertem Kontext\n\nuse Infrastructure\\Config\\DatabaseFactory;\nuse PDO;\n\nfinal class AuditLogger\n{\n    private string $correlationId;\n    private PDO $db;\n\n    private const LOG_LEVELS = ['debug', 'info', 'warning', 'error'];\n\n    public function __construct(?string $correlationId = null)\n    {\n        $this->correlationId = $correlationId\n            ?? $_SERVER['HTTP_X_CORRELATION_ID']\n            ?? $_SERVER['CORRELATION_ID']\n            ?? $this->generateCorrelationId();\n\n        $this->db = DatabaseFactory::dev();\n    }\n\n    \/**\n     * Generate a unique correlation ID.\n     *\/\n    private function generateCorrelationId(): string\n    {\n        return bin2hex(random_bytes(8));\n    }\n\n    \/**\n     * Get the current correlation ID.\n     *\/\n    public function getCorrelationId(): string\n    {\n        return $this->correlationId;\n    }\n\n    \/**\n     * Log a generic event.\n     *\n     * @param string $event Event name (e.g., \"user.login\", \"chat.message.sent\")\n     * @param array<string, mixed> $context Additional context data\n     * @param string $level Log level: debug, info, warning, error\n     *\/\n    public function log(string $event, array $context = [], string $level = 'info'): void\n    {\n        if (!in_array($level, self::LOG_LEVELS, true)) {\n            $level = 'info';\n        }\n\n        $stmt = $this->db->prepare('\n            INSERT INTO audit_log\n            (correlation_id, event, context, level, user_id, ip_address, created_at)\n            VALUES (?, ?, ?, ?, ?, ?, NOW())\n        ');\n\n        $stmt->execute([\n            $this->correlationId,\n            $event,\n            json_encode($context, JSON_UNESCAPED_UNICODE),\n            $level,\n            $this->getUserId(),\n            $this->getIpAddress(),\n        ]);\n    }\n\n    \/**\n     * Log an entity action (CRUD operation).\n     *\n     * @param string $action Action performed: create, read, update, delete, etc.\n     * @param string $entity Entity type: user, task, content, etc.\n     * @param int|null $entityId Entity ID (null for create before ID is known)\n     * @param array<string, mixed> $data Additional data about the action\n     *\/\n    public function logAction(\n        string $action,\n        string $entity,\n        ?int $entityId = null,\n        array $data = []\n    ): void {\n        $event = \"{$entity}.{$action}\";\n\n        $stmt = $this->db->prepare('\n            INSERT INTO audit_log\n            (correlation_id, event, entity_type, entity_id, context, level, user_id, ip_address, created_at)\n            VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())\n        ');\n\n        $stmt->execute([\n            $this->correlationId,\n            $event,\n            $entity,\n            $entityId,\n            json_encode($data, JSON_UNESCAPED_UNICODE),\n            'info',\n            $this->getUserId(),\n            $this->getIpAddress(),\n        ]);\n    }\n\n    \/**\n     * Log an error event.\n     *\/\n    public function logError(string $event, string $message, array $context = []): void\n    {\n        $context['error_message'] = $message;\n        $this->log($event, $context, 'error');\n    }\n\n    \/**\n     * Log a warning event.\n     *\/\n    public function logWarning(string $event, string $message, array $context = []): void\n    {\n        $context['warning_message'] = $message;\n        $this->log($event, $context, 'warning');\n    }\n\n    \/**\n     * Log debug information (only in development).\n     *\/\n    public function debug(string $event, array $context = []): void\n    {\n        \/\/ Only log debug in development\n        $appEnv = $_ENV['APP_ENV'] ?? 'production';\n        if ($appEnv === 'development') {\n            $this->log($event, $context, 'debug');\n        }\n    }\n\n    \/**\n     * Get the current user ID from session.\n     *\/\n    private function getUserId(): ?int\n    {\n        return isset($_SESSION['user_id']) ? (int) $_SESSION['user_id'] : null;\n    }\n\n    \/**\n     * Get the client IP address.\n     *\/\n    private function getIpAddress(): ?string\n    {\n        return $_SERVER['HTTP_X_FORWARDED_FOR']\n            ?? $_SERVER['HTTP_X_REAL_IP']\n            ?? $_SERVER['REMOTE_ADDR']\n            ?? null;\n    }\n\n    \/**\n     * Query logs by correlation ID.\n     *\n     * @return array<int, array<string, mixed>>\n     *\/\n    public function getByCorrelationId(string $correlationId): array\n    {\n        $stmt = $this->db->prepare('\n            SELECT * FROM audit_log\n            WHERE correlation_id = ?\n            ORDER BY created_at ASC\n        ');\n        $stmt->execute([$correlationId]);\n\n        return $stmt->fetchAll(PDO::FETCH_ASSOC);\n    }\n\n    \/**\n     * Query recent logs for an entity.\n     *\n     * @return array<int, array<string, mixed>>\n     *\/\n    public function getByEntity(string $entityType, int $entityId, int $limit = 50): array\n    {\n        $stmt = $this->db->prepare('\n            SELECT * FROM audit_log\n            WHERE entity_type = ? AND entity_id = ?\n            ORDER BY created_at DESC\n            LIMIT ?\n        ');\n        $stmt->execute([$entityType, $entityId, $limit]);\n\n        return $stmt->fetchAll(PDO::FETCH_ASSOC);\n    }\n}\n",
        "structuredPatch": [
            {
                "oldStart": 6,
                "oldLines": 7,
                "newStart": 6,
                "newLines": 6,
                "lines": [
                    " ",
                    " \/\/ @responsibility: Audit-Logging mit Correlation-ID und strukturiertem Kontext",
                    " ",
                    "-use Infrastructure\\Config\\DatabaseFactory;",
                    " use PDO;",
                    " ",
                    " final class AuditLogger"
                ]
            },
            {
                "oldStart": 16,
                "oldLines": 14,
                "newStart": 15,
                "newLines": 13,
                "lines": [
                    " ",
                    "     private const LOG_LEVELS = ['debug', 'info', 'warning', 'error'];",
                    " ",
                    "-    public function __construct(?string $correlationId = null)",
                    "+    public function __construct(PDO $pdo, ?string $correlationId = null)",
                    "     {",
                    "+        $this->db = $pdo;",
                    "         $this->correlationId = $correlationId",
                    "             ?? $_SERVER['HTTP_X_CORRELATION_ID']",
                    "             ?? $_SERVER['CORRELATION_ID']",
                    "             ?? $this->generateCorrelationId();",
                    "-",
                    "-        $this->db = DatabaseFactory::dev();",
                    "     }",
                    " ",
                    "     \/**"
                ]
            }
        ],
        "userModified": false,
        "replaceAll": false
    }
}
← Vorheriger Zur Liste Nächster →