/one_and_done

Idempotent API requests made easy

Primary LanguageElixirMIT LicenseMIT

One and Done

One and Done is the easiest way to make HTTP requests idempotent in Elixir applications.

One and Done supports the following frameworks:

  • Plug (including Phoenix)

Usage

One and Done depends on having a pre-existing cache like Nebulex. This guide assumes Nebulex is already configured under MyApp.Cache.

  1. Add one_and_done to your mix.exs dependencies:
def deps do
  [
    {:one_and_done, "~> 0.1.5"}
  ]
end
  1. Add OneAndDone to your Plug pipeline:
defmodule MyAppWeb.Router do
  use MyAppWeb, :router

  pipeline :api do
    # Configuration options for OneAndDone are in the docs
    plug OneAndDone.Plug, cache: MyApp.Cache
  end

  # By default, all POST and PUT requests piped through :api
  # that have an Idempotency-Key header set will be cached for 24 hours.
  scope "/api", MyAppWeb do
    pipe_through :api

    resources "/users", UserController
  end
end
  1. Make your requests idempotent by adding the Idempotency-Key header:
curl -X POST \
  http://localhost:4000/api/users \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 123' \
  -d '{
  "email": "hello@example.com",
  "password": "password"
  }'

Repeat the request with the same Idempotency-Key header and you will get the same response without the request being processed again.