Protokoll #33527

ID33527
Zeitstempel2026-04-21 02:37:56.789353
Clientroot
IP62.246.34.195
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens1,237 (Input: 613, Output: 624)
Dauer79 ms
Request-Zeit2026-04-21 02:37:56.789353
Response-Zeit2026-04-21 02:37:56.868017

Request

{
    "event": "PreToolUse",
    "tool_name": "Write",
    "tool_input": {
        "file_path": "\/var\/www\/dev.campus.systemische-tools.de\/crawler\/src\/application\/use_cases\/recheck_external_links.py",
        "content": "from __future__ import annotations\n\nfrom src.application.use_cases.check_external_link import CheckExternalLinkUseCase\nfrom src.domain.entities.link import Link\nfrom src.domain.ports.link_repository_port import LinkRepositoryPort\nfrom src.domain.ports.page_repository_port import PageRepositoryPort\n\nPAGE_FETCH_CHUNK = 500\n\n\nclass RecheckExternalLinksUseCase:\n    def __init__(\n        self,\n        *,\n        pages: PageRepositoryPort,\n        links: LinkRepositoryPort,\n        checker: CheckExternalLinkUseCase,\n    ) -> None:\n        self._pages = pages\n        self._links = links\n        self._checker = checker\n\n    async def execute(self, *, crawl_id: int) -> int:\n        rechecked = 0\n        for page in self._iter_pages(crawl_id):\n            assert page.id is not None\n            for link in self._links.list_by_page(page.id):\n                if not link.is_external:\n                    continue\n                rechecked += await self._update_link(link)\n        return rechecked\n\n    async def _update_link(self, link: Link) -> int:\n        assert link.id is not None\n        result = await self._checker.execute(link.target_url)\n        updated = Link(\n            id=link.id,\n            page_id=link.page_id,\n            source_url_id=link.source_url_id,\n            target_url=link.target_url,\n            target_url_id=link.target_url_id,\n            anchor_text=link.anchor_text,\n            rel=link.rel,\n            is_internal=link.is_internal,\n            is_external=link.is_external,\n            position_hint=link.position_hint,\n            external_http_status=result.http_status,\n            external_final_url=result.final_url,\n            external_checked_at=result.checked_at,\n            external_error=result.error,\n        )\n        self._links.update_external_check(link.id, updated)\n        return 1\n\n    def _iter_pages(self, crawl_id: int) -> list[object]:\n        collected: list[object] = []\n        offset = 0\n        while True:\n            batch = self._pages.list_by_crawl(crawl_id, limit=PAGE_FETCH_CHUNK, offset=offset)\n            if not batch:\n                return collected\n            collected.extend(batch)\n            offset += len(batch)\n"
    }
}

Response

{
    "tool_response": {
        "type": "create",
        "filePath": "\/var\/www\/dev.campus.systemische-tools.de\/crawler\/src\/application\/use_cases\/recheck_external_links.py",
        "content": "from __future__ import annotations\n\nfrom src.application.use_cases.check_external_link import CheckExternalLinkUseCase\nfrom src.domain.entities.link import Link\nfrom src.domain.ports.link_repository_port import LinkRepositoryPort\nfrom src.domain.ports.page_repository_port import PageRepositoryPort\n\nPAGE_FETCH_CHUNK = 500\n\n\nclass RecheckExternalLinksUseCase:\n    def __init__(\n        self,\n        *,\n        pages: PageRepositoryPort,\n        links: LinkRepositoryPort,\n        checker: CheckExternalLinkUseCase,\n    ) -> None:\n        self._pages = pages\n        self._links = links\n        self._checker = checker\n\n    async def execute(self, *, crawl_id: int) -> int:\n        rechecked = 0\n        for page in self._iter_pages(crawl_id):\n            assert page.id is not None\n            for link in self._links.list_by_page(page.id):\n                if not link.is_external:\n                    continue\n                rechecked += await self._update_link(link)\n        return rechecked\n\n    async def _update_link(self, link: Link) -> int:\n        assert link.id is not None\n        result = await self._checker.execute(link.target_url)\n        updated = Link(\n            id=link.id,\n            page_id=link.page_id,\n            source_url_id=link.source_url_id,\n            target_url=link.target_url,\n            target_url_id=link.target_url_id,\n            anchor_text=link.anchor_text,\n            rel=link.rel,\n            is_internal=link.is_internal,\n            is_external=link.is_external,\n            position_hint=link.position_hint,\n            external_http_status=result.http_status,\n            external_final_url=result.final_url,\n            external_checked_at=result.checked_at,\n            external_error=result.error,\n        )\n        self._links.update_external_check(link.id, updated)\n        return 1\n\n    def _iter_pages(self, crawl_id: int) -> list[object]:\n        collected: list[object] = []\n        offset = 0\n        while True:\n            batch = self._pages.list_by_crawl(crawl_id, limit=PAGE_FETCH_CHUNK, offset=offset)\n            if not batch:\n                return collected\n            collected.extend(batch)\n            offset += len(batch)\n",
        "structuredPatch": [],
        "originalFile": null,
        "userModified": false
    }
}
← Vorheriger Zur Liste Nächster →