feat: Add album management functionality with new data model, repository, service, API, and generation integration.
This commit is contained in:
81
api/endpoints/album_router.py
Normal file
81
api/endpoints/album_router.py
Normal file
@@ -0,0 +1,81 @@
|
||||
from typing import List, Optional
|
||||
from fastapi import APIRouter, Depends, HTTPException, status, Request
|
||||
from pydantic import BaseModel
|
||||
|
||||
from api.models.GenerationRequest import GenerationResponse
|
||||
from models.Album import Album
|
||||
from repos.dao import DAO
|
||||
|
||||
router = APIRouter(prefix="/api/albums", tags=["Albums"])
|
||||
|
||||
class AlbumCreateRequest(BaseModel):
|
||||
name: str
|
||||
description: Optional[str] = None
|
||||
|
||||
class AlbumUpdateRequest(BaseModel):
|
||||
name: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
|
||||
class AlbumResponse(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
description: Optional[str] = None
|
||||
generation_ids: List[str] = []
|
||||
cover_asset_id: Optional[str] = None # Not implemented yet
|
||||
|
||||
@router.post("/", response_model=AlbumResponse)
|
||||
async def create_album(request: Request, album_in: AlbumCreateRequest):
|
||||
service: AlbumService = request.app.state.album_service
|
||||
album = await service.create_album(name=album_in.name, description=album_in.description)
|
||||
return AlbumResponse(**album.model_dump())
|
||||
|
||||
@router.get("/", response_model=List[AlbumResponse])
|
||||
async def get_albums(request: Request, limit: int = 10, offset: int = 0):
|
||||
service: AlbumService = request.app.state.album_service
|
||||
albums = await service.get_albums(limit=limit, offset=offset)
|
||||
return [AlbumResponse(**album.model_dump()) for album in albums]
|
||||
|
||||
@router.get("/{album_id}", response_model=AlbumResponse)
|
||||
async def get_album(request: Request, album_id: str):
|
||||
service: AlbumService = request.app.state.album_service
|
||||
album = await service.get_album(album_id)
|
||||
if not album:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Album not found")
|
||||
return AlbumResponse(**album.model_dump())
|
||||
|
||||
@router.put("/{album_id}", response_model=AlbumResponse)
|
||||
async def update_album(request: Request, album_id: str, album_in: AlbumUpdateRequest):
|
||||
service: AlbumService = request.app.state.album_service
|
||||
album = await service.update_album(album_id, name=album_in.name, description=album_in.description)
|
||||
if not album:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Album not found")
|
||||
return AlbumResponse(**album.model_dump())
|
||||
|
||||
@router.delete("/{album_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
async def delete_album(request: Request, album_id: str):
|
||||
service: AlbumService = request.app.state.album_service
|
||||
deleted = await service.delete_album(album_id)
|
||||
if not deleted:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Album not found")
|
||||
|
||||
@router.post("/{album_id}/generations/{generation_id}")
|
||||
async def add_generation_to_album(request: Request, album_id: str, generation_id: str):
|
||||
service: AlbumService = request.app.state.album_service
|
||||
success = await service.add_generation_to_album(album_id, generation_id)
|
||||
if not success:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Album or Generation not found")
|
||||
return {"status": "success"}
|
||||
|
||||
@router.delete("/{album_id}/generations/{generation_id}")
|
||||
async def remove_generation_from_album(request: Request, album_id: str, generation_id: str):
|
||||
service: AlbumService = request.app.state.album_service
|
||||
success = await service.remove_generation_from_album(album_id, generation_id)
|
||||
if not success:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Album or Generation not found")
|
||||
return {"status": "success"}
|
||||
|
||||
@router.get("/{album_id}/generations", response_model=List[GenerationResponse])
|
||||
async def get_album_generations(request: Request, album_id: str, limit: int = 10, offset: int = 0):
|
||||
service: AlbumService = request.app.state.album_service
|
||||
generations = await service.get_generations_by_album(album_id, limit=limit, offset=offset)
|
||||
return [GenerationResponse(**gen.model_dump()) for gen in generations]
|
||||
Reference in New Issue
Block a user