"""Activity timeline endpoints backed by ActivityService.""" from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException, Query, status from app.api.deps import get_activity_service, get_organization_context from app.models.activity import ActivityRead from app.services.activity_service import ( ActivityForbiddenError, ActivityListFilters, ActivityService, ActivityValidationError, ) from app.services.organization_service import OrganizationContext from .models import ActivityCommentPayload router = APIRouter(prefix="/deals/{deal_id}/activities", tags=["activities"]) @router.get("/", response_model=list[ActivityRead]) async def list_activities( deal_id: int, limit: int = Query(50, ge=1, le=200), offset: int = Query(0, ge=0), context: OrganizationContext = Depends(get_organization_context), service: ActivityService = Depends(get_activity_service), ) -> list[ActivityRead]: """Fetch paginated activities for the deal within the current organization.""" filters = ActivityListFilters(deal_id=deal_id, limit=limit, offset=offset) try: activities = await service.list_activities(filters=filters, context=context) except ActivityForbiddenError as exc: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)) from exc return [ActivityRead.model_validate(activity) for activity in activities] @router.post("/", response_model=ActivityRead, status_code=status.HTTP_201_CREATED) async def create_activity_comment( deal_id: int, payload: ActivityCommentPayload, context: OrganizationContext = Depends(get_organization_context), service: ActivityService = Depends(get_activity_service), ) -> ActivityRead: """Add a comment to the deal timeline.""" try: activity = await service.add_comment( deal_id=deal_id, author_id=context.user_id, text=payload.extract_text(), context=context, ) except ActivityValidationError as exc: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(exc)) from exc except ActivityForbiddenError as exc: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)) from exc return ActivityRead.model_validate(activity)