web-haskell-graphql-postgres-boilerplate icon indicating copy to clipboard operation
web-haskell-graphql-postgres-boilerplate copied to clipboard

Modern webserver in Haskell: Graphql + Postgresql + Authentication + DB migration + Dotenv and more

Modern Haskell Webserver Boilerplate

  • Graphql API
    • morpheus-graphql (https://github.com/morpheusgraphql/morpheus-graphql)
    • Schema is in schema.graphql
      type User {
          id: Int!
          email: String!
          name: String!
          updatedAt: String!
          createdAt: String!
      }
    
      type Session {
          token: String!
          user: User!
      }
    
      type Query {
          login(email: String!, password: String!): Session!
          myUserInfo: User!
      }
    
      type Mutation {
          register(email: String!, password: String!, name: String!): Session!
          changePassword(oldPassword: String!, newPassword: String!): Boolean!
      }
    
  • Database:
    • Postgresql + Opaleye
    • Migration using dbmate (https://github.com/amacneil/dbmate)
    • Pooling using Data.Pool

This boilerplate wires up:

  • Reading .env using envy
  • Database
  • Graphql API
  • Authorization using JWT
  • Monad transformers

Running

  • Feed in you database & secret in .env:
    $ cp .env.default .env
    
    DATABASE_URL="postgres://Dandoh:[email protected]:5432/webhaskell?sslmode=disable"
    JWT_SECRET="my_jwt_secret"
    
  • Migrations
    $ dbmate up
    
    • More uses refer https://github.com/amacneil/dbmate
  • Run webserver
    $ stack run
    

Now GraphQL API is at http://localhost:8080/api

You can also access Graphql Playground at http://localhost:8080/graphiql

Playground

Running on Docker

  • Feed in you database & secret in .env:

    $ cp .env.default .env
    
  • (Optional) Edit anything you need in the .env file

  • Create and start docker containers

    $ docker-compose up
    
  • Now you can visit: http://localhost:8080/ in your local machine.

  • Migrations will automatically run, and you can run them manually anytime using

    $ docker-compose up dbmate
    
  • Stack will restart whenever you change any .hs file, thanks to entr

Contributors

PR are more than welcome. The only note is we use ormolu to format codes.