mirror of
https://github.com/algora-io/tv.git
synced 2025-03-17 20:17:45 +02:00
39 lines
812 B
Elixir
39 lines
812 B
Elixir
defmodule Algora.Cache do
|
|
def refetch(key, f) do
|
|
result = f.()
|
|
key |> path() |> write(result)
|
|
result
|
|
end
|
|
|
|
def fetch(key, f) do
|
|
case key |> path() |> read() do
|
|
{:ok, result} -> result
|
|
{:error, _} -> refetch(key, f)
|
|
end
|
|
end
|
|
|
|
def path(key) do
|
|
path = key |> String.split("/") |> Enum.map(&Slug.slugify/1)
|
|
|
|
dir =
|
|
case Algora.config([:mode]) do
|
|
:prod -> "/data"
|
|
_ -> :code.priv_dir(:algora)
|
|
end
|
|
|
|
Path.join([dir, "cache"] ++ path)
|
|
end
|
|
|
|
defp write(path, content) do
|
|
File.mkdir_p!(Path.dirname(path))
|
|
File.write(path, :erlang.term_to_binary(content))
|
|
end
|
|
|
|
defp read(path) do
|
|
case File.read(path) do
|
|
{:ok, binary} -> {:ok, :erlang.binary_to_term(binary)}
|
|
{:error, error} -> {:error, error}
|
|
end
|
|
end
|
|
end
|