defmodule MicrowavepropWeb.Api.V1.ContactJSON do @moduledoc "Renders contact (QSO) representations." alias Microwaveprop.Accounts.User alias Microwaveprop.Radio.Contact @spec index(map()) :: map() def index(%{contacts: contacts} = assigns) do viewer = Map.get(assigns, :viewer) %{data: Enum.map(contacts, &data(&1, viewer))} end @spec index_paginated(map()) :: map() def index_paginated(%{contacts: contacts} = assigns) do viewer = Map.get(assigns, :viewer) %{ data: Enum.map(contacts, &data(&1, viewer)), meta: %{ page: assigns.page, per_page: assigns.per_page, total_entries: assigns.total_entries, total_pages: assigns.total_pages } } end @spec show(map()) :: map() def show(%{contact: contact} = assigns) do viewer = Map.get(assigns, :viewer) %{data: data(contact, viewer)} end defp data(%Contact{} = c, viewer) do %{ id: c.id, station1: c.station1, station2: c.station2, qso_timestamp: c.qso_timestamp, grid1: c.grid1, grid2: c.grid2, pos1: c.pos1, pos2: c.pos2, mode: c.mode, band_mhz: c.band && Decimal.to_string(c.band), distance_km: c.distance_km && Decimal.to_string(c.distance_km), private: c.private, user_declared_prop_mode: c.user_declared_prop_mode, propagation_mechanism: c.propagation_mechanism, propagation_mechanism_confidence: c.propagation_mechanism_confidence, notes: maybe_notes(c, viewer), mine?: mine?(c, viewer) } end # Private notes are only visible to the submitter; everyone else sees nil. defp maybe_notes(%Contact{user_id: nil}, _viewer), do: nil defp maybe_notes(%Contact{notes: nil}, _viewer), do: nil defp maybe_notes(%Contact{user_id: uid, notes: notes}, %User{id: uid}), do: notes defp maybe_notes(_contact, _viewer), do: nil defp mine?(%Contact{user_id: uid}, %User{id: uid}) when not is_nil(uid), do: true defp mine?(_contact, _viewer), do: false end