lib/untis.ex

defmodule Untis do
  @moduledoc """
  Documentation for Untis.

  Code example:

  ```elixir
  # Requests require a valid login.
  Untis.Auth.JsonAuth.login("max.mustermann", "2W9ZNXI472JLVH63", "test-school")

  today = Date.utc_today()

  Untis.timetable_student(
    420,
    Date.beginning_of_week(today),
    Date.beginning_of_week(today)
    |> Date.add(5)
  )
  ```
  """

  import Untis.JsonRpc
  import Untis.Parser

  @method_timetable "getTimetable2017"
  @method_homework "getHomeWork2017"
  @method_messages "getMessagesOfDay2017"
  @method_absences "getStudentAbsences2017"
  @method_userdata "getUserData2017"

  @doc """
  Returns the timetable for a given time.

  ```elixir
  # List all periods for today.
  timetable_student(889, Date.utc_today(), Date.utc_today())
  ```
  """
  def timetable_student(id, start_date, end_date) do
    request(@method_timetable, %{
      "id" => id,
      "type" => "STUDENT",
      "startDate" => start_date,
      "endDate" => end_date
    })
    |> parse_timetable()
  end

  @doc """
  Does the same as `timetable_student`, only for classes.
  """
  def timetable_class(id, start_date, end_date) do
    request(@method_timetable, %{
      "id" => id,
      "type" => "CLASS",
      "startDate" => start_date,
      "endDate" => end_date
    })
    |> parse_timetable()
  end

  @doc """
  Returns all homework for the given range.

  ```elixir
  # List all homework for the next seven days.
  homework_student(
      889,
      Date.utc_today(),
      Date.utc_today() |> Date.add(7)
    )
  ```
  """
  def homework_student(id, start_date, end_date) do
    request(@method_homework, %{
      "id" => id,
      "type" => "STUDENT",
      "startDate" => start_date,
      "endDate" => end_date
    })
    |> parse_response()
    |> Map.fetch!("homeWorks")
  end

  @doc """
  Returns the messages of the day.
  """
  def messages(date) do
    request(@method_messages, %{"date" => date})
    |> parse_response()
    |> Map.fetch!("messages")
  end

  @doc """
  Returns all absences for the given range.
  Also see `Untis.Struct.Absence` structs.
  """
  def absences(start_date, end_date, include_excused, include_unexcused) do
    request(@method_absences, %{
      "startDate" => start_date,
      "endDate" => end_date,
      "includeExcused" => include_excused,
      "includeUnExcused" => include_unexcused
    })
    |> parse_absence()
  end

  @doc """
  Returns a variety of data:
  * master data (used internally to resolve elements)
  * settings
  * messenger settings
  * "real" user data (e.g. student id or display name)
  """
  def userdata do
    request(@method_userdata, %{})
    |> parse_response()
  end

  @doc false
  def master_data do
    request(@method_userdata, %{})
    |> parse_response()
    |> Map.fetch!("masterData")
  end
end