lib/wechat/work/oa/schedule.ex

defmodule WeChat.Work.OA.Schedule do
  @moduledoc "日程"

  import Jason.Helpers
  alias WeChat.Work
  alias Work.OA.Calendar
  alias Work.Contacts.User

  @doc_link WeChat.Utils.work_doc_link_prefix()

  @typedoc "日程ID"
  @type schedule_id :: String.t()
  @type schedule_id_list :: [schedule_id]

  @doc """
  创建日程
  - [官方文档](#{@doc_link}/93648){:target="_blank"}
  """
  @spec add(Work.client(), Work.agent(), body :: map) :: WeChat.response()
  def add(client, agent, body) do
    client.post("/cgi-bin/oa/schedule/add", body,
      query: [access_token: client.get_access_token(agent)]
    )
  end

  @doc """
  更新日程
  - [官方文档](#{@doc_link}/97720){:target="_blank"}
  """
  @spec update(Work.client(), Work.agent(), body :: map) :: WeChat.response()
  def update(client, agent, body) do
    client.post("/cgi-bin/oa/schedule/update", body,
      query: [access_token: client.get_access_token(agent)]
    )
  end

  @doc """
  新增日程参与者
  - [官方文档](#{@doc_link}/97721){:target="_blank"}

  该接口用于在日历中更新指定的日程参与者列表
  """
  @spec add_attendees(Work.client(), Work.agent(), schedule_id, attendees :: User.userid_list()) ::
          WeChat.response()
  def add_attendees(client, agent, schedule_id, attendees) do
    attendees = Enum.map(attendees, &json_map(userid: &1))

    client.post(
      "/cgi-bin/oa/schedule/add_attendees",
      json_map(schedule_id: schedule_id, attendees: attendees),
      query: [access_token: client.get_access_token(agent)]
    )
  end

  @doc """
  删除日程参与者
  - [官方文档](#{@doc_link}/97722){:target="_blank"}

  该接口用于在日历中更新指定的日程参与者列表
  """
  @spec del_attendees(Work.client(), Work.agent(), schedule_id, attendees :: User.userid_list()) ::
          WeChat.response()
  def del_attendees(client, agent, schedule_id, attendees) do
    attendees = Enum.map(attendees, &json_map(userid: &1))

    client.post(
      "/cgi-bin/oa/schedule/del_attendees",
      json_map(schedule_id: schedule_id, attendees: attendees),
      query: [access_token: client.get_access_token(agent)]
    )
  end

  @doc """
  获取日程详情
  - [官方文档](#{@doc_link}/97724){:target="_blank"}
  """
  @spec get(Work.client(), Work.agent(), schedule_id_list) :: WeChat.response()
  def get(client, agent, schedule_id_list) do
    client.post("/cgi-bin/oa/schedule/get", json_map(schedule_id_list: schedule_id_list),
      query: [access_token: client.get_access_token(agent)]
    )
  end

  @doc """
  取消日程
  - [官方文档](#{@doc_link}/97725){:target="_blank"}
  """
  @spec delete(Work.client(), Work.agent(), schedule_id) :: WeChat.response()
  def delete(client, agent, schedule_id) do
    client.post("/cgi-bin/oa/schedule/del", json_map(schedule_id: schedule_id),
      query: [access_token: client.get_access_token(agent)]
    )
  end

  @doc """
  获取日历下的日程列表
  - [官方文档](#{@doc_link}/97723){:target="_blank"}
  """
  @spec get_by_calendar(
          Work.client(),
          Work.agent(),
          Calendar.calendar_id(),
          offset :: integer,
          limit :: 1..1000
        ) :: WeChat.response()
  def get_by_calendar(client, agent, calendar_id, offset \\ 0, limit \\ 500) do
    client.post(
      "/cgi-bin/oa/schedule/get_by_calendar",
      json_map(cal_id: calendar_id, offset: offset, limit: limit),
      query: [access_token: client.get_access_token(agent)]
    )
  end
end