From db24373f70e52fb18ffacc8d376ddcf4f54cc036 Mon Sep 17 00:00:00 2001 From: Kenneth Trecy Tobias <19201.tobias.kennethtrecy.c@gmail.com> Date: Mon, 14 Nov 2022 01:44:56 +0800 Subject: [PATCH] intrn(query): make query to filter posts by time range --- database/queries/post/sift_by_range.spec.ts | 52 +++++++++++++++++++++ database/queries/post/sift_by_range.ts | 38 +++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 database/queries/post/sift_by_range.spec.ts create mode 100644 database/queries/post/sift_by_range.ts diff --git a/database/queries/post/sift_by_range.spec.ts b/database/queries/post/sift_by_range.spec.ts new file mode 100644 index 000000000..93a3f67fa --- /dev/null +++ b/database/queries/post/sift_by_range.spec.ts @@ -0,0 +1,52 @@ +import Model from "%/models/post" +import Factory from "~/factories/post" + +import pipe from "./sift_by_range" + +describe("Database Pipe: Sift by range", () => { + it("can find inside time span", async() => { + const CURRENT_TIME = new Date() + const TIME_OFFSET = 10 + const BEGIN_TIME = new Date() + BEGIN_TIME.setSeconds(CURRENT_TIME.getSeconds() - TIME_OFFSET) + const END_TIME = new Date() + END_TIME.setSeconds(CURRENT_TIME.getSeconds() + TIME_OFFSET * 2) + const model = await new Factory().insertOne() + + const options = pipe({}, { + "filter": { + "dateTimeRange": { + "begin": BEGIN_TIME, + "end": END_TIME + } + } + }) + + const foundModels = await Model.findAll(options) + + expect(foundModels).toHaveLength(1) + expect(foundModels).toHaveProperty("0.id", model.id) + }) + + it("cannot find outside time span", async() => { + const CURRENT_TIME = new Date() + const TIME_OFFSET = 5 + const BEGIN_TIME = new Date() + BEGIN_TIME.setSeconds(CURRENT_TIME.getSeconds() - TIME_OFFSET * 2) + const END_TIME = new Date() + END_TIME.setSeconds(CURRENT_TIME.getSeconds() - TIME_OFFSET) + await new Factory().insertOne() + + const options = pipe({}, { + "filter": { + "dateTimeRange": { + "begin": BEGIN_TIME, + "end": END_TIME + } + } + }) + const foundModels = await Model.findAll(options) + + expect(foundModels).toHaveLength(0) + }) +}) diff --git a/database/queries/post/sift_by_range.ts b/database/queries/post/sift_by_range.ts new file mode 100644 index 000000000..9d70533c6 --- /dev/null +++ b/database/queries/post/sift_by_range.ts @@ -0,0 +1,38 @@ +import type { FindOptions } from "%/types/dependent" +import type { DateTimeRangeFilter } from "$/types/query" + +import Log from "$!/singletons/log" + +import Condition from "%/helpers/condition" +import isUndefined from "$/type_guards/is_undefined" + +/** + * Sift post models which within a certain range. + */ +export default function( + currentState: FindOptions, + constraints: DateTimeRangeFilter +): FindOptions { + const newState = { ...currentState } + + const { dateTimeRange } = constraints.filter + + if (isUndefined(newState.where)) { + newState.where = {} + } + + const condition = new Condition() + condition.and( + new Condition().greaterThanOrEqual("createdAt", dateTimeRange.begin), + new Condition().lessThanOrEqual("createdAt", dateTimeRange.end) + ) + + newState.where = new Condition().and( + new Condition(newState.where), + condition + ).build() + + Log.trace("pipeline", "sift by range") + + return newState +}