Skip to content

Latest commit

 

History

History
123 lines (90 loc) · 3.02 KB

README.md

File metadata and controls

123 lines (90 loc) · 3.02 KB

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.3.1"}]
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 a struct ServerUtils.Session.t will be injected into the connection. The session data will include the JWT string and a map with the decoded payload from the token.

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