defmodule Faces.Gallery.Importer do alias Faces.Gallery.{Person, GithubUserData} alias Faces.Repo def import(username) do with {:ok, user_data} <- GithubUserData.get(username), {:ok, changeset} <- generate_changeset(user_data), {:ok, person} <- upsert(changeset) do {:ok, person} else {:error, reason} -> {:error, reason} end end defp generate_changeset(user_data) do {:ok, Person.changeset(%Person{}, user_data)} end defp upsert(changeset) do changeset |> Repo.insert(on_conflict: :replace_all, conflict_target: [:username]) end end