diff --git a/src/database/service.py b/src/database/service.py index baa61e7..9313812 100644 --- a/src/database/service.py +++ b/src/database/service.py @@ -18,9 +18,11 @@ QueryStr = constr(pattern=r"^[ -~]+$", min_length=1) def common_parameters( db_session: DbSession, # type: ignore - current_user: QueryStr = Query(None, alias="currentUser"), # type: ignore + current_user: Optional[str] = Query(None, alias="currentUser"), # type: ignore + current_user_snake: Optional[str] = Query(None, alias="current_user"), # type: ignore page: int = Query(1, gt=0, lt=2147483647), - items_per_page: int = Query(5, alias="itemsPerPage", gt=-2, lt=2147483647), + items_per_page: Optional[int] = Query(None, alias="items_per_page", gt=-2, lt=2147483647), + items_per_page_camel: Optional[int] = Query(None, alias="itemsPerPage", gt=-2, lt=2147483647), query_str: QueryStr = Query(None, alias="q"), # type: ignore filter_spec: QueryStr = Query(None, alias="filter"), # type: ignore sort_by: List[str] = Query([], alias="sortBy[]"), @@ -28,15 +30,23 @@ def common_parameters( all: int = Query(0), # role: QueryStr = Depends(get_current_role), ): + # Support both snake_case and camelCase for pagination size + final_items_per_page = items_per_page_camel if items_per_page_camel is not None else ( + items_per_page if items_per_page is not None else 5 + ) + + # Support both snake_case and camelCase for current user + final_current_user = current_user or current_user_snake + return { "db_session": db_session, "page": page, - "items_per_page": items_per_page, + "items_per_page": final_items_per_page, "query_str": query_str, "filter_spec": filter_spec, "sort_by": sort_by, "descending": descending, - "current_user": current_user, + "current_user": final_current_user, # "role": role, "all": bool(all), } diff --git a/src/equipment_master/schema.py b/src/equipment_master/schema.py index ae94d76..54eed2a 100644 --- a/src/equipment_master/schema.py +++ b/src/equipment_master/schema.py @@ -46,5 +46,4 @@ class EquipmentMasterPaginated(Pagination): class EquipmentMasterQuery(CommonParams): parent_id : Optional[str] = None - items_per_page : Optional[int] = 5 search : Optional[str] = None \ No newline at end of file diff --git a/src/manpower_master/schema.py b/src/manpower_master/schema.py index c945b86..26f010d 100644 --- a/src/manpower_master/schema.py +++ b/src/manpower_master/schema.py @@ -33,5 +33,4 @@ class ManpowerCostPagination(Pagination): items: List[ManpowerCostRead] = [] class QueryParams(CommonParams): - items_per_page: Optional[int] = Field(5) search: Optional[str] = Field(None) \ No newline at end of file diff --git a/src/masterdata/schema.py b/src/masterdata/schema.py index 7a2d57d..3c77dba 100644 --- a/src/masterdata/schema.py +++ b/src/masterdata/schema.py @@ -2,7 +2,7 @@ from datetime import datetime from typing import List, Optional from uuid import UUID -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, model_validator from src.models import DefaultBase, Pagination from src.auth.service import CurrentUser @@ -53,13 +53,26 @@ class MasterDataPagination(Pagination): class QueryParams(DefaultBase): - items_per_page: Optional[int] = Field( + items_per_page: int = Field( 5, ge=1, - alias="itemsPerPage", + alias="items_per_page", description="Items per page" ) + itemsPerPage: Optional[int] = Field( + None, + ge=1, + description="Alias for items_per_page" + ) search: Optional[str] = Field( None, description="Search keyword" ) + + @model_validator(mode="before") + @classmethod + def resolve_aliases(cls, data: any) -> any: + if isinstance(data, dict): + if "itemsPerPage" in data and data["itemsPerPage"] is not None: + data.setdefault("items_per_page", data["itemsPerPage"]) + return data diff --git a/src/models.py b/src/models.py index 9fdaee8..b03adf8 100644 --- a/src/models.py +++ b/src/models.py @@ -2,7 +2,7 @@ from datetime import datetime from typing import Generic, List, Optional, TypeVar import uuid -from pydantic import BaseModel, Field, SecretStr, ConfigDict +from pydantic import BaseModel, Field, SecretStr, ConfigDict, model_validator from sqlalchemy import Column, DateTime, String, func, event from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column @@ -100,9 +100,11 @@ class StandardResponse(BaseModel, Generic[T]): class CommonParams(DefaultBase): # This ensures no extra query params are allowed - current_user: Optional[str] = Field(None, alias="currentUser") + current_user: Optional[str] = Field(None, alias="current_user") + currentUser: Optional[str] = Field(None, description="Alias for current_user") 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="items_per_page") + itemsPerPage: Optional[int] = Field(None, description="Alias for items_per_page") query_str: Optional[str] = Field(None, alias="q") filter_spec: Optional[str] = Field(None, alias="filter") sort_by: List[str] = Field(default_factory=list, alias="sortBy[]") @@ -110,6 +112,16 @@ class CommonParams(DefaultBase): exclude: List[str] = Field(default_factory=list, alias="exclude[]") all_params: int = Field(0, alias="all") + @model_validator(mode="before") + @classmethod + def resolve_aliases(cls, data: any) -> any: + if isinstance(data, dict): + if "itemsPerPage" in data and data["itemsPerPage"] is not None: + data.setdefault("items_per_page", data["itemsPerPage"]) + if "currentUser" in data and data["currentUser"] is not None: + data.setdefault("current_user", data["currentUser"]) + return data + # Property to mirror your original return dict's bool conversion @property def is_all(self) -> bool: diff --git a/src/plant_fs_transaction_data/schema.py b/src/plant_fs_transaction_data/schema.py index d2497e4..2341a18 100644 --- a/src/plant_fs_transaction_data/schema.py +++ b/src/plant_fs_transaction_data/schema.py @@ -102,13 +102,6 @@ class PlantFSChartData(DefaultBase): class ListQueryParams(CommonParams): - items_per_page: Optional[int] = Field( - default=5, - ge=1, - le=1000, - description="Number of items per page", - alias="itemsPerPage", - ) search: Optional[str] = Field( default=None, description="Search keyword", diff --git a/src/plant_masterdata/schema.py b/src/plant_masterdata/schema.py index c938a6b..58c22d4 100644 --- a/src/plant_masterdata/schema.py +++ b/src/plant_masterdata/schema.py @@ -88,13 +88,6 @@ class PlantMasterDataPagination(Pagination): class ListQueryParams(CommonParams): - items_per_page: Optional[int] = Field( - default=5, - ge=1, - le=1000, - description="Number of items per page", - alias="itemsPerPage", - ) search: Optional[str] = Field( default=None, description="Search keyword", diff --git a/src/simulations/schema.py b/src/simulations/schema.py index c4780bf..fe09cd0 100644 --- a/src/simulations/schema.py +++ b/src/simulations/schema.py @@ -54,13 +54,6 @@ class SimulationRunPayload(DefaultBase): class ListQueryParams(CommonParams): - items_per_page: Optional[int] = Field( - default=5, - ge=1, - le=1000, - description="Number of items per page", - alias="itemsPerPage", - ) search: Optional[str] = Field( default=None, description="Search keyword",