serverless/serverless-graphql-blog

Name: serverless-graphql-blog

Owner: Serverless

Description: A Serverless Blog leveraging GraphQL to offer a REST API with only 1 endpoint using Serverless v0.5

Created: 2016-01-19 01:53:44.0

Updated: 2018-05-21 06:03:35.0

Pushed: 2017-08-18 16:08:55.0

Homepage:

Size: 251

Language: JavaScript

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

Serverless GraphQL Blog AWS Lambda API Gateway

serverless

Please note this project uses Serverless version 0.5

serverless-graphql-blog

This Serverless Framework Project creates a REST API for a basic blog structure, including Posts, Authors and Comments utilizing GraphQL and DynamoDB for persistent storage. What's unique about this implementation is the entire REST API consists of only 1 endpoint.

Note: This project automatically creates 3 DynamoDB tables upon serverless project install. They are defined in s-project.json.

Enjoy,
Kevin Old (Twitter)

Install & Deploy

Make sure you have the most recent version of the Serverless Framework (0.5.x and higher) and you are using NodeV4 or greater.

install serverless -g

Install this Serverless Project:

erless project install serverless-graphql-blog

Install (top level) npm dependencies

install

View project summary:

erless dash summary

Deploy the project's Function and Endpoint:

erless dash deploy

Serverless GraphQL Blog Video Walkthrough

Querying with GraphiQL

The graphql-js endpoint provided in this Serverless Project is compatible with GraphiQL, a query visualization tool used with graphql-js.

Usage with GraphiQL.app (an Electron wrapper around GraphiQL) is recommended and is shown below:

GraphiQL.app demo

Sample GraphQL queries
List of author names
 -XPOST -d '{"query": "{ authors { name } }"}' <endpoint>/dev/blog/graphql
Results

ata":{
"authors":[
  {"name":"Kevin"}
]


List of posts with id and title
 -XPOST -d '{"query": "{ posts { id, title } }"}' <endpoint>/dev/blog/graphql
Results

ata": {
"posts": [
  { "id":"1",
    "title":"First Post Title"
  }
]


List of posts with id, title and nested author name
 -XPOST -d '{"query": "{ posts { id, title, author { name } } }"}' <endpoint>/dev/blog/graphql
Results

ata": {
"posts": [
  { "id":"1",
    "title":"First Post Title",
    "author":{
      "name":"Kevin"
    }
  }
]


List of posts with post, author and comments information (for a Post with no comments, i.e. comments:[])
 -XPOST -d '{"query": "{ posts { id, title, author { id, name }, comments { id, content, author { name } } } }"}' <endpoint>/dev/blog/graphql
Results

ata":{
"posts":[
{
  "id":"1",
    "title":"First Post Title",
    "author":{
      "id":"1",
      "name":"Kevin"
    },
    "comments":[]
}
]


Sample GraphQL Mutations
Create Post
 -XPOST -d '{"query": "mutation createNewPost { post: createPost (id: \"5\", title: \"Fifth post!\", bodyContent: \"Test content\", author: \"1\") { id, title } }"}' <endpoint>/dev/blog/graphql
Results

ata":{
"post":{
  "id":"5",
  "title":"Fifth post!"
}


Mutation Validation

Validations defined using graphql-custom-types in blog/lib/schema.js

 -XPOST -d '{"query": "mutation createNewPost { post: createPost (id: \"8\", title: \"123456789\", bodyContent: \"Test content 5\") { id, title } }"}' <endpoint>/dev/blog/graphql
Results

rrors":[

"message":"Query error: String not long enough"}


Introspection Query
 -XPOST -d '{"query": "{__schema { queryType { name, fields { name, description} }}}"}' <endpoint>/dev/blog/graphql

Returns:


ata":{
"__schema":{
  "queryType":{
    "name":"BlogSchema",
      "fields":[
      {
        "name":"posts",
        "description":"List of posts in the blog"
      },
      {
        "name":"authors",
        "description":"List of Authors"
      },
      {
        "name":"author",
        "description":"Get Author by id"
      }
    ]
  }
}



This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.