------------------------------------------------------------------------------
-- Module:      Snap.Snaplet.SqliteSimple.JwtAuth
------------------------------------------------------------------------------

module Snap.Snaplet.SqliteSimple.JwtAuth (
  -- * Introduction
  -- $intro

  -- * Types
    SqliteJwt(..)
  , User(..)
  , AuthFailure(..)
  -- * Initialization
  , sqliteJwtInit
  -- * High-level handlers

  -- | Use these handlers to implement user registration, login and protecting
  -- routes with authentication.
  --
  -- If you need to customize error handling or need a different JSON schema
  -- for communicating between the server and client, you may wish the re-
  -- implement these using the low-level handlers documented later in the
  -- API ref.
  , registerUser
  , loginUser
  , requireAuth
  -- * Lower-level login handlers

  -- | Use these if you need more customized login/register user functionality.
  , createUser
  , login
  -- * Utility functions
  --
  -- | Helper functions for JSON request parameters and JSON responses.
  , jsonResponse
  , writeJSON
  , reqJSON
  ) where

import Snap.Snaplet.SqliteSimple.JwtAuth.Types
import Snap.Snaplet.SqliteSimple.JwtAuth.JwtAuth

-- $intro
-- NOTE: This is still very much a work-in-progress project!
--
-- A snap middleware for implementing JWT-based authentication with user
-- accounts persisted in a SQLite3 database.  It's intended use is to protect
-- server API routes used in single-page web applications (SPA) and mobile
-- applications.
--
-- See the https://github.com/nurpax/snap-reactjs-todo project for a full
-- application using this library.  It implements a todo application as an SPA
-- using React and Redux with a Haskell API server running on Snap and uses
-- this library to implement logins and route authentication.  This
-- <http://nurpax.github.io/posts/2016-11-01-react-redux-haskell-snap.html blog post>
-- has a walk-through of the application's source code.