from datetime import datetime from fastapi import APIRouter, Depends, HTTPException from api.dependency import get_post_service, get_project_id from api.endpoints.auth import get_current_user from api.service.post_service import PostService from api.models import PostRequest, PostCreateRequest, PostUpdateRequest, AddGenerationsRequest from models.Post import Post router = APIRouter(prefix="/api/posts", tags=["posts"]) @router.post("", response_model=Post) async def create_post( request: PostCreateRequest, project_id: str | None = Depends(get_project_id), current_user: dict = Depends(get_current_user), post_service: PostService = Depends(get_post_service), ): pid = project_id or request.project_id return await post_service.create_post( date=request.date, topic=request.topic, generation_ids=request.generation_ids, project_id=pid, user_id=str(current_user["_id"]), ) @router.get("", response_model=list[Post]) async def get_posts( project_id: str | None = Depends(get_project_id), limit: int = 200, offset: int = 0, date_from: datetime | None = None, date_to: datetime | None = None, current_user: dict = Depends(get_current_user), post_service: PostService = Depends(get_post_service), ): return await post_service.get_posts(project_id, str(current_user["_id"]), limit, offset, date_from, date_to) @router.get("/{post_id}", response_model=Post) async def get_post( post_id: str, post_service: PostService = Depends(get_post_service), ): post = await post_service.get_post(post_id) if not post: raise HTTPException(status_code=404, detail="Post not found") return post @router.put("/{post_id}", response_model=Post) async def update_post( post_id: str, request: PostUpdateRequest, post_service: PostService = Depends(get_post_service), ): post = await post_service.update_post(post_id, date=request.date, topic=request.topic) if not post: raise HTTPException(status_code=404, detail="Post not found") return post @router.delete("/{post_id}") async def delete_post( post_id: str, post_service: PostService = Depends(get_post_service), ): success = await post_service.delete_post(post_id) if not success: raise HTTPException(status_code=404, detail="Post not found or could not be deleted") return {"status": "success"} @router.post("/{post_id}/generations") async def add_generations( post_id: str, request: AddGenerationsRequest, post_service: PostService = Depends(get_post_service), ): success = await post_service.add_generations(post_id, request.generation_ids) if not success: raise HTTPException(status_code=404, detail="Post not found") return {"status": "success"} @router.delete("/{post_id}/generations/{generation_id}") async def remove_generation( post_id: str, generation_id: str, post_service: PostService = Depends(get_post_service), ): success = await post_service.remove_generation(post_id, generation_id) if not success: raise HTTPException(status_code=404, detail="Post not found or generation not linked") return {"status": "success"}