/
tsps
/
core
Обзор
Документация
Войти
/
tsps
/
core
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/api/admin/audio_recordings.py
120 строк
4 KB
Василий Петров
Апи саммаризации
03 май 2026, 10:36
03 май 2026, 10:36
836c998
Код
Авторство
О чём код?
from __future__ import annotations from fastapi import APIRouter, Depends, UploadFile, File, Form, status from typing import Optional from datetime import datetime from sqlalchemy.orm import Session from app.schemas.audio_recording import AudioRecordingRead, AudioRecordingReadFull, AudioRecordingCreate from app.schemas.common import PaginationOut from app.core.security import get_current_admin_id from app.database import get_db from app.services.audio_recording import list_audio_recordings, get_audio_recording, create_audio_recording, get_audio_recording_status, start_summarization import logging logger = logging.getLogger(__name__) router = APIRouter( prefix="/audio-recordings", tags=["admin: audio-recordings"], dependencies=[Depends(get_current_admin_id)] ) @router.get("", response_model=PaginationOut[AudioRecordingRead]) def read_audio_recordings( skip: int = 0, limit: int = 100, judge_id: Optional[int] = None, court_id: Optional[int] = None, case_number: Optional[str] = None, date_from: Optional[datetime] = None, date_to: Optional[datetime] = None, transcription_status: Optional[str] = None, db: Session = Depends(get_db) ): """ Список аудиозаписей с фильтрацией и пагинацией. Админ видит все записи, может фильтровать по судье. """ return list_audio_recordings( db=db, skip=skip, limit=limit, judge_id=judge_id, court_id=court_id, case_number=case_number, date_from=date_from, date_to=date_to, transcription_status=transcription_status, ) @router.get("/{recording_id}", response_model=AudioRecordingReadFull) def read_audio_recording( recording_id: int, db: Session = Depends(get_db) ): """ Получение полной аудиозаписи по ID с presigned_url. """ return get_audio_recording( db=db, recording_id=recording_id, judge_id=None # админ имеет доступ ко всем записям ) @router.post("", response_model=AudioRecordingReadFull) def create_audio_recording_endpoint( file: UploadFile = File(..., description="Аудиофайл (audio/*, макс. 500 МБ)"), case_entity_id: int = Form(...), judge_id: int = Form(...), court_id: int = Form(...), db: Session = Depends(get_db), admin_id: int = Depends(get_current_admin_id) ): """ Загрузка новой аудиозаписи. Файл сохраняется в S3, метаданные — в БД. Возвращает полную информацию с presigned_url. """ payload = AudioRecordingCreate( case_entity_id=case_entity_id, judge_id=judge_id, court_id=court_id ) recording = create_audio_recording(db=db, file=file, payload=payload) logger.info( f"Админ {admin_id} загрузил аудиозапись (id={recording.id}, " f"judge_id={payload.judge_id}, court_id={payload.court_id}, " f"file={recording.file_name}, size={recording.file_size})" ) # get_audio_recording уже генерирует presigned_url return get_audio_recording(db=db, recording_id=recording.id, judge_id=None) @router.get("/{recording_id}/status") def get_audio_recording_status_endpoint( recording_id: int, db: Session = Depends(get_db) ): """ Трекинг статуса транскрибации аудиозаписи. Возвращает только статус без связанных данных и presigned_url. """ return get_audio_recording_status(db=db, recording_id=recording_id, judge_id=None) @router.post("/{recording_id}/summarize", status_code=status.HTTP_204_NO_CONTENT) def summarize_audio_recording( recording_id: int, db: Session = Depends(get_db), admin_id: int = Depends(get_current_admin_id) ): """ Запуск асинхронной саммаризации аудиозаписи. Задача ставится в очередь 'summary', результат появится в поле transcript_summary позже. Возвращает 204 при успешной постановке в очередь. """ start_summarization(db=db, recording_id=recording_id, judge_id=None) logger.info(f"Админ {admin_id} запустил саммаризацию аудиозаписи (id={recording_id})")