This package is aimed at being a modern, production-level, batteries-included starting template for writing web servers with Haskell on backend and Elm on frontend. It follows the Three Layer Cake. architecture pattern.
Haskell libraries used in here:
relude: alternative prelude; here
base-nopreludetrick is used.
co-log: composable contravariant comonadic logging library.
postgresql-simple: mid-level PostgreSQL client library for database interaction.
servant: family of libraries for defining webservices Rest API on type-level.
elm-street: bridge between Elm and Haskell - generating Elm data types, JSON encoders and decoders automatically from Haskell types.
proto-lens: Protobuf messages for integration with the mobile application.
ekg: application performance monitoring.
bcrypt: password hashing functions.
jwt: user authentication via JWT.
hedgehog: testing libraries.
Detailed approach description
This section contains more detailed description of the chosen architecture and our particular implementation of it.
Data type for the runtime environment for the whole application is defined in
Lib/App/Env.hs module. It contains various fields
required for the application processing, like database pool, JWT secret, logger,
etc. It also has instance of custom
Has typeclass which tells how to extract
different parts of the application. This is done to achieve the following purposes:
- Specify in the constraints what parts of the environment you need.
- Introduce more modularity when multiple different environments are implemented.
Environment initialisation is happening in the
Lib/App/Error.hs contains exhaustive list of
all errors that application can throw. This module provides convenient layer
between human-readable error names and HTTP error codes. It also contains useful
utilities for throwing errors and for formatting
CallStack of errors.
Main application monad can be found in the
This template uses PostgreSQL database and contains helper wrappers around
functions from the
postgresql-simple library to integrate smoother with our
own monad. See
Lib/Db/Functions.hs for more details.
All new effects (like sending an email. storing the file, etc.) should be added