-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathget-orderby.ts
64 lines (60 loc) · 1.82 KB
/
get-orderby.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { EntityBase } from '../entity';
import { Orderable, OrderLink, Order } from '../order';
/**
* Get an object containing the given order bys as query parameter, or an empty object if none was given.
*
* @typeparam EntityT - Type of the entity to order
* @param orderBy - A list of orderables to get the query parameters for
* @returns An object containing the query parameter or an empty object
*/
export function getOrderBy<EntityT extends EntityBase>(
orderBy: Orderable<EntityT>[]
): Partial<{ orderby: string }> {
if (typeof orderBy !== 'undefined' && orderBy.length) {
return {
orderby: getODataOrderByExpressions(orderBy).join(',')
};
}
return {};
}
function getODataOrderByExpressions<OrderByEntityT extends EntityBase>(
orderBys: Orderable<OrderByEntityT>[],
parentFieldNames: string[] = []
): string[] {
return orderBys.reduce(
(expressions: string[], orderBy: Orderable<OrderByEntityT>) => {
if (orderBy instanceof OrderLink) {
return [
...expressions,
getOrderByExpressionForOrderLink(orderBy, [...parentFieldNames])
];
}
return [
...expressions,
getOrderByExpressionForOrder(orderBy, parentFieldNames)
];
},
[]
);
}
function getOrderByExpressionForOrderLink<
OrderByEntityT extends EntityBase,
LinkedEntityT extends EntityBase
>(
orderBy: OrderLink<OrderByEntityT, LinkedEntityT>,
parentFieldNames: string[] = []
): string {
return getODataOrderByExpressions(orderBy.orderBy, [
...parentFieldNames,
orderBy.link._fieldName
]).join(',');
}
function getOrderByExpressionForOrder<OrderByEntityT extends EntityBase>(
orderBy: Order<OrderByEntityT>,
parentFieldNames: string[] = []
): string {
return [
[...parentFieldNames, orderBy._fieldName].join('/'),
orderBy.orderType
].join(' ');
}