Coverage Status Hex version Hex Docs Build Status Deps Status

ServerUtils

This project has several module utils to handle common tasks in a server, like authorization params parsing.

Features:

  • Phoenix plug to validate a JWT header
  • Pagination parsing:

    • Cursor pagination
    • Classic pagination
  • Simple integer parsing
  • JWT claims parser
  • Logger wrapper with Sentry integration

Installation

Add to dependencies

def deps do
  [{:server_utils, "~> 0.2.0"}]
end
mix deps.get

Configuration

Pagination

Configure default pagination params:

  • Classic pagination
config :server_utils,
  page_size_key: "page_size",
  page_number_key: "page_number",
  max_page_size: 25,
  page_size: 10,
  page_number: 1
  • Cursor pagination
config :server_utils,
  cursor_key: "cursor",
  number_of_items_key: "number_of_items",
  default_cursor: "",
  default_number_of_items: 25,
  max_number_of_items: 50

Usage

Check the documentation for the different available plugs.

Pagination

Set the plug in your router file to use it in a pipeline:

pipeline :paginated do
  plug(ServerUtils.Plugs.Pagination.Cursor.PageRequest)
end

scope "/" do
  pipe_through([:paginated])

  get("/stuff", MyApp.StuffController, :get_stuff)
end

Depending on the plug used, either a cursor or classic PageRequest.t() struct will be inject in the connection:

defmodule MyApp.StuffController do
  use MyApp, :controller

  def get_stuff(conn, params) do
    cursor_page_request = conn.private[:server_utils][:page_request]
    # Some other code using the cursor page request...
  end
end

Session

If the plug JWT is used, the authorization header will be validated and the session token will be injected into the connection.

pipeline :authenticated do
  plug(ServerUtils.Plugs.Session.JwtSession)
end

scope "/" do
  pipe_through([:authenticated])

  get("/protected_stuff", MyApp.StuffController, :get_protected_stuff)
end
defmodule MyApp.StuffController do
  use MyApp, :controller

  def get_protected_stuff(conn, params) do
    cursor_page_request = conn.private[:server_utils][:session]
    # Some other code using the authenticated request...
  end
end