25/lib/mse25/timeline.ex

84 lines
2.5 KiB
Elixir
Raw Normal View History

defmodule Mse25.Timeline do
alias Mse25.Directus
@almost_infinity 9999
def archive(limit \\ @almost_infinity) do
items =
Task.await_many([
Task.async(fn -> Directus.get_albums!() end),
Task.async(fn -> Directus.get_articles!(limit: limit) end),
Task.async(fn -> Directus.get_links!(limit: limit) end),
Task.async(fn -> Directus.get_events!(limit: limit) end)
])
archive =
items
|> List.flatten()
|> Enum.sort_by(&sort_key/1)
|> Enum.reverse()
|> Enum.take(limit)
|> Enum.map(&categorize/1)
{:ok, %{archive: archive}}
end
def annual(year) do
items =
Task.await_many([
Task.async(fn -> Directus.get_albums!(limit: @almost_infinity, year: year) end),
Task.async(fn -> Directus.get_articles!(limit: @almost_infinity, year: year) end),
Task.async(fn -> Directus.get_links!(limit: @almost_infinity, year: year) end),
Task.async(fn -> Directus.get_events!(limit: @almost_infinity, year: year) end)
])
counts =
items
|> Enum.reject(&Enum.empty?/1)
|> Enum.map(fn [item | l] -> {item_key(item), Enum.count(l) + 1} end)
|> Map.new()
timeline =
items
|> List.flatten()
|> Enum.sort_by(&sort_key/1)
|> Enum.map(&categorize/1)
|> Enum.group_by(fn item -> sort_key(item) |> String.slice(5..6) end)
|> Enum.reverse()
{:ok, %{year: year, timeline: timeline, counts: counts}}
end
def search(query) do
items =
Task.await_many([
Task.async(fn -> Directus.get_articles!(limit: @almost_infinity, query: query) end),
Task.async(fn -> Directus.get_links!(limit: @almost_infinity, query: query) end),
Task.async(fn -> Directus.get_events!(limit: @almost_infinity, query: query) end)
])
results =
items
|> List.flatten()
|> Enum.sort_by(&sort_key/1)
|> Enum.map(&categorize/1)
# |> Enum.group_by(fn item -> sort_key(item) |> String.slice(5..6) end)
|> Enum.reverse()
{:ok, %{query: query, results: results, count: length(results)}}
end
defp sort_key(%{"pubDate" => date}), do: date
defp sort_key(%{"started_at" => date}), do: date
defp sort_key(%{"purchased_at" => date}), do: date
defp item_key(%{"source" => _s, "pubDate" => _}), do: :links
defp item_key(%{"pubDate" => _}), do: :articles
defp item_key(%{"started_at" => _}), do: :events
defp item_key(%{"purchased_at" => _}), do: :albums
defp categorize(item) do
Map.put(item, :t, item_key(item))
end
end