X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/e0cb98c44ed8f32f269d2b9f878184263cd14192..b6a5b173cd4e9f325f371d26204dfe156d911c20:/src/common/api/order-builder.ts diff --git a/src/common/api/order-builder.ts b/src/common/api/order-builder.ts index cc3eadbb..ed990541 100644 --- a/src/common/api/order-builder.ts +++ b/src/common/api/order-builder.ts @@ -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 { - addAsc(attribute: string) { - this.order.push(`${attribute} asc`); - return this; + static create(prefix?: string){ + return new OrderBuilder([], 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(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( + this.order.concat(orderBuilder.getOrder()), + this.prefix + ); } - get() { - return this.order; + getOrder() { + return this.order.slice(); } }