Skip to content

Commit f0d544b

Browse files
authored
Merge pull request #31 from crane-cloud/ft/paginate-list
feat: add pagination to database list endpoint
2 parents 53d30f2 + 79374b1 commit f0d544b

1 file changed

Lines changed: 39 additions & 11 deletions

File tree

app/routes.py

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,28 +46,56 @@ def fetch_database_stats(access_token: str = Depends(security), db: Session = De
4646

4747
@router.get("/databases")
4848
def get_all_databases(
49-
access_token: str = Depends(security),
50-
db: Session = Depends(get_db),
51-
project_id: str = Query(None, description="Project ID"),
52-
database_flavour_name: str = Query(None, description="Database flavour name")
53-
):
49+
access_token: str = Depends(security),
50+
db: Session = Depends(get_db),
51+
project_id: str = Query(None, description="Project ID"),
52+
database_flavour_name: str = Query(
53+
None, description="Database flavour name"),
54+
page: int = Query(default=1, ge=1, description="Page number"),
55+
per_page: int = Query(default=10, ge=1, le=100,
56+
description="Items per page")
57+
):
5458
current_user = get_current_user(access_token.credentials)
5559
check_authentication(current_user)
5660

57-
databases = db.query(Database)
61+
query = db.query(Database)
5862

5963
if current_user.role != "administrator":
60-
databases = databases.filter(
64+
query = query.filter(
6165
Database.owner_id == current_user.id)
62-
66+
6367
if project_id:
64-
databases = databases.filter(Database.project_id == project_id)
68+
query = query.filter(Database.project_id == project_id)
6569

6670
if database_flavour_name:
67-
databases = databases.filter(
71+
query = query.filter(
6872
Database.database_flavour_name == database_flavour_name)
6973

70-
return {"status_code": 200, "data": {"databases": databases.all()}}
74+
total_count = query.count()
75+
total_pages = (total_count + per_page - 1)
76+
77+
offset = (page - 1) * per_page
78+
paginated_query = query.offset(offset).limit(per_page)
79+
80+
databases = paginated_query.all()
81+
82+
next_num = page + 1 if page < total_pages else None
83+
prev_num = page - 1 if page > 1 else None
84+
85+
return {
86+
"status_code": 200,
87+
"data": {
88+
"pagination": {
89+
"total": total_count,
90+
"pages": total_pages,
91+
"page": page,
92+
"per_page": per_page,
93+
"next": next_num,
94+
"prev": prev_num
95+
},
96+
"databases": databases
97+
}
98+
}
7199

72100

73101
@router.post("/databases")

0 commit comments

Comments
 (0)