Add immutability and concatenation of order builder
[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 "./common-resource-service";
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 getRule (direction: string, attribute: keyof T) {
19         const prefix = this.prefix ? this.prefix + "." : "";
20         return `${prefix}${_.snakeCase(attribute.toString())} ${direction}`;
21     }
22
23     addAsc(attribute: keyof T) {
24         return new OrderBuilder<T>(
25             [...this.order, this.getRule("asc", attribute)],
26             this.prefix
27         );
28     }
29
30     addDesc(attribute: keyof T) {
31         return new OrderBuilder<T>(
32             [...this.order, this.getRule("desc", attribute)],
33             this.prefix
34         );
35     }
36
37     concat(orderBuilder: OrderBuilder){
38         return new OrderBuilder<T>(
39             this.order.concat(orderBuilder.getOrder()),
40             this.prefix
41         );
42     }
43
44     getOrder() {
45         return this.order.slice();
46     }
47 }