defmodule Plausible.Imported.SiteImport do @moduledoc """ Site import schema. """ use Ecto.Schema import Ecto.Changeset alias Plausible.Auth.User alias Plausible.Imported.ImportSources alias Plausible.Site @statuses [:pending, :importing, :completed, :failed] @type t() :: %__MODULE__{} schema "site_imports" do field :start_date, :date field :end_date, :date field :label, :string field :source, Ecto.Enum, values: ImportSources.names() field :status, Ecto.Enum, values: @statuses field :legacy, :boolean, default: false field :has_scroll_depth, :boolean, default: false belongs_to :site, Site belongs_to :imported_by, User timestamps() end for status <- @statuses do defmacro unquote(status)(), do: unquote(status) end @spec label(t()) :: String.t() def label(%{source: source, label: label}) do build_label(ImportSources.by_name(source).label(), label) end @spec create_changeset(Site.t(), User.t(), map()) :: Ecto.Changeset.t() def create_changeset(site, user, params) do %__MODULE__{} |> cast(params, [:label, :source, :start_date, :end_date, :legacy]) |> validate_required([:source]) |> put_assoc(:site, site) |> put_assoc(:imported_by, user) |> put_change(:status, pending()) end @spec start_changeset(t()) :: Ecto.Changeset.t() def start_changeset(site_import) do site_import |> change(status: importing()) end @spec complete_changeset(t(), map()) :: Ecto.Changeset.t() def complete_changeset(site_import, params \\ %{}) do site_import |> cast(params, [:start_date, :end_date]) |> put_change(:status, completed()) |> validate_required([:start_date, :end_date]) end @spec fail_changeset(t()) :: Ecto.Changeset.t() def fail_changeset(site_import) do change(site_import, status: failed()) end defp build_label(source, nil), do: source defp build_label(source, label), do: "#{source} (#{label})" end