Improve AI daily report operations and dedupe observability
This commit is contained in:
@@ -5,6 +5,7 @@ import socket
|
||||
import time
|
||||
from dataclasses import dataclass
|
||||
from urllib.error import HTTPError, URLError
|
||||
from urllib.parse import urlencode
|
||||
import urllib.request
|
||||
from typing import Any
|
||||
|
||||
@@ -115,17 +116,49 @@ class BlogApiClient:
|
||||
def create_post(self, payload: dict[str, Any]) -> dict[str, Any]:
|
||||
return self._request("POST", "/api/service/posts", payload)
|
||||
|
||||
def get_post_by_slug(self, slug: str) -> dict[str, Any] | None:
|
||||
def _normalize_post_response(self, value: Any, slug: str) -> dict[str, Any] | None:
|
||||
if isinstance(value, dict):
|
||||
if isinstance(value.get("post"), dict):
|
||||
value = value["post"]
|
||||
elif isinstance(value.get("data"), dict):
|
||||
value = value["data"]
|
||||
elif isinstance(value.get("items"), list):
|
||||
for item in value["items"]:
|
||||
if isinstance(item, dict) and item.get("slug") == slug:
|
||||
return item
|
||||
return None
|
||||
if value.get("slug") == slug or value.get("id") or value.get("content") or value.get("markdown"):
|
||||
return value
|
||||
if isinstance(value, list):
|
||||
for item in value:
|
||||
if isinstance(item, dict) and item.get("slug") == slug:
|
||||
return item
|
||||
return None
|
||||
|
||||
def _request_optional(self, method: str, path: str, payload: dict[str, Any] | None = None) -> dict[str, Any] | list[Any] | None:
|
||||
try:
|
||||
return self._request("GET", f"/api/service/posts/{slug}")
|
||||
return self._request(method, path, payload)
|
||||
except HTTPError as exc:
|
||||
if exc.code == 404:
|
||||
if exc.code in {403, 404}:
|
||||
return None
|
||||
raise
|
||||
except FetchTextError as exc:
|
||||
if exc.error_type == "http_404":
|
||||
if exc.error_type in {"http_403", "http_404"}:
|
||||
return None
|
||||
raise
|
||||
|
||||
def get_post_by_slug(self, slug: str) -> dict[str, Any] | None:
|
||||
paths = [
|
||||
f"/api/service/posts/{slug}",
|
||||
f"/api/service/posts?{urlencode({'slug': slug})}",
|
||||
f"/api/service/posts/slug/{slug}",
|
||||
]
|
||||
for path in paths:
|
||||
value = self._request_optional("GET", path)
|
||||
post = self._normalize_post_response(value, slug)
|
||||
if post is not None:
|
||||
return post
|
||||
return None
|
||||
|
||||
def publish_post(self, slug: str) -> None:
|
||||
self._request("POST", f"/api/service/posts/{slug}/publish")
|
||||
|
||||
Reference in New Issue
Block a user