41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
def parse_odata_query(request_args):
|
|
"""
|
|
Translates standard OData query parameters ($top, $skip, $orderby, $filter)
|
|
into MongoDB query parameters.
|
|
"""
|
|
limit = int(request_args.get('$top', 50))
|
|
skip = int(request_args.get('$skip', 0))
|
|
|
|
# Parse $orderby (e.g., $orderby=received_at desc)
|
|
sort = []
|
|
orderby_str = request_args.get('$orderby')
|
|
if orderby_str:
|
|
parts = orderby_str.split()
|
|
field = parts[0]
|
|
direction = -1 if len(parts) > 1 and parts[1].lower() == 'desc' else 1
|
|
sort.append((field, direction))
|
|
|
|
# Parse basic $filter (e.g., $filter=device_id eq '1')
|
|
mongo_filter = {}
|
|
filter_str = request_args.get('$filter')
|
|
if filter_str and ' eq ' in filter_str:
|
|
field, val = filter_str.split(' eq ')
|
|
field = field.strip()
|
|
val = val.strip().strip("'").strip('"')
|
|
|
|
# Cast data types
|
|
if val.isdigit():
|
|
val = int(val)
|
|
elif val.lower() == 'true':
|
|
val = True
|
|
elif val.lower() == 'false':
|
|
val = False
|
|
|
|
mongo_filter[field] = val
|
|
|
|
return {
|
|
"filter": mongo_filter,
|
|
"limit": limit,
|
|
"skip": skip,
|
|
"sort": sort or [("_id", -1)]
|
|
} |