5
5
from datetime import datetime
6
6
from enum import Enum
7
7
from functools import reduce
8
- from typing import Any , ClassVar , Final , TypeAlias
8
+ from typing import Any , ClassVar , Final , TypeAlias , cast
9
9
10
10
import sqlalchemy as sa
11
11
from aiopg .sa .connection import SAConnection
20
20
parse_obj_as ,
21
21
)
22
22
from pydantic .errors import PydanticErrorMixin
23
+ from simcore_postgres_database .utils_ordering import OrderByDict
23
24
from sqlalchemy .dialects import postgresql
24
25
from sqlalchemy .sql .elements import ColumnElement
25
26
from sqlalchemy .sql .selectable import ScalarSelect
26
27
27
28
from .models .folders import folders , folders_access_rights , folders_to_projects
28
29
from .models .groups import GroupType , groups
30
+ from .utils_ordering import OrderDirection
29
31
30
32
_ProductName : TypeAlias = str
31
33
_ProjectID : TypeAlias = uuid .UUID
@@ -986,8 +988,11 @@ async def folder_list(
986
988
* ,
987
989
offset : NonNegativeInt ,
988
990
limit : NonNegativeInt ,
991
+ order_by : OrderByDict = OrderByDict (
992
+ field = "modified" , direction = OrderDirection .DESC
993
+ ),
989
994
_required_permissions = _requires (_BasePermissions .LIST_FOLDERS ), # noqa: B008
990
- ) -> list [FolderEntry ]:
995
+ ) -> tuple [ int , list [FolderEntry ] ]:
991
996
"""
992
997
Raises:
993
998
FolderNotFoundError
@@ -1015,7 +1020,7 @@ async def folder_list(
1015
1020
access_via_gid = resolved_access_rights .gid
1016
1021
access_via_folder_id = resolved_access_rights .folder_id
1017
1022
1018
- query = (
1023
+ base_query = (
1019
1024
sa .select (
1020
1025
folders ,
1021
1026
folders_access_rights ,
@@ -1047,14 +1052,30 @@ async def folder_list(
1047
1052
if folder_id is None
1048
1053
else True
1049
1054
)
1050
- .offset (offset )
1051
- .limit (limit )
1055
+ .where (folders .c .product_name == product_name )
1052
1056
)
1053
1057
1054
- async for entry in connection .execute (query ):
1058
+ # Select total count from base_query
1059
+ subquery = base_query .subquery ()
1060
+ count_query = sa .select (sa .func .count ()).select_from (subquery )
1061
+ count_result = await connection .execute (count_query )
1062
+ total_count = await count_result .scalar ()
1063
+
1064
+ # Ordering and pagination
1065
+ if order_by ["direction" ] == OrderDirection .ASC :
1066
+ list_query = base_query .order_by (
1067
+ sa .asc (getattr (folders .c , order_by ["field" ]))
1068
+ )
1069
+ else :
1070
+ list_query = base_query .order_by (
1071
+ sa .desc (getattr (folders .c , order_by ["field" ]))
1072
+ )
1073
+ list_query = list_query .offset (offset ).limit (limit )
1074
+
1075
+ async for entry in connection .execute (list_query ):
1055
1076
results .append (FolderEntry .from_orm (entry )) # noqa: PERF401s
1056
1077
1057
- return results
1078
+ return cast ( int , total_count ), results
1058
1079
1059
1080
1060
1081
async def folder_get (
@@ -1101,6 +1122,7 @@ async def folder_get(
1101
1122
if folder_id is None
1102
1123
else True
1103
1124
)
1125
+ .where (folders .c .product_name == product_name )
1104
1126
)
1105
1127
1106
1128
query_result : RowProxy | None = await (
@@ -1113,3 +1135,6 @@ async def folder_get(
1113
1135
)
1114
1136
1115
1137
return FolderEntry .from_orm (query_result )
1138
+
1139
+
1140
+ __all__ = ["OrderByDict" ]
0 commit comments