extend ComicDetailsResponse

This commit is contained in:
Thomas Peetz
2025-10-02 14:18:48 +02:00
parent d8e4cbfb9a
commit a9829bf118
7 changed files with 43 additions and 15 deletions
+2 -2
View File
@@ -10,7 +10,7 @@ from src.schema.comics.comic import ComicResponse
from src.schema.comics.artist import ArtistCreation, ArtistResponse from src.schema.comics.artist import ArtistCreation, ArtistResponse
from src.db.models.comic import Comic, Artist, Issue from src.db.models.comic import Comic, Artist, Issue
from src.schema.comics.comic_details import ComicDetailsResponse from src.schema.comics.comic_details import ComicDetailsResponse
from src.schema.comics.issue import IssueDetailsResponse from src.schema.comics.issue_details import IssueDetailsResponse
router = APIRouter() router = APIRouter()
@@ -59,7 +59,7 @@ def add_artist(db: SessionDep, artist_creation: ArtistCreation) -> ArtistRespons
db.commit() db.commit()
except: except:
raise HTTPException(status_code=409, detail="Artist already added") raise HTTPException(status_code=409, detail="Artist already added")
response = ArtistResponse(id=artist.id, name=artist.name) response = ArtistResponse(id=artist.id, name=str(artist.name))
return response return response
@router.get("/issues", response_model=List[IssueDetailsResponse]) @router.get("/issues", response_model=List[IssueDetailsResponse])
+16 -5
View File
@@ -7,7 +7,9 @@ from src.db.models.comic import Comic, Issue
from src.schema.comics.artist import ArtistResponse from src.schema.comics.artist import ArtistResponse
from src.schema.comics.comic import ComicResponse, ComicSchema from src.schema.comics.comic import ComicResponse, ComicSchema
from src.schema.comics.comic_details import ComicDetailsResponse, ComicWorktypeArtistResponse from src.schema.comics.comic_details import ComicDetailsResponse, ComicWorktypeArtistResponse
from src.schema.comics.issue import IssueDetailsResponse from src.schema.comics.issue import IssueResponse
from src.schema.comics.issue_details import IssueDetailsResponse
from src.schema.comics.publisher import PublisherResponse
from src.schema.comics.volume import VolumeResponse from src.schema.comics.volume import VolumeResponse
from src.schema.comics.worktype import WorktypeResponse from src.schema.comics.worktype import WorktypeResponse
@@ -23,8 +25,8 @@ def get_issue_details(issue: Issue) -> IssueDetailsResponse:
issue_number=str(issue.issue_number), issue_number=str(issue.issue_number),
in_stock=bool(issue.in_stock), in_stock=bool(issue.in_stock),
is_read=bool(issue.is_read), is_read=bool(issue.is_read),
comic_id=str(issue.comic_id), comic=ComicResponse(id=issue.comic.id, title=issue.comic.title, completed=issue.comic.completed),
volume_id=str(issue.volume_id) volume=VolumeResponse(id=issue.volume.id, name=issue.volume.name)
) )
return response return response
@@ -46,6 +48,14 @@ def get_comic_details(comic: Comic) -> ComicDetailsResponse:
volumes: List[VolumeResponse] = [] volumes: List[VolumeResponse] = []
for volume in comic.volumes: for volume in comic.volumes:
volumes.append(VolumeResponse(id=volume.id, name=volume.name)) volumes.append(VolumeResponse(id=volume.id, name=volume.name))
issues: List[IssueResponse] = []
for issue in comic.issues:
issues.append(IssueResponse(
id=issue.id,
issue_number=issue.issue_number,
in_stock=issue.in_stock,
is_read=issue.is_read
))
works: List[ComicWorktypeArtistResponse] = [] works: List[ComicWorktypeArtistResponse] = []
works_map: Dict[str, ComicWorktypeArtistResponse] = {} works_map: Dict[str, ComicWorktypeArtistResponse] = {}
for work in comic.comic_works: for work in comic.comic_works:
@@ -63,13 +73,14 @@ def get_comic_details(comic: Comic) -> ComicDetailsResponse:
for value in works_map.values(): for value in works_map.values():
works.append(value) works.append(value)
response = ComicDetailsResponse( response = ComicDetailsResponse(
id=comic.id, id=str(comic.id),
created=str(comic.created_date), created=str(comic.created_date),
title=str(comic.title), title=str(comic.title),
completed=bool(comic.completed), completed=bool(comic.completed),
current_order=bool(comic.current_order), current_order=bool(comic.current_order),
weblink=str(comic.weblink), weblink=str(comic.weblink),
publisher=comic.publisher.name, publisher=PublisherResponse(id=comic.publisher.id, name=comic.publisher.name),
issues=issues,
volumes=volumes, volumes=volumes,
works=works works=works
) )
@@ -2,7 +2,7 @@ from typing import List
from pydantic import BaseModel from pydantic import BaseModel
from src.schema.comics.comic import ComicResponse from src.schema.comics.comic import ComicResponse
from src.schema.comics.issue import IssueDetailsResponse from src.schema.comics.issue_details import IssueDetailsResponse
from src.schema.comics.worktype import WorktypeResponse from src.schema.comics.worktype import WorktypeResponse
@@ -2,6 +2,8 @@ from typing import List
from pydantic import BaseModel from pydantic import BaseModel
from src.schema.comics.artist import ArtistResponse from src.schema.comics.artist import ArtistResponse
from src.schema.comics.issue import IssueResponse
from src.schema.comics.publisher import PublisherResponse
from src.schema.comics.volume import VolumeResponse from src.schema.comics.volume import VolumeResponse
from src.schema.comics.worktype import WorktypeResponse from src.schema.comics.worktype import WorktypeResponse
@@ -18,6 +20,7 @@ class ComicDetailsResponse(BaseModel):
completed : bool completed : bool
current_order : bool current_order : bool
weblink: str weblink: str
publisher: str publisher: PublisherResponse
issues: List[IssueResponse]
volumes: List[VolumeResponse] volumes: List[VolumeResponse]
works: List[ComicWorktypeArtistResponse] works: List[ComicWorktypeArtistResponse]
+1 -6
View File
@@ -1,13 +1,8 @@
from pydantic import BaseModel from pydantic import BaseModel
from src.schema.comics.comic import ComicResponse
from src.schema.comics.volume import VolumeResponse
class IssueResponse(BaseModel):
class IssueDetailsResponse(BaseModel):
id: str id: str
issue_number: str issue_number: str
in_stock: bool in_stock: bool
is_read: bool is_read: bool
comic: ComicResponse
volume: VolumeResponse | None
@@ -0,0 +1,13 @@
from pydantic import BaseModel
from src.schema.comics.comic import ComicResponse
from src.schema.comics.volume import VolumeResponse
class IssueDetailsResponse(BaseModel):
id: str
issue_number: str
in_stock: bool
is_read: bool
comic: ComicResponse
volume: VolumeResponse | None
@@ -0,0 +1,6 @@
from pydantic import BaseModel
class PublisherResponse(BaseModel):
id: str
name: str