109 lines
2.0 KiB
Elixir

defmodule Bright.Cache do
@moduledoc """
A simple caching module that saves files to the `/tmp` directory.
"""
alias Bright.Streams.Vod
@cache_dir Path.join(System.user_home!(), ".cache/futureporn")
require Logger
def cache_dir do
@cache_dir
end
def generate_basename(input) do
prefix = :crypto.strong_rand_bytes(6) |> Base.encode64(padding: false) |> String.replace(~r/[^a-zA-Z0-9]/, "")
base = Path.basename(input)
"#{prefix}-#{base}"
end
def generate_basename(input, ext) do
input
|> generate_basename
|> Path.rootname
|> Kernel.<>(".#{ext}")
end
def generate_filename(input) do
Path.join(@cache_dir, generate_basename(input))
end
def generate_filename(input, ext) do
Path.join(@cache_dir, generate_basename(input, ext))
end
def get_cache_dir do
@cache_dir
end
# Ensure the cache directory exists
def ensure_cache_dir! do
unless File.exists?(@cache_dir) do
File.mkdir_p!(@cache_dir)
end
end
@doc """
Delete a cached item by its key.
## Examples
iex> Bright.Cache.delete("example_key")
:ok
iex> Bright.Cache.delete("nonexistent_key")
:ok
"""
def delete(key) do
ensure_cache_dir!()
file_path = generate_filename(key)
case File.rm(file_path) do
:ok ->
Logger.debug("[Cache] Deleted key #{key} from #{file_path}")
:ok
{:error, :enoent} ->
Logger.debug("[Cache] Key #{key} not found for deletion")
:ok
{:error, reason} ->
Logger.error("[Cache] Failed to delete key #{key}: #{reason}")
{:error, reason}
end
end
@doc """
Clear all cached data.
## Examples
iex> Bright.Cache.clear()
:ok
"""
def clear do
ensure_cache_dir!()
case File.rm_rf(@cache_dir) do
{:ok, _} ->
Logger.debug("[Cache] Cleared all cached data")
ensure_cache_dir!()
:ok
{:error, reason} ->
Logger.error("[Cache] Failed to clear cache: #{reason}")
{:error, reason}
end
end
end