@searchkit/schema
Version:
Elasticsearch GraphQL Resolvers
251 lines (226 loc) • 6.29 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const graphql_tag_1 = __importDefault(require("graphql-tag"));
const resolvers_1 = require("./resolvers");
const baseSearchkitTypeDefs = graphql_tag_1.default `
type SKSortOption {
id: ID!
label: String!
}
type SKSummary {
total: Float!
appliedFilters: [SKSelectedFilter]
disabledFilters: [SKDisabledFilter]
query: String
sortOptions: [SKSortOption]
}
type SKDisabledFilter {
identifier: String!
}
interface SKSelectedFilter {
id: ID!
identifier: String!
label: String!
display: String!
}
type ValueSelectedFilter implements SKSelectedFilter {
id: ID!
identifier: String!
display: String!
label: String!
value: String!
}
type NumericRangeSelectedFilter implements SKSelectedFilter {
id: ID!
identifier: String!
label: String!
display: String!
min: Float
max: Float
}
type DateRangeSelectedFilter implements SKSelectedFilter {
id: ID!
identifier: String!
label: String!
display: String!
dateMin: String!
dateMax: String!
}
type GeoBoundingBoxSelectedFilter implements SKSelectedFilter {
id: ID!
identifier: String!
label: String!
display: String!
topLeft: SKGeoPoint
bottomRight: SKGeoPoint
bottomLeft: SKGeoPoint
topRight: SKGeoPoint
}
type HierarchicalValueSelectedFilter implements SKSelectedFilter {
id: ID!
identifier: String!
label: String!
display: String!
level: Int!
value: String!
}
type SKGeoPoint {
lat: Float!
lon: Float!
}
type SKPageInfo {
total: Float
totalPages: Float
pageNumber: Float
from: Float
size: Float
}
type SKHitResults {
items: [SKHit]
page: SKPageInfo
sortedBy: String
}
interface SKHit {
id: ID!
}
input SKPageInput {
from: Float
size: Float
}
input SKQueryOptions {
fields: [String]
}
input SKFiltersSet {
identifier: String!
value: String
min: Float
max: Float
dateMin: String
dateMax: String
geoBoundingBox: SKGeoBoundingBoxInput
level: Int
}
input SKGeoBoundingBoxInput {
topLeft: SKGeoPointInput
bottomRight: SKGeoPointInput
topRight: SKGeoPointInput
bottomLeft: SKGeoPointInput
}
input SKGeoPointInput {
lat: Float!
lon: Float!
}
interface SKFacetSet {
identifier: String
label: String
type: String
display: String
entries: [SKFacetSetEntry]
}
type SKFacetSetEntry {
label: String
count: Float
isSelected: Boolean
level: Int
entries: [SKFacetSetEntry]
}
type RefinementSelectFacet implements SKFacetSet {
identifier: String
label: String
type: String
display: String
entries: [SKFacetSetEntry]
}
type RangeFacet implements SKFacetSet {
identifier: String
label: String
type: String
display: String
entries: [SKFacetSetEntry]
}
type DateRangeFacet implements SKFacetSet {
identifier: String
label: String
type: String
display: String
entries: [SKFacetSetEntry]
}
type HierarchicalMenuFacet implements SKFacetSet {
identifier: String
label: String
type: String
display: String
entries: [SKFacetSetEntry]
}
`;
exports.default = (schemaConfigs) => {
const { typeDefs, context, resolvers } = (Array.isArray(schemaConfigs) ? schemaConfigs : [schemaConfigs]).reduce((sum, schemaConfig) => {
const typeName = schemaConfig.typeName;
const extendQuery = schemaConfig.addToQueryType
? `
extend type Query {
results(query: String, queryOptions: SKQueryOptions, filters: [SKFiltersSet], page: SKPageInput): ${typeName}
}`
: '';
const configTypeDefs = graphql_tag_1.default `
type ${typeName} {
summary: SKSummary
hits(page: SKPageInput, sortBy: String): SKHitResults
facets: [SKFacetSet]
facet(identifier: String!, query: String, size: Float): SKFacetSet
}
${extendQuery}
`;
return {
typeDefs: [...sum.typeDefs, configTypeDefs],
resolvers: Object.assign(Object.assign(Object.assign({}, sum.resolvers), { [typeName]: {
hits: resolvers_1.HitsResolver,
facets: resolvers_1.FacetsResolver,
facet: resolvers_1.FacetResolver,
summary: resolvers_1.SummaryResolver
} }), (schemaConfig.addToQueryType
? {
Query: Object.assign(Object.assign({}, sum.resolvers.Query), { results: resolvers_1.SearchkitResolver })
}
: {
Query: sum.resolvers.Query
})),
context: {
searchkit: {
configs: Object.assign(Object.assign({}, sum.context.searchkit.configs), { [typeName]: schemaConfig.config }),
baseFilters: Object.assign(Object.assign({}, sum.context.searchkit.baseFilters), { [typeName]: schemaConfig.getBaseFilters }),
hitTypeMappings: Object.assign(Object.assign({}, sum.context.searchkit.hitTypeMappings), { [typeName]: schemaConfig.hitTypeName })
}
}
};
}, {
typeDefs: [baseSearchkitTypeDefs],
resolvers: {
SKHit: {
__resolveType: (e) => e.type
},
SKFacetSet: {
__resolveType: (e) => e.type
},
SKSelectedFilter: {
__resolveType: (e) => e.type
},
Query: {}
},
context: {
searchkit: {
configs: {},
baseFilters: {},
hitTypeMappings: {}
}
}
});
return {
typeDefs,
withSearchkitResolvers: (userResolvers = {}) => (Object.assign(Object.assign(Object.assign({}, userResolvers), resolvers), { Query: Object.assign(Object.assign({}, userResolvers.Query), resolvers.Query) })),
context
};
};