2828from database .session import DbSession
2929from dependencies .filtering import ResourceFilters , ResourceFiltersParams
3030from dependencies .pagination import Pagination , PaginationParams
31+ from dependencies .sorting import SortingParams , Sorting , SortDirection
3132from error_handling import as_http_exception
3233from database .model .ai_asset .distribution import Distribution
3334from database .model .helper_functions import get_asset_type_by_abbreviation
@@ -210,6 +211,7 @@ def get_resources(
210211 self ,
211212 schema : str ,
212213 pagination : Pagination ,
214+ sorting : Sorting ,
213215 resource_filters : ResourceFilters ,
214216 user : KeycloakUser | None = None ,
215217 platform : str | None = None ,
@@ -227,7 +229,7 @@ def get_resources(
227229 else cast (Callable , self .orm_to_read )
228230 )
229231 resources : Any = self ._retrieve_resources_and_post_process (
230- session , pagination , resource_filters , user , platform
232+ session , pagination , sorting , resource_filters , user , platform
231233 )
232234 for resource in resources :
233235 if not get_image and hasattr (resource , "media" ):
@@ -289,13 +291,15 @@ def get_resources_func(self):
289291
290292 def get_resources (
291293 pagination : PaginationParams ,
294+ sorting : SortingParams ,
292295 resource_filters : ResourceFiltersParams ,
293296 schema : self ._possible_schemas_type = "aiod" , # type:ignore
294297 user : KeycloakUser | None = Depends (get_user_or_none ),
295298 ):
296299 resources = self .get_resources (
297300 schema = schema ,
298301 pagination = pagination ,
302+ sorting = sorting ,
299303 resource_filters = resource_filters ,
300304 user = user ,
301305 platform = None ,
@@ -367,13 +371,15 @@ def get_resources(
367371 ),
368372 ],
369373 pagination : PaginationParams ,
374+ sorting : SortingParams ,
370375 resource_filters : ResourceFiltersParams ,
371376 schema : self ._possible_schemas_type = "aiod" , # type:ignore
372377 user : KeycloakUser | None = Depends (get_user_or_none ),
373378 ):
374379 resources = self .get_resources (
375380 schema = schema ,
376381 pagination = pagination ,
382+ sorting = sorting ,
377383 resource_filters = resource_filters ,
378384 user = user ,
379385 platform = platform ,
@@ -725,6 +731,7 @@ def _retrieve_resources(
725731 self ,
726732 session : Session ,
727733 pagination : Pagination ,
734+ sorting : Sorting ,
728735 resource_filters : ResourceFilters ,
729736 platform : str | None = None ,
730737 ) -> Sequence [type [RESOURCE_MODEL ]]:
@@ -743,10 +750,17 @@ def _retrieve_resources(
743750 else True ,
744751 AIoDEntryORM .status == EntryStatus .PUBLISHED ,
745752 )
753+ sort_attribute = getattr (AIoDEntryORM , sorting .sort .lower ())
754+ sort = (
755+ sort_attribute .asc ()
756+ if sorting .direction == SortDirection .ASC
757+ else sort_attribute .desc ()
758+ )
746759 query = (
747760 select (self .resource_class )
748761 .join (self .resource_class .aiod_entry , isouter = True )
749762 .where (where_clause )
763+ .order_by (sort , AIoDEntryORM .identifier .asc ()) # type: ignore[attr-defined]
750764 .offset (pagination .offset )
751765 .limit (pagination .limit )
752766 )
@@ -773,6 +787,7 @@ def _retrieve_resources_and_post_process(
773787 self ,
774788 session : Session ,
775789 pagination : Pagination ,
790+ sorting : Sorting ,
776791 resource_filters : ResourceFilters ,
777792 user : KeycloakUser | None = None ,
778793 platform : str | None = None ,
@@ -783,7 +798,7 @@ def _retrieve_resources_and_post_process(
783798 implement further verification on user access to the resource.
784799 """
785800 resources : Sequence [type [RESOURCE_MODEL ]] = self ._retrieve_resources (
786- session , pagination , resource_filters , platform
801+ session , pagination , sorting , resource_filters , platform
787802 )
788803 return self ._mask_or_filter (resources , session , user )
789804
0 commit comments