defmodule Microwaveprop.Radio.Qso do @moduledoc false use Ecto.Schema import Ecto.Changeset alias Microwaveprop.Radio.Maidenhead @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "qsos" do field :station1, :string field :station2, :string field :qso_timestamp, :utc_datetime field :grid1, :string field :grid2, :string field :pos1, :map field :pos2, :map field :mode, :string field :band, :decimal field :distance_km, :decimal field :weather_queued, :boolean, default: false field :hrrr_queued, :boolean, default: false field :terrain_queued, :boolean, default: false field :iemre_queued, :boolean, default: false field :user_submitted, :boolean, default: false field :submitter_email, :string timestamps(type: :utc_datetime) end @required_fields ~w(station1 station2 qso_timestamp mode band)a @optional_fields ~w(grid1 grid2 pos1 pos2 distance_km)a def changeset(qso, attrs) do qso |> cast(attrs, @required_fields ++ @optional_fields) |> validate_required(@required_fields) end @submission_fields ~w(station1 station2 qso_timestamp mode band grid1 grid2 submitter_email)a @allowed_modes ~w(CW SSB FM FT8 FT4) @allowed_bands Enum.map(~w(1296 2304 3456 5760 10000 24000 47000 75000), &Decimal.new/1) def submission_changeset(qso, attrs) do qso |> cast(attrs, @submission_fields) |> validate_required(@submission_fields) |> validate_grid(:grid1) |> validate_grid(:grid2) |> validate_inclusion(:mode, @allowed_modes) |> validate_inclusion(:band, @allowed_bands) |> validate_format(:submitter_email, ~r/@/) end defp validate_grid(changeset, field) do validate_change(changeset, field, fn _, value -> if Maidenhead.valid?(value) do [] else [{field, "is not a valid Maidenhead grid square"}] end end) end end