96 lines
3.8 KiB
Python
96 lines
3.8 KiB
Python
from typing import List, Optional
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from api.dependency import get_inspiration_service, get_project_id
|
|
from api.endpoints.auth import get_current_user
|
|
from api.models.InspirationRequest import InspirationCreateRequest, InspirationResponse, InspirationListResponse
|
|
from api.service.inspiration_service import InspirationService
|
|
from models.Inspiration import Inspiration
|
|
|
|
router = APIRouter(prefix="/api/inspirations", tags=["Inspirations"])
|
|
|
|
|
|
@router.post("", response_model=InspirationResponse, status_code=status.HTTP_201_CREATED)
|
|
async def create_inspiration(
|
|
request: InspirationCreateRequest,
|
|
project_id: Optional[str] = Depends(get_project_id),
|
|
current_user: dict = Depends(get_current_user),
|
|
service: InspirationService = Depends(get_inspiration_service)
|
|
):
|
|
pid = project_id or request.project_id
|
|
|
|
inspiration = await service.create_inspiration(
|
|
source_url=request.source_url,
|
|
created_by=str(current_user["_id"]),
|
|
project_id=pid,
|
|
caption=request.caption
|
|
)
|
|
return inspiration
|
|
|
|
|
|
@router.get("", response_model=InspirationListResponse)
|
|
async def get_inspirations(
|
|
project_id: Optional[str] = Depends(get_project_id),
|
|
limit: int = 20,
|
|
offset: int = 0,
|
|
current_user: dict = Depends(get_current_user),
|
|
service: InspirationService = Depends(get_inspiration_service)
|
|
):
|
|
# If project_id is provided, filter by it. Otherwise, filter by user.
|
|
# Or maybe we want to see all user's inspirations if no project is selected?
|
|
# Let's follow the pattern: if project_id is present, show project's inspirations.
|
|
# If not, show user's personal inspirations (where project_id is None) OR all user's inspirations?
|
|
# Usually "My Inspirations" means created by me.
|
|
|
|
# Let's assume:
|
|
# If project_id -> filter by project_id (and maybe created_by if we want strict ownership, but usually project members share)
|
|
# If no project_id -> filter by created_by (personal)
|
|
|
|
pid = project_id
|
|
uid = str(current_user["_id"])
|
|
|
|
inspirations = await service.get_inspirations(project_id=pid, created_by=uid if not pid else None, limit=limit, offset=offset)
|
|
total_count = await service.dao.inspirations.count_inspirations(project_id=pid, created_by=uid if not pid else None)
|
|
|
|
return InspirationListResponse(
|
|
inspirations=[InspirationResponse(**inspiration.model_dump()) for inspiration in inspirations],
|
|
total_count=total_count
|
|
)
|
|
|
|
|
|
@router.get("/{inspiration_id}", response_model=InspirationResponse)
|
|
async def get_inspiration(
|
|
inspiration_id: str,
|
|
service: InspirationService = Depends(get_inspiration_service),
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
inspiration = await service.get_inspiration(inspiration_id)
|
|
if not inspiration:
|
|
raise HTTPException(status_code=404, detail="Inspiration not found")
|
|
return inspiration
|
|
|
|
|
|
@router.patch("/{inspiration_id}/complete", response_model=InspirationResponse)
|
|
async def mark_inspiration_complete(
|
|
inspiration_id: str,
|
|
is_completed: bool = True,
|
|
service: InspirationService = Depends(get_inspiration_service),
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
inspiration = await service.mark_as_completed(inspiration_id, is_completed)
|
|
if not inspiration:
|
|
raise HTTPException(status_code=404, detail="Inspiration not found")
|
|
return inspiration
|
|
|
|
|
|
@router.delete("/{inspiration_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
async def delete_inspiration(
|
|
inspiration_id: str,
|
|
service: InspirationService = Depends(get_inspiration_service),
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
success = await service.delete_inspiration(inspiration_id)
|
|
if not success:
|
|
raise HTTPException(status_code=404, detail="Inspiration not found")
|
|
return None
|