Absinthe showcase: Battery included GraphQL sample

Hello,
I’ve written a GraphQL server with Absinthe as a proof of concept and a prototype for the next project.

I found some samples, Absinthe Tutorial Codel for example, and those were good start as the first step, but the learning curve would be too steep when you want to implement some logics, such as avoiding an N+1 problem with dataloader, authorizing users, injecting some values into the result returned from dataloader, etc.

You can get the source code and some description about it here: absinthe_showcase

Features

  • Battery included

    • You can soon try in Docker Compose.
  • Written in the latest libraries:

    • OTP 21, Elixir 1.7.4
    • Phoenix 1.4, Ecto 3.0
    • Absinthe 1.4.13
  • Avoiding N+1 problem with dataloader

  • Authorizing user permission with a custom middleware

  • Count the number of records regardless of LIMIT/OFFSET specified, which is very useful in pagination

  • Supports multistage query such as {questions{users{} answers{}}}, {me {users{} questions{} answers{}}}, {questions{answers{users{}}}}, etc.

  • Various queries/mutations

    • mutations
      • login with email and password; supports two permissions
        • normal user
        • admin user
      • create user account
        • the only admin user can create new accounts
        • guests(no login user) or normal users are rejected
    • query
      • various queries includes total record counts

Feedback welcome!

This is the first time I’ve written an application with Absinthe. Any suggestions for improving this application, even the mistakes you find in my English, are welcome.

8 Likes

At Novistore we’re currently writing a big e-commerce app with Absinthe (GraphQL).

Having a lot of entities I found putting everything in 1 types file easier than putting the queries and mutations in the schema like you did.

Checkout a sample app I’ve made a while back to illustrate my point.

schema.ex
https://github.com/hl/blog/blob/master/lib/blog_api/schema.ex

post_types.ex
https://github.com/hl/blog/blob/master/lib/blog_api/schema/post_types.ex

Having a lot of entities I found putting everything in 1 types file easier than putting the queries and mutations in the schema like you did.

@hlx I’ve never thought of it!
Thank you for your feedback.