feat: Add Pydantic field validation with max_length and pattern constraints to various schemas and models.

main
Cizz22 4 weeks ago
parent 937a3a95b1
commit 56552b6dd9

@ -42,15 +42,15 @@ class EquipmentBase(DefultBase):
# remark: Optional[str] # remark: Optional[str]
class MasterEquipment(DefultBase): class MasterEquipment(DefultBase):
name: str name: str = Field(..., max_length=100)
class CustomParameter(DefultBase): class CustomParameter(DefultBase):
level: str level: str = Field(..., max_length=50)
failure_rates: List[float] failure_rates: List[float]
mttr: float mttr: float
class Equipment(EquipmentBase): class Equipment(EquipmentBase):
location_tag: str location_tag: str = Field(..., max_length=50)
master_equipment: MasterEquipment master_equipment: MasterEquipment
class EquipmentWithCustomParameters(Equipment): class EquipmentWithCustomParameters(Equipment):
@ -88,7 +88,7 @@ class EquipmentConfiguration(EquipmentBase):
""" """
equipment_name: str = Field( equipment_name: str = Field(
..., alias="equipmentName", description="Name of the equipment" ..., alias="equipmentName", description="Name of the equipment", max_length=100
) )
max_flowrate: float = Field( max_flowrate: float = Field(
..., alias="maxFlowrate", ge=0, description="Maximum flow rate" ..., alias="maxFlowrate", ge=0, description="Maximum flow rate"
@ -102,7 +102,7 @@ class EquipmentConfiguration(EquipmentBase):
# Reliability Distribution Parameters # Reliability Distribution Parameters
rel_dis_type: str = Field( rel_dis_type: str = Field(
..., alias="relDisType", description="Reliability distribution type" ..., alias="relDisType", description="Reliability distribution type", max_length=50
) )
rel_dis_p1: float = Field( rel_dis_p1: float = Field(
..., alias="relDisP1", description="Reliability distribution parameter 1" ..., alias="relDisP1", description="Reliability distribution parameter 1"
@ -119,7 +119,7 @@ class EquipmentConfiguration(EquipmentBase):
# Corrective Maintenance Distribution Parameters # Corrective Maintenance Distribution Parameters
cm_dis_type: str = Field( cm_dis_type: str = Field(
..., alias="cmDisType", description="Corrective maintenance distribution type" ..., alias="cmDisType", description="Corrective maintenance distribution type", max_length=50
) )
cm_dis_p1: float = Field( cm_dis_p1: float = Field(
..., ...,
@ -144,7 +144,7 @@ class EquipmentConfiguration(EquipmentBase):
# Inspection Distribution Parameters # Inspection Distribution Parameters
ip_dis_type: str = Field( ip_dis_type: str = Field(
..., alias="ipDisType", description="Inspection distribution type" ..., alias="ipDisType", description="Inspection distribution type", max_length=50
) )
ip_dis_p1: float = Field( ip_dis_p1: float = Field(
..., alias="ipDisP1", description="Inspection distribution parameter 1" ..., alias="ipDisP1", description="Inspection distribution parameter 1"
@ -161,7 +161,7 @@ class EquipmentConfiguration(EquipmentBase):
# Preventive Maintenance Distribution Parameters # Preventive Maintenance Distribution Parameters
pm_dis_type: str = Field( pm_dis_type: str = Field(
..., alias="pmDisType", description="Preventive maintenance distribution type" ..., alias="pmDisType", description="Preventive maintenance distribution type", max_length=50
) )
pm_dis_p1: float = Field( pm_dis_p1: float = Field(
..., ...,
@ -186,7 +186,7 @@ class EquipmentConfiguration(EquipmentBase):
# Overhaul Distribution Parameters # Overhaul Distribution Parameters
oh_dis_type: str = Field( oh_dis_type: str = Field(
..., alias="ohDisType", description="Overhaul distribution type" ..., alias="ohDisType", description="Overhaul distribution type", max_length=50
) )
oh_dis_p1: float = Field( oh_dis_p1: float = Field(
..., alias="ohDisP1", description="Overhaul distribution parameter 1" ..., alias="ohDisP1", description="Overhaul distribution parameter 1"

@ -16,12 +16,12 @@ class AerosProjectBase(DefultBase):
class AerosProjectInput(AerosProjectBase): class AerosProjectInput(AerosProjectBase):
schematic_name: str schematic_name: str = Field(..., max_length=100)
aro_file: UploadFile = File(..., description="ARO file") aro_file: UploadFile = File(..., description="ARO file")
class AerosMetadata(AerosProjectBase): class AerosMetadata(AerosProjectBase):
project_name: str project_name: str = Field(..., max_length=100)
aro_file_path: str aro_file_path: str = Field(..., max_length=255)
updated_at: datetime updated_at: datetime

@ -11,12 +11,12 @@ from src.aeros_equipment.schema import MasterEquipment, EquipmentWithCustomParam
# Pydantic models for request/response validation # Pydantic models for request/response validation
class SimulationInput(DefultBase): class SimulationInput(DefultBase):
SchematicName: str = "- TJB - Unit 3 -" SchematicName: str = Field("- TJB - Unit 3 -", max_length=100)
SimSeed: int = 1 SimSeed: int = 1
SimDuration: int = 3 SimDuration: int = 3
DurationUnit: str = "UYear" DurationUnit: str = Field("UYear", max_length=20)
SimNumRun: int = 1 SimNumRun: int = 1
SimulationName: str = "DefaultSimulation" SimulationName: str = Field("DefaultSimulation", max_length=100, pattern=r"^[a-zA-Z0-9_\-\s]+$")
CustomInput: dict = {} CustomInput: dict = {}
IsDefault:bool = False IsDefault:bool = False
Konkin_offset: Optional[int] = 0 Konkin_offset: Optional[int] = 0
@ -25,15 +25,15 @@ class SimulationInput(DefultBase):
PlannedOutages: Optional[int] = 0 PlannedOutages: Optional[int] = 0
OverhaulInterval: Optional[int] = Field(0) OverhaulInterval: Optional[int] = Field(0)
OverhaulDuration: Optional[int] = Field(1200) OverhaulDuration: Optional[int] = Field(1200)
AhmJobId: Optional[str] = Field(None) AhmJobId: Optional[str] = Field(None, max_length=50)
class SimulationNode(DefultBase): class SimulationNode(DefultBase):
id: UUID id: UUID
node_type: Optional[str] node_type: Optional[str] = Field(None, max_length=50)
node_id: Optional[int] node_id: Optional[int]
node_name: Optional[str] node_name: Optional[str] = Field(None, max_length=100)
structure_name: Optional[str] structure_name: Optional[str] = Field(None, max_length=100)
schematic_name: Optional[str] schematic_name: Optional[str] = Field(None, max_length=100)
schematic_id: Optional[UUID] schematic_id: Optional[UUID]
model_image: Optional[list] = Field(None) model_image: Optional[list] = Field(None)
equipment:Optional[MasterEquipment] = None equipment:Optional[MasterEquipment] = None
@ -103,9 +103,9 @@ class SimulationPlotResult(DefultBase):
class SimulationData(DefultBase): class SimulationData(DefultBase):
id: UUID id: UUID
simulation_name: str simulation_name: str = Field(..., max_length=100)
status: str status: str = Field(..., max_length=20)
schematic_name: str schematic_name: str = Field(..., max_length=100)
created_at: datetime created_at: datetime
started_at: datetime started_at: datetime
duration: Optional[int]= 0 duration: Optional[int]= 0
@ -120,17 +120,17 @@ class SimulationPagination(Pagination):
class AhmMetricInput(DefultBase): class AhmMetricInput(DefultBase):
target_simulation_id: str target_simulation_id: str = Field(..., max_length=50)
baseline_simulation_id: Optional[str] = Field(None) baseline_simulation_id: Optional[str] = Field(None, max_length=50)
class YearlySimulationInput(DefultBase): class YearlySimulationInput(DefultBase):
year: int year: int
class SimulationQueryModel(CommonParams): class SimulationQueryModel(CommonParams):
status: Optional[str] = Field(None) status: Optional[str] = Field(None, max_length=20)
class SimulationCalcResultQuery(DefultBase): class SimulationCalcResultQuery(DefultBase):
schematic_name: Optional[str] = None schematic_name: Optional[str] = Field(None, max_length=100)
node_type: Optional[str] = Field(None, alias="nodetype") node_type: Optional[str] = Field(None, alias="nodetype", max_length=50)

@ -2,7 +2,7 @@ from typing import List, Optional
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from pydantic import BaseModel from pydantic import BaseModel, Field
from src.aeros_project.router import router as aeros_project_router from src.aeros_project.router import router as aeros_project_router
from src.aeros_simulation.router import router as aeros_simulation_router, airflow_router from src.aeros_simulation.router import router as aeros_simulation_router, airflow_router
@ -12,7 +12,7 @@ from src.aeros_equipment.router import router as aeros_equipment_router
from src.aeros_contribution.router import router as aeros_contribution_router from src.aeros_contribution.router import router as aeros_contribution_router
class ErrorMessage(BaseModel): class ErrorMessage(BaseModel):
msg: str msg: str = Field(..., max_length=255)
class ErrorResponse(BaseModel): class ErrorResponse(BaseModel):

@ -1,7 +1,7 @@
from pydantic import BaseModel from pydantic import BaseModel, Field
class UserBase(BaseModel): class UserBase(BaseModel):
name: str name: str = Field(..., max_length=100)
role: str role: str = Field(..., max_length=50)
user_id: str user_id: str = Field(..., max_length=50)

@ -6,11 +6,11 @@ from src.models import DefultBase
class CommonParams(DefultBase): class CommonParams(DefultBase):
# This ensures no extra query params are allowed # This ensures no extra query params are allowed
current_user: Optional[str] = Field(None, alias="currentUser") current_user: Optional[str] = Field(None, alias="currentUser", max_length=50)
page: int = Field(1, gt=0, lt=2147483647) page: int = Field(1, gt=0, lt=2147483647)
items_per_page: int = Field(5, gt=-2, lt=2147483647, alias="itemsPerPage") items_per_page: int = Field(5, gt=-2, lt=2147483647, alias="itemsPerPage")
query_str: Optional[str] = Field(None, alias="q") query_str: Optional[str] = Field(None, alias="q", max_length=100)
filter_spec: Optional[str] = Field(None, alias="filter") filter_spec: Optional[str] = Field(None, alias="filter", max_length=500)
sort_by: List[str] = Field(default_factory=list, alias="sortBy[]") sort_by: List[str] = Field(default_factory=list, alias="sortBy[]")
descending: List[bool] = Field(default_factory=list, alias="descending[]") descending: List[bool] = Field(default_factory=list, alias="descending[]")
exclude: List[str] = Field(default_factory=list, alias="exclude[]") exclude: List[str] = Field(default_factory=list, alias="exclude[]")

@ -7,7 +7,7 @@ from asyncpg.exceptions import PostgresError
from fastapi import FastAPI, HTTPException, Request from fastapi import FastAPI, HTTPException, Request
from fastapi.exceptions import RequestValidationError from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from pydantic import BaseModel from pydantic import BaseModel, Field
from slowapi import _rate_limit_exceeded_handler from slowapi import _rate_limit_exceeded_handler
from slowapi.errors import RateLimitExceeded from slowapi.errors import RateLimitExceeded
from sqlalchemy.exc import DataError, DBAPIError, IntegrityError, SQLAlchemyError from sqlalchemy.exc import DataError, DBAPIError, IntegrityError, SQLAlchemyError
@ -16,15 +16,15 @@ from src.enums import ResponseStatus
class ErrorDetail(BaseModel): class ErrorDetail(BaseModel):
field: Optional[str] = None field: Optional[str] = Field(None, max_length=100)
message: str message: str = Field(..., max_length=255)
code: Optional[str] = None code: Optional[str] = Field(None, max_length=50)
params: Optional[Dict[str, Any]] = None params: Optional[Dict[str, Any]] = None
class ErrorResponse(BaseModel): class ErrorResponse(BaseModel):
data: Optional[Any] = None data: Optional[Any] = None
message: str message: str = Field(..., max_length=255)
status: ResponseStatus = ResponseStatus.ERROR status: ResponseStatus = ResponseStatus.ERROR
errors: Optional[List[ErrorDetail]] = None errors: Optional[List[ErrorDetail]] = None

@ -108,5 +108,5 @@ T = TypeVar("T")
class StandardResponse(BaseModel, Generic[T]): class StandardResponse(BaseModel, Generic[T]):
data: Optional[T] = None data: Optional[T] = None
message: str = "Success" message: str = Field("Success", max_length=255)
status: ResponseStatus = ResponseStatus.SUCCESS status: ResponseStatus = ResponseStatus.SUCCESS

Loading…
Cancel
Save