55from tortoise .queryset import QuerySet
66
77from goosebit .schema .software import SoftwareSchema
8- from goosebit .ui .bff .common .requests import DataTableRequest
8+
9+ from ..common .requests import DataTableOrderDirection , DataTableRequest
910
1011
1112class BFFSoftwareResponse (BaseModel ):
@@ -23,15 +24,24 @@ async def convert(cls, dt_query: DataTableRequest, query: QuerySet, search_filte
2324
2425 filtered_records = await query .count ()
2526
26- if dt_query .order_query :
27- query = query .order_by (dt_query .order_query )
27+ if len (dt_query .order ) > 0 and dt_query .order [0 ].name == "version" :
28+ # ordering cannot be delegated to database as semantic versioning sorting is not supported
29+ software = await query .all ()
30+ reverse = dt_query .order [0 ].dir == DataTableOrderDirection .DESCENDING
31+ software .sort (key = lambda s : s .parsed_version , reverse = reverse )
2832
29- # if no ordering is specified, database-side paging can be used
30- if dt_query .length is not None :
31- query = query .limit (dt_query .length )
33+ # in-memory paging
34+ if dt_query .length is None :
35+ software = software [dt_query .start :]
36+ else :
37+ software = software [dt_query .start : dt_query .start + dt_query .length ]
3238
33- software = await query .offset (dt_query .start ).all ()
39+ else :
40+ # if no ordering is specified, database-side paging can be used
41+ if dt_query .length is not None :
42+ query = query .limit (dt_query .length )
3443
44+ software = await query .offset (dt_query .start ).all ()
3545 data = [SoftwareSchema .model_validate (s ) for s in software ]
3646
3747 return cls (data = data , draw = dt_query .draw , records_total = total_records , records_filtered = filtered_records )
0 commit comments