diff --git a/graphql/filter.ts b/graphql/filter.ts new file mode 100644 index 0000000..41f74e8 --- /dev/null +++ b/graphql/filter.ts @@ -0,0 +1,31 @@ +type BaseFilter = { + createVars: () => { [key: string]: any }; +}; + +function createBaseFilter(key: string, content: any): BaseFilter { + return { + createVars: () => ({ [key]: content }), + }; +} + +export function createAndFilter(filters: Array): BaseFilter { + const filterVars = filters.map((filter) => filter.createVars()); + return createBaseFilter("andFilters", { filters: filterVars }); +} + +export function createCategoryFilter( + feature: string, + value: string, +): BaseFilter { + const content = { [feature]: { value } }; + return createBaseFilter(feature, content); +} + +export function createRangeFilter( + feature: string, + greaterThanEqualTo: number, + lessThan: number, +): BaseFilter { + const content = { greaterThanEqualTo, lessThan }; + return createBaseFilter(feature, content); +} diff --git a/graphql/query.ts b/graphql/query.ts index b4329cf..7a06588 100644 --- a/graphql/query.ts +++ b/graphql/query.ts @@ -2,6 +2,7 @@ import { gql } from "@apollo/client"; export const GET_SHOTS = gql` query GetShots( + $filterInput: FilterInput $includeCueObjectDistance: Boolean! = false $includeTargetPocketDistance: Boolean! = false $includeCueObjectAngle: Boolean! = false @@ -10,7 +11,7 @@ export const GET_SHOTS = gql` $includeShotDirection: Boolean! = false $includeDidMake: Boolean! = false ) { - getShots { + getShots(filterInput: $filterInput) { id videoId startFrame diff --git a/test/graphql/filter.test.ts b/test/graphql/filter.test.ts new file mode 100644 index 0000000..ca79b99 --- /dev/null +++ b/test/graphql/filter.test.ts @@ -0,0 +1,28 @@ +import { createAndFilter, createRangeFilter } from "../../graphql/filter"; + +describe("create filterInput", () => { + it("should create a filter input with the correct structure", () => { + const feature = "cueObjectAngle"; + const greaterThanEqualTo = 10; + const lessThan = 20; + + const rangeFilter = createRangeFilter( + feature, + greaterThanEqualTo, + lessThan, + ); + const andFilterInput = createAndFilter([rangeFilter]); + expect(andFilterInput.createVars()).toEqual({ + andFilters: { + filters: [ + { + [feature]: { + greaterThanEqualTo, + lessThan, + }, + }, + ], + }, + }); + }); +});