from pydantic import BaseModel, constr, field_validator, validator from fastapi import HTTPException, status from typing import Optional from datetime import datetime # Funções para sanitização de entradas (evitar XSS, SQLi etc.) from actions.validations.text import Text # Funções para sanitização de entradas (evitar XSS, SQLi etc.) # É importante que esta função seja mantida/implementada no seu ambiente # from actions.validations.text import Text # Descomentar se for usar # ---------------------------------------------------- # Schema Base: Usado para leitura (GET, SHOW, INDEX) # Inclui todos os campos, incluindo os gerados pelo banco # ---------------------------------------------------- class AtoDocumentoSchema(BaseModel): ato_documento_id: Optional[int] = None ato_principal_id: Optional[int] = None # bigint NOT NULL arquivo_base64: Optional[str] = None nome_documento: Optional[str] = None # varchar(255) NOT NULL tipo_documento: Optional[str] = None # varchar(50) NOT NULL created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class Config: from_attributes = True # ---------------------------------------------------- # Schema para Requisição de ID: Usado em SHOW e DELETE # ---------------------------------------------------- class AtoDocumentoIdSchema(BaseModel): ato_documento_id: int @field_validator("ato_documento_id") def validate_ato_documento_id(cls, v: int): if v <= 0: raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=[ { "input": "ato_documento_id", "message": "ID do documento deve ser um valor positivo.", } ], ) return v # ---------------------------------------------------- # Schema para Criação (SAVE): Campos obrigatórios e sem ID # ---------------------------------------------------- class AtoDocumentoSaveSchema(BaseModel): # Campos obrigatórios ato_principal_id: Optional[int] = None arquivo_base64: Optional[str] = None nome_documento: constr(max_length=255) tipo_documento: constr(max_length=50) # Validação e Sanitização de Tipo Documento (chk_tipo_documento_not_empty) @field_validator("tipo_documento") def validate_tipo_documento(cls, v: str): v = v.strip() if not v: raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=[ { "input": "tipo_documento", "message": "O tipo de documento não pode ser vazio.", } ], ) # Sanitiza o campo return Text.sanitize_input(v) # Validação e Sanitização de Nome Documento @field_validator("nome_documento") def validate_nome_documento(cls, v: str): v = v.strip() if not v: raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=[ { "input": "nome_documento", "message": "O nome do documento não pode ser vazio.", } ], ) # Sanitiza o campo return Text.sanitize_input(v) # ---------------------------------------------------- # Schema para Atualização (UPDATE): Todos opcionais (parciais) # ---------------------------------------------------- class AtoDocumentoUpdateSchema(BaseModel): # Todos os campos são opcionais no UPDATE ato_principal_id: Optional[int] = None arquivo_base64: Optional[str] = None nome_documento: Optional[constr(max_length=255)] = None tipo_documento: Optional[constr(max_length=50)] = None # Validação de Tipo Documento @field_validator("tipo_documento") def validate_tipo_documento(cls, v: Optional[str]): if v is None: return v v = v.strip() if not v: raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=[ { "input": "tipo_documento", "message": "O tipo de documento não pode ser vazio.", } ], ) # Sanitiza o campo return Text.sanitize_input(v)