defmodule Microwaveprop.Radio do @moduledoc false import Ecto.Query alias Microwaveprop.Radio.Qso alias Microwaveprop.Repo @per_page 20 @sortable_fields ~w(station1 station2 band mode distance_km qso_timestamp)a def list_qsos(opts \\ []) do page = max(Keyword.get(opts, :page, 1), 1) offset = (page - 1) * @per_page {sort_field, sort_dir} = sort_opts(opts) total_entries = Repo.aggregate(Qso, :count) total_pages = max(ceil(total_entries / @per_page), 1) entries = Qso |> order_by([q], [{^sort_dir, field(q, ^sort_field)}]) |> limit(^@per_page) |> offset(^offset) |> Repo.all() %{ entries: entries, page: page, total_pages: total_pages, total_entries: total_entries } end defp sort_opts(opts) do sort_by = Keyword.get(opts, :sort_by, :qso_timestamp) sort_order = Keyword.get(opts, :sort_order, :desc) field = if sort_by in @sortable_fields, do: sort_by, else: :qso_timestamp dir = if sort_order in [:asc, :desc], do: sort_order, else: :desc {field, dir} end def unprocessed_qsos(limit \\ 500) do Qso |> where([q], q.weather_queued == false and not is_nil(q.pos1)) |> order_by([q], asc: q.qso_timestamp) |> limit(^limit) |> Repo.all() end def mark_weather_queued!(qso_ids) do Qso |> where([q], q.id in ^qso_ids) |> Repo.update_all(set: [weather_queued: true]) end def get_qso!(id) do Repo.get!(Qso, id) end end