from ninja import Router, File, Form from ninja.files import UploadedFile from typing import Optional from django.http import HttpRequest, HttpResponse from .search_service import ( buscar_diarios, sugestao_termo, buscar_diarios_simples, ) from .schemas import BuscaDiariosResponseSchema, SugestaoResponse, DiarioOficialIn, DiarioOficialOut from django.shortcuts import render router = Router(tags=["Diários Oficiais"]) async def home(request): return render(request, 'diarios/index.html') @router.get( "/sugestao", response=SugestaoResponse, summary="Sugestão de correção para termo de busca", ) async def sugestao_busca(request: HttpRequest, q: str) -> SugestaoResponse: """ Sugere correção para o termo buscado, se necessário. Args: request (HttpRequest): Requisição HTTP. q (str): Termo original digitado pelo usuário. Returns: SugestaoResponse: Termo corrigido. """ sugestao = await sugestao_termo(q) return {"sugestao": sugestao} @router.get( "/busca", response=BuscaDiariosResponseSchema, summary="Busca simplificada com modos e ordenação", ) async def busca_diarios_oficiais_simples( request: HttpRequest, q: Optional[str] = None, numero_diario: Optional[str] = None, data_inicio: Optional[str] = None, data_fim: Optional[str] = None, tipo: Optional[str] = None, ordenar_por: str = "relevancia", # "relevancia", "data_asc", "data_desc" modo_busca: str = "exata", # "exata" ou "qualquer" page: int = 1, page_size: int = 10, ) -> BuscaDiariosResponseSchema: """ Busca com modo de correspondência, ordenação e número do diário. Args: request (HttpRequest): Requisição HTTP. q (Optional[str]): Termo de busca. numero_diario (Optional[str]): Número exato do diário (ex: 1234/2024). data_inicio (Optional[str]): Data inicial (YYYY-MM-DD). data_fim (Optional[str]): Data final (YYYY-MM-DD). tipo (Optional[str]): Tipo exato do diário. ordenar_por (str): "relevancia", "data_asc" ou "data_desc". modo_busca (str): "exata" ou "qualquer". page (int): Página atual (mínimo: 1). page_size (int): Itens por página (mínimo: 1, máximo: 50). Returns: BuscaDiariosResponseSchema: Resultado paginado da busca. """ page_size = min(max(page_size, 1), 50) page = max(page, 1) resultado = await buscar_diarios_simples( query=q, numero_diario=numero_diario, data_inicio=data_inicio, data_fim=data_fim, tipo_diario=tipo, ordenar_por=ordenar_por, modo_busca=modo_busca, page=page, page_size=page_size, ) return resultado @router.post("/", response=DiarioOficialOut, summary="Criar novo diário oficial") def criar_diario( request: HttpRequest, # Usamos Form para os dados normais e File para o upload payload: DiarioOficialIn = Form(...), arquivo: UploadedFile = File(None) ): """ Cria um novo diário oficial. Observações: - Aceita tanto upload de arquivo PDF quanto link para o diário - Se ambos (arquivo e link) forem fornecidos, o arquivo terá prioridade - O arquivo deve ser um PDF válido """ # Prioriza o arquivo se ambos existirem arquivo_final = arquivo if arquivo else payload.arquivo return DiarioOficialService.criar_diario( data=payload.data, numero=payload.numero, tipo_id=payload.tipo_id, arquivo=arquivo_final, link=payload.link )