25/lib/mse25/timeline.ex
Anders Englöf Ytterström 794752592e
List all items annually (#18)
* Add year filter to Directus client

* Add Timeline module to combine several streams

* Fetch annual view by pokemon route

* Add annual view

* Remove scaffold route
2024-10-04 13:09:50 +02:00

61 lines
1.9 KiB
Elixir

defmodule Mse25.Timeline do
alias Mse25.Directus
def archive() do
items =
Task.await_many([
Task.async(fn -> Directus.get_albums!() end),
Task.async(fn -> Directus.get_articles!(limit: 9999) end),
Task.async(fn -> Directus.get_links!(limit: 9999) end),
Task.async(fn -> Directus.get_events!(limit: 9999) end)
])
end
def annual(year) do
items =
Task.await_many([
Task.async(fn -> Directus.get_albums!(limit: 9999, year: year) end),
Task.async(fn -> Directus.get_articles!(limit: 9999, year: year) end),
Task.async(fn -> Directus.get_links!(limit: 9999, year: year) end),
Task.async(fn -> Directus.get_events!(limit: 9999, 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: 9999, query: query) end),
Task.async(fn -> Directus.get_links!(limit: 9999, query: query) end),
Task.async(fn -> Directus.get_events!(limit: 9999, query: query) end)
])
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