//
// 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<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.join(`","`)}"]`;
+ getOrder() {
+ return this.order.slice();
}
}