Skip to content

Commit 386dab5

Browse files
authored
Merge pull request #197 from sjulian4/paginating-locked
Paginating the gathering locked proposals endpoint
2 parents 56e9437 + 934cb62 commit 386dab5

File tree

4 files changed

+19
-5
lines changed

4 files changed

+19
-5
lines changed

src/nsls2api/api/models/proposal_model.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class CommissioningProposalsList(pydantic.BaseModel):
3838
class LockedProposalsList(pydantic.BaseModel):
3939
count: int
4040
locked_proposals: list[Proposal]
41+
page_size: int | None = None
42+
page: int | None = None
4143

4244

4345
class CycleProposalList(pydantic.BaseModel):

src/nsls2api/api/v1/admin_api.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,8 @@ async def gather_locked_proposals(
257257
facility: str,
258258
beamline: Annotated[list[str], Query()] = [],
259259
cycle: Annotated[list[str], Query()] = [],
260+
page_size: int = Query(10, ge=1, le=200),
261+
page: int = Query(1, ge=1),
260262
):
261263
for beamline_name in beamline:
262264
beamline_info = await beamline_service.beamline_by_name(beamline_name)
@@ -274,7 +276,7 @@ async def gather_locked_proposals(
274276
detail=f"Cycle {cycle_name} not found",
275277
)
276278
locked_proposals = await proposal_service.get_locked_proposals(
277-
cycles=cycle, beamlines=beamline
279+
cycles=cycle, beamlines=beamline, page=page, page_size=page_size
278280
)
279281
locked_proposals_list = locked_proposals.locked_proposals
280282
if locked_proposals_list is None:

src/nsls2api/api/v1/proposal_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ async def get_proposals(
103103
beamline: Annotated[list[str], Query()] = [],
104104
cycle: Annotated[list[str], Query()] = [],
105105
facility: Annotated[list[FacilityName], Query()] = [FacilityName.nsls2],
106-
page_size: int = 10,
107-
page: int = 1,
106+
page_size: int = Query(10, ge=1, le=200),
107+
page: int = Query(1, ge=1),
108108
include_directories: bool = False,
109109
):
110110
proposal_list = await proposal_service.fetch_proposals(

src/nsls2api/services/proposal_service.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@
3131

3232

3333
async def get_locked_proposals(
34-
cycles: list[str], beamlines: list[str]
34+
cycles: list[str],
35+
beamlines: list[str],
36+
page_size: int = 10,
37+
page: int = 1,
3538
) -> LockedProposalsList:
3639
locked_proposals = None
3740
uppercase_beamline = []
@@ -59,10 +62,17 @@ async def get_locked_proposals(
5962
else:
6063
query = Proposal.locked == True
6164

62-
locked_proposals = await Proposal.find_many(query).to_list()
65+
locked_proposals = (
66+
await Proposal.find_many(query)
67+
.limit(page_size)
68+
.skip(page_size * (page - 1))
69+
.to_list()
70+
)
6371
locked_model = LockedProposalsList(
6472
count=len(locked_proposals),
6573
locked_proposals=locked_proposals,
74+
page_size=page_size,
75+
page=page,
6676
)
6777

6878
return locked_model

0 commit comments

Comments
 (0)