Files
music_library/lib/music_library/assets/transform.ex
T
Claudio Ortolina c5d856fdd8 Add Transform.new/1
2025-09-19 23:58:09 +03:00

48 lines
1.1 KiB
Elixir

defmodule MusicLibrary.Assets.Transform do
@derive JSON.Encoder
defstruct [:hash, :width]
@type t :: %__MODULE__{}
@type payload :: String.t()
def new(attrs \\ %{}), do: struct!(__MODULE__, attrs)
@doc """
iex> alias MusicLibrary.Assets.Transform
iex> transform = %Transform{hash: "abc123", width: 300}
iex> Transform.encode!(transform)
"eyJoYXNoIjoiYWJjMTIzIiwid2lkdGgiOjMwMH0"
"""
@spec encode!(t()) :: payload()
def encode!(transform) do
transform
|> JSON.encode!()
|> Base.url_encode64(padding: false)
end
@doc """
iex> alias MusicLibrary.Assets.Transform
iex> payload = "eyJoYXNoIjoiYWJjMTIzIiwid2lkdGgiOjMwMH0"
iex> Transform.decode!(payload)
%Transform{hash: "abc123", width: 300}
"""
@spec decode!(payload()) :: t()
def decode!(payload) do
params =
payload
|> Base.url_decode64!(padding: false)
|> JSON.decode!()
struct!(__MODULE__, %{
hash: params["hash"],
width: params["width"]
})
end
end
defimpl Phoenix.Param, for: MusicLibrary.Assets.Transform do
def to_param(transform) do
MusicLibrary.Assets.Transform.encode!(transform)
end
end