refs # Merge branch 'origin/remove-default-exports'
[arvados-workbench2.git] / src / common / api / order-builder.ts
index cc3eadbb904ffb947c34121f8852a35fab256b18..ed990541c61bb960e4b1a5074a4530570d1617eb 100644 (file)
@@ -2,21 +2,41 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
+import * as _ from "lodash";
+import { Resource } from "../../models/resource";
 
-export default class OrderBuilder {
-    private order: string[] = [];
+export class OrderBuilder<T extends Resource = Resource> {
 
-    addAsc(attribute: string) {
-        this.order.push(`${attribute} asc`);
-        return this;
+    static create<T extends Resource = Resource>(prefix?: string){
+        return new OrderBuilder<T>([], prefix);
     }
 
-    addDesc(attribute: string) {
-        this.order.push(`${attribute} desc`);
-        return this;
+    private constructor(
+        private order: string[] = [],
+        private prefix = ""){}
+
+    private addRule (direction: string, attribute: keyof T) {
+        const prefix = this.prefix ? this.prefix + "." : "";
+        const order = [...this.order, `${prefix}${_.snakeCase(attribute.toString())} ${direction}`];
+        return new OrderBuilder<T>(order, prefix);
+    }
+
+    addAsc(attribute: keyof T) {
+        return this.addRule("asc", attribute);
+    }
+
+    addDesc(attribute: keyof T) {
+        return this.addRule("desc", attribute);
+    }
+
+    concat(orderBuilder: OrderBuilder){
+        return new OrderBuilder<T>(
+            this.order.concat(orderBuilder.getOrder()),
+            this.prefix
+        );
     }
 
-    get() {
-        return this.order;
+    getOrder() {
+        return this.order.slice();
     }
 }