11import logging
2- from typing import Annotated , Final
2+ from typing import Annotated , Final , TypeAlias , TypeVar
33
44from aiocache import cached # type: ignore[import-untyped]
5- from fastapi import APIRouter , Depends , Header , Request
5+ from fastapi import APIRouter , Depends , Header , Query , Request
66from fastapi_pagination import Page , Params
77from fastapi_pagination .api import create_page , resolve_params
88from fastapi_pagination .bases import RawParams
9+ from fastapi_pagination .customization import CustomizedPage , UseParamsFields
910from models_library .api_schemas_datcore_adapter .datasets import (
1011 DatasetMetaData ,
1112 FileMetaData ,
1213)
14+ from models_library .api_schemas_storage .storage_schemas import (
15+ DEFAULT_NUMBER_OF_PATHS_PER_PAGE ,
16+ MAX_NUMBER_OF_PATHS_PER_PAGE ,
17+ )
1318from servicelib .fastapi .requests_decorators import cancel_on_disconnect
1419from starlette import status
1520
2530) # NOTE: this caching time is arbitrary
2631
2732
33+ _T = TypeVar ("_T" )
34+ _CustomPage = CustomizedPage [
35+ Page [_T ],
36+ UseParamsFields (
37+ size = Query (
38+ DEFAULT_NUMBER_OF_PATHS_PER_PAGE , ge = 1 , le = MAX_NUMBER_OF_PATHS_PER_PAGE
39+ ),
40+ ),
41+ ]
42+
43+ _CustomizedPageParams : TypeAlias = _CustomPage .__params_type__ # type: ignore
44+
45+
2846@router .get (
2947 "/datasets" ,
3048 summary = "list datasets" ,
3149 status_code = status .HTTP_200_OK ,
32- response_model = Page [DatasetMetaData ],
50+ response_model = _CustomPage [DatasetMetaData ],
3351)
3452@cancel_on_disconnect
3553@cached (
@@ -41,8 +59,8 @@ async def list_datasets(
4159 x_datcore_api_key : Annotated [str , Header (..., description = "Datcore API Key" )],
4260 x_datcore_api_secret : Annotated [str , Header (..., description = "Datcore API Secret" )],
4361 pennsieve_client : Annotated [PennsieveApiClient , Depends (get_pennsieve_api_client )],
44- params : Annotated [Params , Depends ()],
45- ) -> Page [ DatasetMetaData ] :
62+ params : Annotated [_CustomizedPageParams , Depends ()],
63+ ):
4664 assert request # nosec
4765 raw_params : RawParams = resolve_params (params ).to_raw_params ()
4866 assert raw_params .limit is not None # nosec
@@ -85,7 +103,7 @@ async def get_dataset(
85103 "/datasets/{dataset_id}/files" ,
86104 summary = "list top level files/folders in a dataset" ,
87105 status_code = status .HTTP_200_OK ,
88- response_model = Page [FileMetaData ],
106+ response_model = _CustomPage [FileMetaData ],
89107)
90108@cancel_on_disconnect
91109@cached (
@@ -98,8 +116,8 @@ async def list_dataset_top_level_files(
98116 x_datcore_api_key : Annotated [str , Header (..., description = "Datcore API Key" )],
99117 x_datcore_api_secret : Annotated [str , Header (..., description = "Datcore API Secret" )],
100118 pennsieve_client : Annotated [PennsieveApiClient , Depends (get_pennsieve_api_client )],
101- params : Annotated [Params , Depends ()],
102- ) -> Page [ FileMetaData ] :
119+ params : Annotated [_CustomizedPageParams , Depends ()],
120+ ):
103121 assert request # nosec
104122 raw_params : RawParams = resolve_params (params ).to_raw_params ()
105123
@@ -119,7 +137,7 @@ async def list_dataset_top_level_files(
119137 "/datasets/{dataset_id}/files/{collection_id}" ,
120138 summary = "list top level files/folders in a collection in a dataset" ,
121139 status_code = status .HTTP_200_OK ,
122- response_model = Page [FileMetaData ],
140+ response_model = _CustomPage [FileMetaData ],
123141)
124142@cancel_on_disconnect
125143@cached (
@@ -133,8 +151,8 @@ async def list_dataset_collection_files(
133151 x_datcore_api_key : Annotated [str , Header (..., description = "Datcore API Key" )],
134152 x_datcore_api_secret : Annotated [str , Header (..., description = "Datcore API Secret" )],
135153 pennsieve_client : Annotated [PennsieveApiClient , Depends (get_pennsieve_api_client )],
136- params : Annotated [Params , Depends ()],
137- ) -> Page [ FileMetaData ] :
154+ params : Annotated [_CustomizedPageParams , Depends ()],
155+ ):
138156 assert request # nosec
139157 raw_params : RawParams = resolve_params (params ).to_raw_params ()
140158 assert raw_params .limit is not None # nosec
0 commit comments