lib/mix/tasks/todos.ex

defmodule Mix.Tasks.Todos do
  use Mix.Task

  @moduledoc """
  Get all TODOs from the specified databases
  """

  alias Notion.{Database, Filter, Sort, PropertyFilter, PeopleFilter, Query, SelectFilter}

  @shortdoc "Get all PDP TODOs"
  def run(_) do
    Mix.Task.run("app.start")

    %{
      "Anna" => "6c176b4016c54878b20b0ebe45c9a1f1",
      "Anton" => "3f3d34c5519245888b1e35b6146453de",
      "Emanuel" => "a79657050f8b441d9111f11c4eaa19c8",
      "Robert" => "245d2853965d4ddd8dbf42565a1501bd",
      "Ronald" => "b1ecb99451f845b895e9b873dfcccac2",
      "Leon" => "279f4f67e3bc4c6ea9c1a63aaed63851",
      "Vlad" => "3b3fe8e3be824d149c0a3b9b1f6c288d"
    }
    |> Map.values()
    |> Enum.reduce([], fn db_id, acc ->
      sort = %Sort{
        property: "Session",
        direction: Sort.Direction.Ascending.value()
      }

      filter = %Filter{
        and: [
          %PropertyFilter{
            property: "Owner",
            people: %PeopleFilter{
              contains: "9441c930-2a75-40c9-9c00-bd5ad030fd2f"
            }
          },
          %PropertyFilter{
            property: "Status",
            select: %SelectFilter{
              equals: "ToDo"
            }
          }
        ]
      }

      query = %Query{
        filter: filter,
        sorts: [sort]
      }

      with {:ok, json_string} <- Jason.encode(query),
           {:ok, payload} <- Jason.decode(json_string),
           {:ok, %Tesla.Env{} = env} <- Notion.query_database(db_id, payload) do
        acc ++ env.body.results
      end
    end)
    |> Enum.map(fn result ->
      struct(Database, result)
    end)
    |> Enum.flat_map(fn database ->
      database.properties[:Task][:title]
      |> Enum.map(fn title_property ->
        title_property[:plain_text]
      end)
    end)
  end
end