defmodule Mobilizon.Media do @moduledoc """ The Media context. """ import Ecto.Query, warn: false alias Mobilizon.Repo alias Mobilizon.Media.Picture alias Mobilizon.Media.File alias Ecto.Multi @doc false def data() do Dataloader.Ecto.new(Mobilizon.Repo, query: &query/2) end @doc false def query(queryable, _params) do queryable end @doc """ Gets a single picture. Raises `Ecto.NoResultsError` if the Picture does not exist. ## Examples iex> get_picture!(123) %Picture{} iex> get_picture!(456) ** (Ecto.NoResultsError) """ def get_picture!(id), do: Repo.get!(Picture, id) def get_picture(id), do: Repo.get(Picture, id) @doc """ Get a picture by it's URL """ @spec get_picture_by_url(String.t()) :: Picture.t() | nil def get_picture_by_url(url) do from( p in Picture, where: fragment("? @> ?", p.file, ~s|{"url": "#{url}"}|) ) |> Repo.one() end @doc """ Creates a picture. ## Examples iex> create_picture(%{field: value}) {:ok, %Picture{}} iex> create_picture(%{field: bad_value}) {:error, %Ecto.Changeset{}} """ def create_picture(attrs \\ %{}) do %Picture{} |> Picture.changeset(attrs) |> Repo.insert() end @doc """ Updates a picture. ## Examples iex> update_picture(picture, %{field: new_value}) {:ok, %Picture{}} iex> update_picture(picture, %{field: bad_value}) {:error, %Ecto.Changeset{}} """ def update_picture(%Picture{} = picture, attrs) do picture |> Picture.changeset(attrs) |> Repo.update() end @doc """ Deletes a Picture. ## Examples iex> delete_picture(picture) {:ok, %Picture{}} iex> delete_picture(picture) {:error, %Ecto.Changeset{}} """ def delete_picture(%Picture{} = picture) do case Multi.new() |> Multi.delete(:picture, picture) |> Multi.run(:remove, fn _repo, %{picture: %Picture{file: %File{url: url}}} = _picture -> MobilizonWeb.Upload.remove(url) end) |> Repo.transaction() do {:ok, %{picture: %Picture{} = picture}} -> {:ok, picture} {:error, :remove, error, _} -> {:error, error} end end @doc """ Returns an `%Ecto.Changeset{}` for tracking picture changes. ## Examples iex> change_picture(picture) %Ecto.Changeset{source: %Picture{}} """ def change_picture(%Picture{} = picture) do Picture.changeset(picture, %{}) end end