@digicat/cf-graphql
Version:
Generate a GraphQL schema out of your Contentful space
104 lines (89 loc) • 2.23 kB
JavaScript
;
const _get = require('lodash.get');
const { documentToHtmlString } = require('@contentful/rich-text-html-renderer');
const {
GraphQLNonNull,
GraphQLString,
GraphQLObjectType,
GraphQLID,
GraphQLInterfaceType,
GraphQLFloat,
GraphQLInt
} = require('graphql');
const IDType = new GraphQLNonNull(GraphQLID);
const NonNullStringType = new GraphQLNonNull(GraphQLString);
const baseSysFields = {
id: {type: IDType},
createdAt: {type: NonNullStringType},
updatedAt: {type: NonNullStringType}
};
const entrySysFields = {
contentTypeId: {
type: IDType,
resolve: sys => _get(sys, ['contentType', 'sys', 'id'])
}
};
const SysType = new GraphQLInterfaceType({
name: 'Sys',
fields: baseSysFields
});
const AssetSysType = createSysType('Asset');
const EntrySysType = createSysType('Entry', entrySysFields);
const AssetType = new GraphQLObjectType({
name: 'Asset',
fields: {
sys: {type: AssetSysType},
title: {
type: NonNullStringType,
resolve: asset => asset.fields.title
},
description: {
type: GraphQLString,
resolve: asset => _get(asset, ['fields', 'description'])
},
url: {
type: NonNullStringType,
resolve: asset => asset.fields.file.url
}
}
});
const EntryType = new GraphQLInterfaceType({
name: 'Entry',
fields: {sys: {type: EntrySysType}}
});
const LocationType = new GraphQLObjectType({
name: 'Location',
fields: {
lon: {type: GraphQLFloat},
lat: {type: GraphQLFloat}
}
});
const DocumentType = new GraphQLObjectType({
name: 'Document',
fields: {
document: {type: GraphQLString, resolve: documentToHtmlString},
}
});
const CollectionMetaType = new GraphQLObjectType({
name: 'CollectionMeta',
fields: {count: {type: GraphQLInt}}
});
module.exports = {
IDType,
SysType,
AssetSysType,
EntrySysType,
AssetType,
EntryType,
LocationType,
DocumentType,
CollectionMetaType
};
function createSysType (entityType, extraFields) {
return new GraphQLNonNull(new GraphQLObjectType({
name: `${entityType}Sys`,
interfaces: [SysType],
fields: Object.assign({}, baseSysFields, extraFields || {}),
isTypeOf: sys => _get(sys, ['type']) === entityType
}));
}