lib/elph_web/views/media_view.ex

defmodule ElphWeb.MediaView do
  @moduledoc """
  This module contains views and helper functions for rendering of media content types.
  """

  use ElphWeb, :view

  defp url_upload_dir do
    Application.get_env(:elph, :url_upload_dir)
  end

  def render_base(%{} = media) do
    %{
      mime: media.mime,
      filesize: media.filesize,
      url: build_url(media.hash, default_filename(media.extension)),
      filename: media.filename,
      extension: media.extension,
      alt: media.alt,
      subtext: media.subtext,
      copyright: media.copyright
    }
  end

  def render("image.json", %{media: media}) do
    Map.merge(
      render_base(media),
      %{
        thumbnail: build_url(media.hash, media.thumbnail)
      }
    )
  end

  def render("video.json", %{media: media}) do
    Map.merge(
      render_base(media),
      %{
        thumbnail: build_url(media.hash, media.thumbnail),
        poster: build_url(media.hash, media.poster),
        mp4: build_url(media.hash, media.mp4),
        mp4_conversion: media.mp4_conversion
      }
    )
  end

  def render("audio.json", %{media: media, action: :index}) do
    Map.merge(
      render_base(media),
      %{
        mp3: build_url(media.hash, media.mp3),
        mp3_conversion: media.mp3_conversion,
        transcript_id: media.transcript_id
      }
    )
  end

  def render("audio.json", %{media: media, action: :show}) do
    Map.merge(
      render("audio.json", %{media: media, action: :index}),
      %{
        transcript:
          render_one(media.transcript, ElphWeb.ContentView, "content_with_children.json")
      }
    )
  end

  def default_filename(extension) do
    "original" <> extension
  end

  def build_url(_hash, nil) do
    nil
  end

  def build_url(hash, filename) do
    Path.join([url_upload_dir(), hash, filename])
  end
end