X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d3f17ba544b22ae76f47401041362bbcefe95aaa..0be34acc576c9552f4c669062defe51c36888866:/src/common/api/order-builder.ts diff --git a/src/common/api/order-builder.ts b/src/common/api/order-builder.ts index 394cce5c56..b5a2e807a0 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 default 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.join(`","`)}"]`; + getOrder() { + return this.order.slice(); } }