Skip to content

Instantly share code, notes, and snippets.

@simenbrekken
Created December 21, 2016 14:06
Show Gist options
  • Save simenbrekken/0356ea0edaef4724f0ca25a162e4eb4e to your computer and use it in GitHub Desktop.
Save simenbrekken/0356ea0edaef4724f0ca25a162e4eb4e to your computer and use it in GitHub Desktop.
Firebase backed GraphQL schema
import firebase from 'firebase'
import { filter, map } from 'lodash'
import { makeExecutableSchema } from 'graphql-tools'
firebase.initializeApp({
databaseURL: 'https://grafire-b1b6e.firebaseio.com',
})
const mapSnapshotToEntity = snapshot => ({ id: snapshot.key, ...snapshot.val() })
const mapSnapshotToEntities = snapshot => map(snapshot.val(), (value, id) => ({ id, ...value }))
const ref = path => firebase.database().ref(path)
const getValue = path => ref(path).once('value')
const getEntity = path => getValue(path).then(mapSnapshotToEntity)
const getEntities = path => getValue(path).then(mapSnapshotToEntities)
// http://dev.apollodata.com/tools/graphql-tools/resolvers.html
const resolvers = {
Author: {
posts(author) {
return getEntities('posts').then(posts => filter(posts, { authorId: author.id }))
},
},
Post: {
author(post) {
return getEntities('authors').then(posts => filter(authors, { id: authorId }))
},
},
Query: {
posts() {
return getEntities('posts')
},
authors() {
return getEntities('authors')
}
},
}
const schema = `
type Author {
id: Int!
firstName: String
lastName: String
posts: [Post]
}
type Post {
id: Int!
title: String
author: Author
}
type Query {
posts: [Post]
authors: [Author]
}
`
export default makeExecutableSchema({ typeDefs: schema, resolvers })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment