defmodule Diffuser.Generator do @moduledoc """ The Generator context. """ import Ecto.Query, warn: false alias Diffuser.Repo alias Diffuser.Generator.{PromptRequest, PromptRequestResult} @doc """ Returns the list of prompt_requests. ## Examples iex> list_prompt_requests() [%PromptRequest{}, ...] """ def list_prompt_requests do Repo.all(PromptRequest) end @doc """ Gets a single prompt_request. Raises `Ecto.NoResultsError` if the Prompt request does not exist. ## Examples iex> get_prompt_request!(123) %PromptRequest{} iex> get_prompt_request!(456) ** (Ecto.NoResultsError) """ def get_prompt_request!(id), do: Repo.one!(from pr in PromptRequest, where: pr.id == ^id) |> Repo.preload([:votes, :images, :user]) @doc """ Creates a prompt_request. ## Examples iex> create_prompt_request(%{field: value}) {:ok, %PromptRequest{}} iex> create_prompt_request(%{field: bad_value}) {:error, %Ecto.Changeset{}} """ def create_prompt_request(%{"user" => user} = attrs) do user = Diffuser.Accounts.get_user!(user) code = Map.get(user, :code, nil) attrs = if is_nil(code), do: attrs |> Map.put("code", "garbage"), else: attrs |> Map.put("code", code) %PromptRequest{} |> PromptRequest.changeset(attrs) |> Ecto.Changeset.put_assoc(:user, user) |> Repo.insert() end @doc """ Updates a prompt_request. ## Examples iex> update_prompt_request(prompt_request, %{field: new_value}) {:ok, %PromptRequest{}} iex> update_prompt_request(prompt_request, %{field: bad_value}) {:error, %Ecto.Changeset{}} """ def update_prompt_request(%PromptRequest{} = prompt_request, attrs) do prompt_request |> PromptRequest.changeset(attrs) |> Repo.update() end def update_prompt_request(id, attrs), do: get_prompt_request!(id) |> update_prompt_request(attrs) @doc """ Deletes a prompt_request. ## Examples iex> delete_prompt_request(prompt_request) {:ok, %PromptRequest{}} iex> delete_prompt_request(prompt_request) {:error, %Ecto.Changeset{}} """ def delete_prompt_request(%PromptRequest{} = prompt_request) do Repo.delete(prompt_request) end @doc """ Returns an `%Ecto.Changeset{}` for tracking prompt_request changes. ## Examples iex> change_prompt_request(prompt_request) %Ecto.Changeset{data: %PromptRequest{}} """ def change_prompt_request(%PromptRequest{} = prompt_request, attrs \\ %{}) do PromptRequest.changeset(prompt_request, attrs) end def create_prompt_request_result(prompt_request_id, image) do %PromptRequestResult{} |> PromptRequestResult.changeset(%{ image: image, prompt_request_id: prompt_request_id }) |> Repo.insert() end def create_prompt_request_results(prompt_request_id, images) do Enum.each(images, fn %{file_name: file_name, binary: binary} -> create_prompt_request_result(prompt_request_id, %{ file_name: file_name, filename: file_name, binary: binary, updated_at: DateTime.utc_now() }) end) end def paginate_prompt_requests(query \\ PromptRequest, params) do search_query = Map.get(params, :query, nil) order_by_query = Map.get(params, :order_by, nil) query |> PromptRequest.search_by_prompt_or_user(search_query) |> PromptRequest.order_by(order_by_query) |> preload([:votes, :user, :images]) |> Repo.paginate(params) end end