Add requests errors in db and api

This commit is contained in:
2025-12-04 12:17:47 +01:00
parent b11ac95d23
commit 0f50c100cf
5 changed files with 34 additions and 9 deletions

View File

@@ -18,6 +18,7 @@ create table scanner.requests(
external_id jsonb not null default '{}'::jsonb,
videos jsonb not null default '[]'::jsonb,
status scanner.request_status not null default 'pending',
error jsonb,
started_at timestamptz,
created_at timestamptz not null default now()::timestamptz,
constraint unique_kty unique nulls not distinct (kind, title, year)

View File

@@ -3,7 +3,7 @@ from logging import getLogger
from types import TracebackType
from typing import Literal
from aiohttp import ClientSession
from aiohttp import ClientResponse, ClientResponseError, ClientSession
from pydantic import TypeAdapter
from .models.movie import Movie
@@ -38,9 +38,19 @@ class KyooClient(metaclass=Singleton):
):
await self._client.close()
async def raise_for_status(self, r: ClientResponse):
if r.status >= 400:
raise ClientResponseError(
r.request_info,
r.history,
status=r.status,
message=await r.text(),
headers=r.headers,
)
async def get_videos_info(self) -> VideoInfo:
async with self._client.get("videos") as r:
r.raise_for_status()
await self.raise_for_status(r)
return VideoInfo(**await r.json())
async def create_videos(self, videos: list[Video]) -> list[VideoCreated]:
@@ -48,7 +58,7 @@ class KyooClient(metaclass=Singleton):
"videos",
data=TypeAdapter(list[Video]).dump_json(videos, by_alias=True),
) as r:
r.raise_for_status()
await self.raise_for_status(r)
return TypeAdapter(list[VideoCreated]).validate_json(await r.text())
async def delete_videos(self, videos: list[str] | set[str]):
@@ -56,14 +66,14 @@ class KyooClient(metaclass=Singleton):
"videos",
data=TypeAdapter(list[str] | set[str]).dump_json(videos, by_alias=True),
) as r:
r.raise_for_status()
await self.raise_for_status(r)
async def create_movie(self, movie: Movie) -> Resource:
async with self._client.post(
"movies",
data=movie.model_dump_json(by_alias=True),
) as r:
r.raise_for_status()
await self.raise_for_status(r)
return Resource.model_validate(await r.json())
async def create_serie(self, serie: Serie) -> Resource:
@@ -71,7 +81,7 @@ class KyooClient(metaclass=Singleton):
"series",
data=serie.model_dump_json(by_alias=True),
) as r:
r.raise_for_status()
await self.raise_for_status(r)
return Resource.model_validate(await r.json())
async def link_videos(
@@ -100,4 +110,4 @@ class KyooClient(metaclass=Singleton):
by_alias=True,
),
) as r:
r.raise_for_status()
await self.raise_for_status(r)

View File

@@ -1,6 +1,6 @@
from __future__ import annotations
from datetime import datetime
from typing import Literal
from typing import Any, Literal
from pydantic import Field
@@ -31,4 +31,5 @@ class RequestRet(Model):
"running",
"failed",
]
error: dict[str, Any] | None
started_at: datetime | None

View File

@@ -1,5 +1,6 @@
from asyncio import CancelledError, Event, TaskGroup
from logging import getLogger
from traceback import TracebackException
from typing import cast
from asyncpg import Connection, Pool
@@ -161,11 +162,22 @@ class RequestProcessor:
update
scanner.requests
set
status = 'failed'
status = 'failed',
error = $2
where
pk = $1
""",
request.pk,
{
"title": type(e).__name__,
"message": str(e),
"traceback": [
line
for part in TracebackException.from_exception(e).format()
for line in part.split("\n")
if line.strip()
],
},
)
return True

View File

@@ -28,6 +28,7 @@ class StatusService:
title,
year,
status,
error,
started_at
from
scanner.requests