@thisisagile/easy
Version:
Straightforward library for building domain-driven microservice architectures
49 lines (39 loc) • 1.39 kB
text/typescript
import { json, Json, JsonValue } from '../types/Json';
import { Sort } from '../types/Sort';
import { convert, Convert } from '../utils/Convert';
import { isDefined } from '../types/Is';
export class Condition {
constructor(
readonly key: string,
readonly operator: string,
readonly value: unknown
) {}
and = (...others: Condition[]): LogicalCondition => new LogicalCondition('and', [this, ...others]);
or = (...others: Condition[]): LogicalCondition => new LogicalCondition('or', [this, ...others]);
toJSON(): Json {
return { [this.key]: { [`$${this.operator}`]: json.parse(this.value) } };
}
}
export class LogicalCondition {
constructor(
readonly operator: string,
readonly conditions: Condition[]
) {}
toJSON(): Json {
return { [`$${this.operator}`]: this.conditions.map(c => c.toJSON()) };
}
}
export class SortCondition extends Condition implements Sort {
constructor(
readonly key: string,
readonly value: -1 | 1
) {
super(key, '', value);
}
toJSON(): Json {
return { [this.key]: this.value };
}
}
export const toCondition = (field: string, operator: string, value: unknown, conv: Convert = convert.default): Condition =>
new Condition(field, operator, conv.from(value) as JsonValue);
export const isSortCondition = (s?: unknown): s is SortCondition => isDefined(s) && s instanceof SortCondition;