Restric order and filters arguments of favorite list
[arvados-workbench2.git] / src / common / api / order-builder.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import * as _ from "lodash";
6 import { Resource } from "../../models/resource";
7
8 export default class OrderBuilder<T extends Resource = Resource> {
9
10     static create<T extends Resource = Resource>(prefix?: string){
11         return new OrderBuilder<T>([], prefix);
12     }
13
14     private constructor(
15         private order: string[] = [], 
16         private prefix = ""){}
17
18     private addRule (direction: string, attribute: keyof T) {
19         const prefix = this.prefix ? this.prefix + "." : "";
20         const order = [...this.order, `${prefix}${_.snakeCase(attribute.toString())} ${direction}`];
21         return new OrderBuilder<T>(order, prefix);
22     }
23
24     addAsc(attribute: keyof T) {
25         return this.addRule("asc", attribute);
26     }
27
28     addDesc(attribute: keyof T) {
29         return this.addRule("desc", attribute);
30     }
31
32     concat(orderBuilder: OrderBuilder){
33         return new OrderBuilder<T>(
34             this.order.concat(orderBuilder.getOrder()),
35             this.prefix
36         );
37     }
38
39     getOrder() {
40         return this.order.slice();
41     }
42 }