three-layer

by Holmusk

Holmusk / three-layer

:three: :cake: Architecture of the Haskell web applications

231 Stars 15 Forks Last release: Not found BSD 3-Clause "New" or "Revised" License 44 Commits 0 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

Logo CircleCI

three-layer

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-noprelude
trick 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. *
hspec
and
hedgehog
: testing libraries.

Detailed approach description

This section contains more detailed description of the chosen architecture and our particular implementation of it.

Application environment

Data type for the runtime environment for the whole application is defined in the

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:
  1. Specify in the constraints what parts of the environment you need.
  2. Introduce more modularity when multiple different environments are implemented.

Environment initialisation is happening in the

Lib.hs
module.

Application errors

Module

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.

Application monad

Main application monad can be found in the

Lib/App/Monad.hs
module.

Database

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.

Effects

All new effects (like sending an email. storing the file, etc.) should be added to the

Lib/Effects/
directory.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.