Packages
pow
1.0.26
1.0.39
1.0.38
1.0.37
1.0.36
1.0.35
1.0.34
1.0.33
1.0.32
1.0.31
1.0.30
1.0.29
1.0.28
1.0.27
1.0.26
1.0.25
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.1.0-rc.1
0.1.0-alpha.8
0.1.0-alpha.7
retired
0.1.0-alpha.6
0.1.0-alpha.5
0.1.0-alpha.4
0.1.0-alpha.3
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha
Robust user authentication solution
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/pow/store/backend/base.ex
defmodule Pow.Store.Backend.Base do
@moduledoc """
Used to set up API for key-value cache store.
[Erlang match specification](https://erlang.org/doc/apps/erts/match_spec.html)
format is used for the second argument `all/2` callback. The second argument
is only for the key match, and will look like
`[:namespace_1, :namespace_2, :_]` or `[:namespace_1, :_, :namespace_2]`.
## Usage
This is an example using [Cachex](https://hex.pm/packages/cachex):
defmodule MyAppWeb.Pow.CachexCache do
@behaviour Pow.Store.Backend.Base
alias Pow.Config
@cachex_tab __MODULE__
@impl true
def put(config, record_or_records) do
records =
record_or_records
|> List.wrap()
|> Enum.map(fn {key, value} ->
{wrap_namespace(config, key), value}
end)
{:ok, true} = Cachex.put_many(@cachex_tab, records, ttl: Config.get(config, :ttl))
:ok
end
@impl true
def delete(config, key) do
key = wrap_namespace(config, key)
{:ok, _value} = Cachex.del(@cachex_tab, key)
:ok
end
@impl true
def get(config, key) do
key = wrap_namespace(config, key)
case Cachex.get(@cachex_tab, key) do
{:ok, nil} -> :not_found
{:ok, value} -> value
end
end
@impl true
def all(config, key_match) do
query =
[{
{:_, wrap_namespace(config, key_match), :"$2", :"$3", :"$4"},
[Cachex.Query.unexpired_clause()],
[ :"$_" ]
}]
@cachex_tab
|> Cachex.stream!(query)
|> Enum.map(fn {_, key, _, _, value} -> {unwrap_namespace(key), value} end)
end
defp wrap_namespace(config, key) do
namespace = Config.get(config, :namespace, "cache")
[namespace | List.wrap(key)]
end
defp unwrap_namespace([_namespace, key]), do: key
defp unwrap_namespace([_namespace | key]), do: key
end
"""
alias Pow.Config
@type config() :: Config.t()
@type key() :: [binary() | atom()] | binary()
@type record() :: {key(), any()}
@type key_match() :: [atom() | binary()]
@callback put(config(), record() | [record()]) :: :ok
@callback delete(config(), key()) :: :ok
@callback get(config(), key()) :: any() | :not_found
@callback all(config(), key_match()) :: [record()]
end