from typing import Optional from fastapi import APIRouter, BackgroundTasks, Depends, File, Form, Header, UploadFile from app.core.auth import get_current_user, get_optional_current_user from app.models.models import ( BatchSpeakerTagUpdateRequest, BatchTranscriptUpdateRequest, CreateMeetingRequest, SpeakerTagUpdateRequest, UpdateMeetingRequest, ) import app.services.meeting_service as meeting_service router = APIRouter() GenerateSummaryRequest = meeting_service.GenerateSummaryRequest AccessPasswordRequest = meeting_service.AccessPasswordRequest VerifyPasswordRequest = meeting_service.VerifyPasswordRequest @router.get("/meetings") def get_meetings( current_user: dict = Depends(get_current_user), user_id: Optional[int] = None, page: int = 1, page_size: Optional[int] = None, search: Optional[str] = None, tags: Optional[str] = None, filter_type: str = "all" ): return meeting_service.get_meetings(current_user, user_id, page, page_size, search, tags, filter_type) @router.get("/meetings/stats") def get_meetings_stats( current_user: dict = Depends(get_current_user), user_id: Optional[int] = None ): return meeting_service.get_meetings_stats(current_user, user_id) @router.get("/meetings/{meeting_id}") def get_meeting_details(meeting_id: int, current_user: dict = Depends(get_current_user)): return meeting_service.get_meeting_details(meeting_id, current_user) @router.get("/meetings/{meeting_id}/transcript") def get_meeting_transcript(meeting_id: int, current_user: Optional[dict] = Depends(get_optional_current_user)): return meeting_service.get_meeting_transcript(meeting_id, current_user) @router.post("/meetings") def create_meeting(meeting_request: CreateMeetingRequest, current_user: dict = Depends(get_current_user)): return meeting_service.create_meeting(meeting_request, current_user) @router.put("/meetings/{meeting_id}") def update_meeting(meeting_id: int, meeting_request: UpdateMeetingRequest, current_user: dict = Depends(get_current_user)): return meeting_service.update_meeting(meeting_id, meeting_request, current_user) @router.delete("/meetings/{meeting_id}") def delete_meeting(meeting_id: int, current_user: dict = Depends(get_current_user)): return meeting_service.delete_meeting(meeting_id, current_user) @router.get("/meetings/{meeting_id}/edit") def get_meeting_for_edit(meeting_id: int, current_user: dict = Depends(get_current_user)): return meeting_service.get_meeting_for_edit(meeting_id, current_user) @router.post("/meetings/upload-audio") async def upload_audio( audio_file: UploadFile = File(...), meeting_id: int = Form(...), auto_summarize: str = Form("true"), prompt_id: Optional[int] = Form(None), model_code: Optional[str] = Form(None), background_tasks: BackgroundTasks = None, current_user: dict = Depends(get_current_user) ): return await meeting_service.upload_audio( audio_file, meeting_id, auto_summarize, prompt_id, model_code, background_tasks, current_user, ) @router.get("/meetings/{meeting_id}/audio") def get_audio_file(meeting_id: int, current_user: Optional[dict] = Depends(get_optional_current_user)): return meeting_service.get_audio_file(meeting_id, current_user) @router.get("/meetings/{meeting_id}/audio/stream") async def stream_audio_file( meeting_id: int, range: Optional[str] = Header(None, alias="Range") ): return await meeting_service.stream_audio_file(meeting_id, range) @router.get("/meetings/{meeting_id}/transcription/status") def get_meeting_transcription_status(meeting_id: int, current_user: dict = Depends(get_current_user)): return meeting_service.get_meeting_transcription_status(meeting_id, current_user) @router.post("/meetings/{meeting_id}/transcription/start") def start_meeting_transcription( meeting_id: int, background_tasks: BackgroundTasks, current_user: dict = Depends(get_current_user) ): return meeting_service.start_meeting_transcription(meeting_id, background_tasks, current_user) @router.post("/meetings/{meeting_id}/upload-image") async def upload_image(meeting_id: int, image_file: UploadFile = File(...), current_user: dict = Depends(get_current_user)): return await meeting_service.upload_image(meeting_id, image_file, current_user) @router.put("/meetings/{meeting_id}/speaker-tags") def update_speaker_tag(meeting_id: int, request: SpeakerTagUpdateRequest, current_user: dict = Depends(get_current_user)): return meeting_service.update_speaker_tag(meeting_id, request, current_user) @router.put("/meetings/{meeting_id}/speaker-tags/batch") def batch_update_speaker_tags( meeting_id: int, request: BatchSpeakerTagUpdateRequest, current_user: dict = Depends(get_current_user) ): return meeting_service.batch_update_speaker_tags(meeting_id, request, current_user) @router.put("/meetings/{meeting_id}/transcript/batch") def batch_update_transcript( meeting_id: int, request: BatchTranscriptUpdateRequest, current_user: dict = Depends(get_current_user) ): return meeting_service.batch_update_transcript(meeting_id, request, current_user) @router.get("/meetings/{meeting_id}/summaries") def get_meeting_summaries(meeting_id: int, current_user: dict = Depends(get_current_user)): return meeting_service.get_meeting_summaries(meeting_id, current_user) @router.get("/meetings/{meeting_id}/summaries/{summary_id}") def get_summary_detail(meeting_id: int, summary_id: int, current_user: dict = Depends(get_current_user)): return meeting_service.get_summary_detail(meeting_id, summary_id, current_user) @router.post("/meetings/{meeting_id}/generate-summary-async") def generate_meeting_summary_async( meeting_id: int, request: GenerateSummaryRequest, background_tasks: BackgroundTasks, current_user: dict = Depends(get_current_user) ): return meeting_service.generate_meeting_summary_async(meeting_id, request, background_tasks, current_user) @router.get("/meetings/{meeting_id}/llm-tasks") def get_meeting_llm_tasks(meeting_id: int, current_user: dict = Depends(get_current_user)): return meeting_service.get_meeting_llm_tasks(meeting_id, current_user) @router.get("/llm-models/active") def list_active_llm_models(current_user: dict = Depends(get_current_user)): return meeting_service.list_active_llm_models(current_user) @router.get("/meetings/{meeting_id}/navigation") def get_meeting_navigation( meeting_id: int, current_user: dict = Depends(get_current_user), user_id: Optional[int] = None, filter_type: str = "all", search: Optional[str] = None, tags: Optional[str] = None ): return meeting_service.get_meeting_navigation( meeting_id, current_user, user_id, filter_type, search, tags, ) @router.get("/meetings/{meeting_id}/preview-data") def get_meeting_preview_data(meeting_id: int, password: Optional[str] = None): return meeting_service.get_meeting_preview_data(meeting_id, password) @router.put("/meetings/{meeting_id}/access-password") def update_meeting_access_password( meeting_id: int, request: AccessPasswordRequest, current_user: dict = Depends(get_current_user) ): return meeting_service.update_meeting_access_password(meeting_id, request, current_user) @router.post("/meetings/{meeting_id}/verify-password") def verify_meeting_password(meeting_id: int, request: VerifyPasswordRequest): return meeting_service.verify_meeting_password(meeting_id, request)