{
"event": "PreToolUse",
"tool_name": "Edit",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Domain\/ValueObject\/Pagination.php",
"old_string": " \/**\n * Create pagination using RequestParams provider.\n * This is infrastructure-agnostic by accepting a callable.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n * @param callable(string, int): int $paramProvider Function to get int params\n *\/\n public static function fromParams(\n int $defaultLimit = 50,\n int $maxLimit = 100,\n ?callable $paramProvider = null\n ): self {\n \/\/ Default provider uses global request context if no provider given\n if ($paramProvider === null) {\n $paramProvider = static function (string $key, int $default): int {\n return $default;\n };\n }\n\n $page = max(1, $paramProvider('page', 1));\n $limit = min($maxLimit, max(1, $paramProvider('limit', $defaultLimit)));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }\n\n \/**\n * Create pagination from request parameters.\n * Convenience method for controllers.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n *\/\n public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self\n {\n return self::fromParams($defaultLimit, $maxLimit, static function (string $key, int $default): int {\n $value = filter_input(INPUT_GET, $key, FILTER_VALIDATE_INT);\n\n return $value !== false && $value !== null ? $value : $default;\n });\n }",
"new_string": ""
}
}
{
"tool_response": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Domain\/ValueObject\/Pagination.php",
"oldString": " \/**\n * Create pagination using RequestParams provider.\n * This is infrastructure-agnostic by accepting a callable.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n * @param callable(string, int): int $paramProvider Function to get int params\n *\/\n public static function fromParams(\n int $defaultLimit = 50,\n int $maxLimit = 100,\n ?callable $paramProvider = null\n ): self {\n \/\/ Default provider uses global request context if no provider given\n if ($paramProvider === null) {\n $paramProvider = static function (string $key, int $default): int {\n return $default;\n };\n }\n\n $page = max(1, $paramProvider('page', 1));\n $limit = min($maxLimit, max(1, $paramProvider('limit', $defaultLimit)));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }\n\n \/**\n * Create pagination from request parameters.\n * Convenience method for controllers.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n *\/\n public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self\n {\n return self::fromParams($defaultLimit, $maxLimit, static function (string $key, int $default): int {\n $value = filter_input(INPUT_GET, $key, FILTER_VALIDATE_INT);\n\n return $value !== false && $value !== null ? $value : $default;\n });\n }",
"newString": "",
"originalFile": "<?php\n\nnamespace Domain\\ValueObject;\n\n\/**\n * Pagination Value Object for consistent pagination handling.\n *\n * Immutable object that encapsulates pagination logic.\n * Use fromRequest() for creating from HTTP request parameters.\n *\/\nfinal class Pagination\n{\n public function __construct(\n public readonly int $page,\n public readonly int $limit,\n public readonly int $offset,\n public readonly int $totalCount = 0\n ) {\n }\n\n \/**\n * Create pagination from page and limit values.\n *\n * @param int $page Current page number (1-based)\n * @param int $limit Items per page\n * @param int $maxLimit Maximum allowed limit\n *\/\n public static function create(int $page = 1, int $limit = 50, int $maxLimit = 100): self\n {\n $page = max(1, $page);\n $limit = min($maxLimit, max(1, $limit));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }\n\n \/**\n * Create pagination using RequestParams provider.\n * This is infrastructure-agnostic by accepting a callable.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n * @param callable(string, int): int $paramProvider Function to get int params\n *\/\n public static function fromParams(\n int $defaultLimit = 50,\n int $maxLimit = 100,\n ?callable $paramProvider = null\n ): self {\n \/\/ Default provider uses global request context if no provider given\n if ($paramProvider === null) {\n $paramProvider = static function (string $key, int $default): int {\n return $default;\n };\n }\n\n $page = max(1, $paramProvider('page', 1));\n $limit = min($maxLimit, max(1, $paramProvider('limit', $defaultLimit)));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }\n\n \/**\n * Create pagination from request parameters.\n * Convenience method for controllers.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n *\/\n public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self\n {\n return self::fromParams($defaultLimit, $maxLimit, static function (string $key, int $default): int {\n $value = filter_input(INPUT_GET, $key, FILTER_VALIDATE_INT);\n\n return $value !== false && $value !== null ? $value : $default;\n });\n }\n\n \/**\n * Create new instance with total count set.\n *\/\n public function withTotal(int $count): self\n {\n return new self($this->page, $this->limit, $this->offset, $count);\n }\n\n \/**\n * Calculate total number of pages.\n *\/\n public function totalPages(): int\n {\n if ($this->totalCount === 0) {\n return 0;\n }\n\n return (int) ceil($this->totalCount \/ $this->limit);\n }\n\n \/**\n * Check if there is a next page.\n *\/\n public function hasNextPage(): bool\n {\n return $this->page < $this->totalPages();\n }\n\n \/**\n * Check if there is a previous page.\n *\/\n public function hasPrevPage(): bool\n {\n return $this->page > 1;\n }\n\n \/**\n * Get next page number (or current if at last page).\n *\/\n public function nextPage(): int\n {\n return $this->hasNextPage() ? $this->page + 1 : $this->page;\n }\n\n \/**\n * Get previous page number (or 1 if at first page).\n *\/\n public function prevPage(): int\n {\n return $this->hasPrevPage() ? $this->page - 1 : 1;\n }\n\n \/**\n * Get range of visible page numbers for pagination UI.\n *\n * @param int $range Number of pages to show around current page\n * @return array<int>\n *\/\n public function getPageRange(int $range = 2): array\n {\n $totalPages = $this->totalPages();\n\n if ($totalPages === 0) {\n return [];\n }\n\n $start = max(1, $this->page - $range);\n $end = min($totalPages, $this->page + $range);\n\n return range($start, $end);\n }\n\n \/**\n * Convert to array for template usage.\n *\n * @return array{page: int, limit: int, offset: int, totalCount: int, totalPages: int, hasNext: bool, hasPrev: bool}\n *\/\n public function toArray(): array\n {\n return [\n 'page' => $this->page,\n 'limit' => $this->limit,\n 'offset' => $this->offset,\n 'totalCount' => $this->totalCount,\n 'totalPages' => $this->totalPages(),\n 'hasNext' => $this->hasNextPage(),\n 'hasPrev' => $this->hasPrevPage(),\n ];\n }\n}\n",
"structuredPatch": [
{
"oldStart": 33,
"oldLines": 49,
"newStart": 33,
"newLines": 8,
"lines": [
" return new self($page, $limit, ($page - 1) * $limit);",
" }",
" ",
"- \/**",
"- * Create pagination using RequestParams provider.",
"- * This is infrastructure-agnostic by accepting a callable.",
"- *",
"- * @param int $defaultLimit Default items per page",
"- * @param int $maxLimit Maximum allowed limit",
"- * @param callable(string, int): int $paramProvider Function to get int params",
"- *\/",
"- public static function fromParams(",
"- int $defaultLimit = 50,",
"- int $maxLimit = 100,",
"- ?callable $paramProvider = null",
"- ): self {",
"- \/\/ Default provider uses global request context if no provider given",
"- if ($paramProvider === null) {",
"- $paramProvider = static function (string $key, int $default): int {",
"- return $default;",
"- };",
"- }",
" ",
"- $page = max(1, $paramProvider('page', 1));",
"- $limit = min($maxLimit, max(1, $paramProvider('limit', $defaultLimit)));",
"-",
"- return new self($page, $limit, ($page - 1) * $limit);",
"- }",
"-",
" \/**",
"- * Create pagination from request parameters.",
"- * Convenience method for controllers.",
"- *",
"- * @param int $defaultLimit Default items per page",
"- * @param int $maxLimit Maximum allowed limit",
"- *\/",
"- public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self",
"- {",
"- return self::fromParams($defaultLimit, $maxLimit, static function (string $key, int $default): int {",
"- $value = filter_input(INPUT_GET, $key, FILTER_VALIDATE_INT);",
"-",
"- return $value !== false && $value !== null ? $value : $default;",
"- });",
"- }",
"-",
"- \/**",
" * Create new instance with total count set.",
" *\/",
" public function withTotal(int $count): self"
]
}
],
"userModified": false,
"replaceAll": false
}
}