defmodule Scribble.EmailHandler.AudioFile do
use Ash.Resource, data_layer: AshPostgres.DataLayer
postgres do
table "audio_files"
repo(Scribble.Repo)
end
attributes do
uuid_primary_key :id
attribute :hash, :string, allow_nil?: false
attribute :url, :string, allow_nil?: false
end
identities do
identity :hash, [:hash], eager_check_with: Scribble.EmailHandler
end
code_interface do
define_for Scribble.EmailHandler
define :create_with_binary, args: [:audio_file]
end
actions do
defaults [:read]
create :create_with_binary do
argument :audio_file, :map, allow_nil?: false
accept []
change fn changeset, _context ->
Ash.Changeset.before_action(changeset, fn changeset ->
audio_file = Ash.Changeset.get_argument(changeset, :audio_file)
filename = audio_file_hash(audio_file)
{:ok, ^filename} =
Scribble.Recording.store(%{filename: filename, binary: audio_file.binary})
url = Scribble.Recording.url(filename)
Ash.Changeset.change_attributes(changeset, %{url: url, hash: filename})
end)
end
end
end
defp audio_file_hash(%{binary: binary, extension: extension}) do
hash = Scribble.Scribe.audio_hash(binary)
"#{hash}#{extension}"
end
end
defmodule Scribble.EmailHandler.AudioFile do
use Ash.Resource, data_layer: AshPostgres.DataLayer
postgres do
table "audio_files"
repo(Scribble.Repo)
end
attributes do
uuid_primary_key :id
attribute :hash, :string, allow_nil?: false
attribute :url, :string, allow_nil?: false
end
identities do
identity :hash, [:hash], eager_check_with: Scribble.EmailHandler
end
code_interface do
define_for Scribble.EmailHandler
define :create_with_binary, args: [:audio_file]
end
actions do
defaults [:read]
create :create_with_binary do
argument :audio_file, :map, allow_nil?: false
accept []
change fn changeset, _context ->
Ash.Changeset.before_action(changeset, fn changeset ->
audio_file = Ash.Changeset.get_argument(changeset, :audio_file)
filename = audio_file_hash(audio_file)
{:ok, ^filename} =
Scribble.Recording.store(%{filename: filename, binary: audio_file.binary})
url = Scribble.Recording.url(filename)
Ash.Changeset.change_attributes(changeset, %{url: url, hash: filename})
end)
end
end
end
defp audio_file_hash(%{binary: binary, extension: extension}) do
hash = Scribble.Scribe.audio_hash(binary)
"#{hash}#{extension}"
end
end