lib/operations/teams.ex

defmodule GitHub.Teams do
  @moduledoc """
  Provides API endpoints related to teams
  """

  @default_client GitHub.Client

  @doc """
  Add team member (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#add-team-member-legacy)

  """
  @spec add_member_legacy(integer, String.t(), keyword) :: :ok | {:error, GitHub.Error.t()}
  def add_member_legacy(team_id, username, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, username: username],
      call: {GitHub.Teams, :add_member_legacy},
      url: "/teams/#{team_id}/members/#{username}",
      method: :put,
      response: [{204, nil}, {403, {GitHub.BasicError, :t}}, {404, nil}, {422, nil}],
      opts: opts
    })
  end

  @doc """
  Add or update team membership for a user

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#add-or-update-team-membership-for-a-user)

  """
  @spec add_or_update_membership_for_user_in_org(String.t(), String.t(), String.t(), map, keyword) ::
          {:ok, GitHub.Team.Membership.t()} | {:error, GitHub.Error.t()}
  def add_or_update_membership_for_user_in_org(org, team_slug, username, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, username: username, body: body],
      call: {GitHub.Teams, :add_or_update_membership_for_user_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/memberships/#{username}",
      body: body,
      method: :put,
      request: [{"application/json", :map}],
      response: [{200, {GitHub.Team.Membership, :t}}, {403, nil}, {422, nil}],
      opts: opts
    })
  end

  @doc """
  Add or update team membership for a user (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#add-or-update-team-membership-for-a-user-legacy)

  """
  @spec add_or_update_membership_for_user_legacy(integer, String.t(), map, keyword) ::
          {:ok, GitHub.Team.Membership.t()} | {:error, GitHub.Error.t()}
  def add_or_update_membership_for_user_legacy(team_id, username, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, username: username, body: body],
      call: {GitHub.Teams, :add_or_update_membership_for_user_legacy},
      url: "/teams/#{team_id}/memberships/#{username}",
      body: body,
      method: :put,
      request: [{"application/json", :map}],
      response: [
        {200, {GitHub.Team.Membership, :t}},
        {403, nil},
        {404, {GitHub.BasicError, :t}},
        {422, nil}
      ],
      opts: opts
    })
  end

  @doc """
  Add or update team project permissions

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#add-or-update-team-project-permissions)

  """
  @spec add_or_update_project_permissions_in_org(
          String.t(),
          String.t(),
          integer,
          map | nil,
          keyword
        ) :: :ok | {:error, GitHub.Error.t()}
  def add_or_update_project_permissions_in_org(org, team_slug, project_id, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, project_id: project_id, body: body],
      call: {GitHub.Teams, :add_or_update_project_permissions_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/projects/#{project_id}",
      body: body,
      method: :put,
      request: [{"application/json", {:nullable, :map}}],
      response: [{204, nil}, {403, :map}],
      opts: opts
    })
  end

  @doc """
  Add or update team project permissions (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#add-or-update-team-project-permissions-legacy)

  """
  @spec add_or_update_project_permissions_legacy(integer, integer, map, keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def add_or_update_project_permissions_legacy(team_id, project_id, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, project_id: project_id, body: body],
      call: {GitHub.Teams, :add_or_update_project_permissions_legacy},
      url: "/teams/#{team_id}/projects/#{project_id}",
      body: body,
      method: :put,
      request: [{"application/json", :map}],
      response: [
        {204, nil},
        {403, :map},
        {404, {GitHub.BasicError, :t}},
        {422, {GitHub.ValidationError, :t}}
      ],
      opts: opts
    })
  end

  @doc """
  Add or update team repository permissions

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#add-or-update-team-repository-permissions)

  """
  @spec add_or_update_repo_permissions_in_org(
          String.t(),
          String.t(),
          String.t(),
          String.t(),
          map,
          keyword
        ) :: :ok | {:error, GitHub.Error.t()}
  def add_or_update_repo_permissions_in_org(org, team_slug, owner, repo, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, owner: owner, repo: repo, body: body],
      call: {GitHub.Teams, :add_or_update_repo_permissions_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/repos/#{owner}/#{repo}",
      body: body,
      method: :put,
      request: [{"application/json", :map}],
      response: [{204, nil}],
      opts: opts
    })
  end

  @doc """
  Add or update team repository permissions (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#add-or-update-team-repository-permissions-legacy)

  """
  @spec add_or_update_repo_permissions_legacy(integer, String.t(), String.t(), map, keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def add_or_update_repo_permissions_legacy(team_id, owner, repo, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, owner: owner, repo: repo, body: body],
      call: {GitHub.Teams, :add_or_update_repo_permissions_legacy},
      url: "/teams/#{team_id}/repos/#{owner}/#{repo}",
      body: body,
      method: :put,
      request: [{"application/json", :map}],
      response: [{204, nil}, {403, {GitHub.BasicError, :t}}, {422, {GitHub.ValidationError, :t}}],
      opts: opts
    })
  end

  @doc """
  Check team permissions for a project

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#check-team-permissions-for-a-project)

  """
  @spec check_permissions_for_project_in_org(String.t(), String.t(), integer, keyword) ::
          {:ok, GitHub.Team.Project.t()} | {:error, GitHub.Error.t()}
  def check_permissions_for_project_in_org(org, team_slug, project_id, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, project_id: project_id],
      call: {GitHub.Teams, :check_permissions_for_project_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/projects/#{project_id}",
      method: :get,
      response: [{200, {GitHub.Team.Project, :t}}, {404, nil}],
      opts: opts
    })
  end

  @doc """
  Check team permissions for a project (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#check-team-permissions-for-a-project-legacy)

  """
  @spec check_permissions_for_project_legacy(integer, integer, keyword) ::
          {:ok, GitHub.Team.Project.t()} | {:error, GitHub.Error.t()}
  def check_permissions_for_project_legacy(team_id, project_id, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, project_id: project_id],
      call: {GitHub.Teams, :check_permissions_for_project_legacy},
      url: "/teams/#{team_id}/projects/#{project_id}",
      method: :get,
      response: [{200, {GitHub.Team.Project, :t}}, {404, nil}],
      opts: opts
    })
  end

  @doc """
  Check team permissions for a repository

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#check-team-permissions-for-a-repository)

  """
  @spec check_permissions_for_repo_in_org(String.t(), String.t(), String.t(), String.t(), keyword) ::
          {:ok, GitHub.Team.Repository.t()} | {:error, GitHub.Error.t()}
  def check_permissions_for_repo_in_org(org, team_slug, owner, repo, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, owner: owner, repo: repo],
      call: {GitHub.Teams, :check_permissions_for_repo_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/repos/#{owner}/#{repo}",
      method: :get,
      response: [{200, {GitHub.Team.Repository, :t}}, {204, nil}, {404, nil}],
      opts: opts
    })
  end

  @doc """
  Check team permissions for a repository (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#check-team-permissions-for-a-repository-legacy)

  """
  @spec check_permissions_for_repo_legacy(integer, String.t(), String.t(), keyword) ::
          {:ok, GitHub.Team.Repository.t()} | {:error, GitHub.Error.t()}
  def check_permissions_for_repo_legacy(team_id, owner, repo, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, owner: owner, repo: repo],
      call: {GitHub.Teams, :check_permissions_for_repo_legacy},
      url: "/teams/#{team_id}/repos/#{owner}/#{repo}",
      method: :get,
      response: [{200, {GitHub.Team.Repository, :t}}, {204, nil}, {404, nil}],
      opts: opts
    })
  end

  @doc """
  Create a team

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#create-a-team)

  """
  @spec create(String.t(), map, keyword) :: {:ok, GitHub.Team.full()} | {:error, GitHub.Error.t()}
  def create(org, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, body: body],
      call: {GitHub.Teams, :create},
      url: "/orgs/#{org}/teams",
      body: body,
      method: :post,
      request: [{"application/json", :map}],
      response: [
        {201, {GitHub.Team, :full}},
        {403, {GitHub.BasicError, :t}},
        {422, {GitHub.ValidationError, :t}}
      ],
      opts: opts
    })
  end

  @doc """
  Create a discussion comment

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#create-a-discussion-comment)

  """
  @spec create_discussion_comment_in_org(String.t(), String.t(), integer, map, keyword) ::
          {:ok, GitHub.Team.DiscussionComment.t()} | {:error, GitHub.Error.t()}
  def create_discussion_comment_in_org(org, team_slug, discussion_number, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, discussion_number: discussion_number, body: body],
      call: {GitHub.Teams, :create_discussion_comment_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/discussions/#{discussion_number}/comments",
      body: body,
      method: :post,
      request: [{"application/json", :map}],
      response: [{201, {GitHub.Team.DiscussionComment, :t}}],
      opts: opts
    })
  end

  @doc """
  Create a discussion comment (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#create-a-discussion-comment-legacy)

  """
  @spec create_discussion_comment_legacy(integer, integer, map, keyword) ::
          {:ok, GitHub.Team.DiscussionComment.t()} | {:error, GitHub.Error.t()}
  def create_discussion_comment_legacy(team_id, discussion_number, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, discussion_number: discussion_number, body: body],
      call: {GitHub.Teams, :create_discussion_comment_legacy},
      url: "/teams/#{team_id}/discussions/#{discussion_number}/comments",
      body: body,
      method: :post,
      request: [{"application/json", :map}],
      response: [{201, {GitHub.Team.DiscussionComment, :t}}],
      opts: opts
    })
  end

  @doc """
  Create a discussion

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#create-a-discussion)

  """
  @spec create_discussion_in_org(String.t(), String.t(), map, keyword) ::
          {:ok, GitHub.Team.Discussion.t()} | {:error, GitHub.Error.t()}
  def create_discussion_in_org(org, team_slug, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, body: body],
      call: {GitHub.Teams, :create_discussion_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/discussions",
      body: body,
      method: :post,
      request: [{"application/json", :map}],
      response: [{201, {GitHub.Team.Discussion, :t}}],
      opts: opts
    })
  end

  @doc """
  Create a discussion (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#create-a-discussion-legacy)

  """
  @spec create_discussion_legacy(integer, map, keyword) ::
          {:ok, GitHub.Team.Discussion.t()} | {:error, GitHub.Error.t()}
  def create_discussion_legacy(team_id, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, body: body],
      call: {GitHub.Teams, :create_discussion_legacy},
      url: "/teams/#{team_id}/discussions",
      body: body,
      method: :post,
      request: [{"application/json", :map}],
      response: [{201, {GitHub.Team.Discussion, :t}}],
      opts: opts
    })
  end

  @doc """
  Delete a discussion comment

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#delete-a-discussion-comment)

  """
  @spec delete_discussion_comment_in_org(String.t(), String.t(), integer, integer, keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def delete_discussion_comment_in_org(
        org,
        team_slug,
        discussion_number,
        comment_number,
        opts \\ []
      ) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [
        org: org,
        team_slug: team_slug,
        discussion_number: discussion_number,
        comment_number: comment_number
      ],
      call: {GitHub.Teams, :delete_discussion_comment_in_org},
      url:
        "/orgs/#{org}/teams/#{team_slug}/discussions/#{discussion_number}/comments/#{comment_number}",
      method: :delete,
      response: [{204, nil}],
      opts: opts
    })
  end

  @doc """
  Delete a discussion comment (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#delete-a-discussion-comment-legacy)

  """
  @spec delete_discussion_comment_legacy(integer, integer, integer, keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def delete_discussion_comment_legacy(team_id, discussion_number, comment_number, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [
        team_id: team_id,
        discussion_number: discussion_number,
        comment_number: comment_number
      ],
      call: {GitHub.Teams, :delete_discussion_comment_legacy},
      url: "/teams/#{team_id}/discussions/#{discussion_number}/comments/#{comment_number}",
      method: :delete,
      response: [{204, nil}],
      opts: opts
    })
  end

  @doc """
  Delete a discussion

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#delete-a-discussion)

  """
  @spec delete_discussion_in_org(String.t(), String.t(), integer, keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def delete_discussion_in_org(org, team_slug, discussion_number, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, discussion_number: discussion_number],
      call: {GitHub.Teams, :delete_discussion_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/discussions/#{discussion_number}",
      method: :delete,
      response: [{204, nil}],
      opts: opts
    })
  end

  @doc """
  Delete a discussion (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#delete-a-discussion-legacy)

  """
  @spec delete_discussion_legacy(integer, integer, keyword) :: :ok | {:error, GitHub.Error.t()}
  def delete_discussion_legacy(team_id, discussion_number, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, discussion_number: discussion_number],
      call: {GitHub.Teams, :delete_discussion_legacy},
      url: "/teams/#{team_id}/discussions/#{discussion_number}",
      method: :delete,
      response: [{204, nil}],
      opts: opts
    })
  end

  @doc """
  Delete a team

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#delete-a-team)

  """
  @spec delete_in_org(String.t(), String.t(), keyword) :: :ok | {:error, GitHub.Error.t()}
  def delete_in_org(org, team_slug, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug],
      call: {GitHub.Teams, :delete_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}",
      method: :delete,
      response: [{204, nil}],
      opts: opts
    })
  end

  @doc """
  Delete a team (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#delete-a-team-legacy)

  """
  @spec delete_legacy(integer, keyword) :: :ok | {:error, GitHub.Error.t()}
  def delete_legacy(team_id, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id],
      call: {GitHub.Teams, :delete_legacy},
      url: "/teams/#{team_id}",
      method: :delete,
      response: [{204, nil}, {404, {GitHub.BasicError, :t}}, {422, {GitHub.ValidationError, :t}}],
      opts: opts
    })
  end

  @doc """
  Get a team by name

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#get-a-team-by-name)

  """
  @spec get_by_name(String.t(), String.t(), keyword) ::
          {:ok, GitHub.Team.full()} | {:error, GitHub.Error.t()}
  def get_by_name(org, team_slug, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug],
      call: {GitHub.Teams, :get_by_name},
      url: "/orgs/#{org}/teams/#{team_slug}",
      method: :get,
      response: [{200, {GitHub.Team, :full}}, {404, {GitHub.BasicError, :t}}],
      opts: opts
    })
  end

  @doc """
  Get a discussion comment

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#get-a-discussion-comment)

  """
  @spec get_discussion_comment_in_org(String.t(), String.t(), integer, integer, keyword) ::
          {:ok, GitHub.Team.DiscussionComment.t()} | {:error, GitHub.Error.t()}
  def get_discussion_comment_in_org(org, team_slug, discussion_number, comment_number, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [
        org: org,
        team_slug: team_slug,
        discussion_number: discussion_number,
        comment_number: comment_number
      ],
      call: {GitHub.Teams, :get_discussion_comment_in_org},
      url:
        "/orgs/#{org}/teams/#{team_slug}/discussions/#{discussion_number}/comments/#{comment_number}",
      method: :get,
      response: [{200, {GitHub.Team.DiscussionComment, :t}}],
      opts: opts
    })
  end

  @doc """
  Get a discussion comment (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#get-a-discussion-comment-legacy)

  """
  @spec get_discussion_comment_legacy(integer, integer, integer, keyword) ::
          {:ok, GitHub.Team.DiscussionComment.t()} | {:error, GitHub.Error.t()}
  def get_discussion_comment_legacy(team_id, discussion_number, comment_number, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [
        team_id: team_id,
        discussion_number: discussion_number,
        comment_number: comment_number
      ],
      call: {GitHub.Teams, :get_discussion_comment_legacy},
      url: "/teams/#{team_id}/discussions/#{discussion_number}/comments/#{comment_number}",
      method: :get,
      response: [{200, {GitHub.Team.DiscussionComment, :t}}],
      opts: opts
    })
  end

  @doc """
  Get a discussion

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#get-a-discussion)

  """
  @spec get_discussion_in_org(String.t(), String.t(), integer, keyword) ::
          {:ok, GitHub.Team.Discussion.t()} | {:error, GitHub.Error.t()}
  def get_discussion_in_org(org, team_slug, discussion_number, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, discussion_number: discussion_number],
      call: {GitHub.Teams, :get_discussion_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/discussions/#{discussion_number}",
      method: :get,
      response: [{200, {GitHub.Team.Discussion, :t}}],
      opts: opts
    })
  end

  @doc """
  Get a discussion (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#get-a-discussion-legacy)

  """
  @spec get_discussion_legacy(integer, integer, keyword) ::
          {:ok, GitHub.Team.Discussion.t()} | {:error, GitHub.Error.t()}
  def get_discussion_legacy(team_id, discussion_number, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, discussion_number: discussion_number],
      call: {GitHub.Teams, :get_discussion_legacy},
      url: "/teams/#{team_id}/discussions/#{discussion_number}",
      method: :get,
      response: [{200, {GitHub.Team.Discussion, :t}}],
      opts: opts
    })
  end

  @doc """
  Get a team (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#get-a-team-legacy)

  """
  @spec get_legacy(integer, keyword) :: {:ok, GitHub.Team.full()} | {:error, GitHub.Error.t()}
  def get_legacy(team_id, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id],
      call: {GitHub.Teams, :get_legacy},
      url: "/teams/#{team_id}",
      method: :get,
      response: [{200, {GitHub.Team, :full}}, {404, {GitHub.BasicError, :t}}],
      opts: opts
    })
  end

  @doc """
  Get team member (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#get-team-member-legacy)

  """
  @spec get_member_legacy(integer, String.t(), keyword) :: :ok | {:error, GitHub.Error.t()}
  def get_member_legacy(team_id, username, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, username: username],
      call: {GitHub.Teams, :get_member_legacy},
      url: "/teams/#{team_id}/members/#{username}",
      method: :get,
      response: [{204, nil}, {404, nil}],
      opts: opts
    })
  end

  @doc """
  Get team membership for a user

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#get-team-membership-for-a-user)

  """
  @spec get_membership_for_user_in_org(String.t(), String.t(), String.t(), keyword) ::
          {:ok, GitHub.Team.Membership.t()} | {:error, GitHub.Error.t()}
  def get_membership_for_user_in_org(org, team_slug, username, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, username: username],
      call: {GitHub.Teams, :get_membership_for_user_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/memberships/#{username}",
      method: :get,
      response: [{200, {GitHub.Team.Membership, :t}}, {404, nil}],
      opts: opts
    })
  end

  @doc """
  Get team membership for a user (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#get-team-membership-for-a-user-legacy)

  """
  @spec get_membership_for_user_legacy(integer, String.t(), keyword) ::
          {:ok, GitHub.Team.Membership.t()} | {:error, GitHub.Error.t()}
  def get_membership_for_user_legacy(team_id, username, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, username: username],
      call: {GitHub.Teams, :get_membership_for_user_legacy},
      url: "/teams/#{team_id}/memberships/#{username}",
      method: :get,
      response: [{200, {GitHub.Team.Membership, :t}}, {404, {GitHub.BasicError, :t}}],
      opts: opts
    })
  end

  @doc """
  List teams

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-teams)

  """
  @spec list(String.t(), keyword) :: {:ok, [GitHub.Team.t()]} | {:error, GitHub.Error.t()}
  def list(org, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      args: [org: org],
      call: {GitHub.Teams, :list},
      url: "/orgs/#{org}/teams",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Team, :t}}}, {403, {GitHub.BasicError, :t}}],
      opts: opts
    })
  end

  @doc """
  List child teams

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-child-teams)

  """
  @spec list_child_in_org(String.t(), String.t(), keyword) ::
          {:ok, [GitHub.Team.t()]} | {:error, GitHub.Error.t()}
  def list_child_in_org(org, team_slug, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      args: [org: org, team_slug: team_slug],
      call: {GitHub.Teams, :list_child_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/teams",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Team, :t}}}],
      opts: opts
    })
  end

  @doc """
  List child teams (Legacy)

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#list-child-teams-legacy)

  """
  @spec list_child_legacy(integer, keyword) ::
          {:ok, [GitHub.Team.t()]} | {:error, GitHub.Error.t()}
  def list_child_legacy(team_id, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      args: [team_id: team_id],
      call: {GitHub.Teams, :list_child_legacy},
      url: "/teams/#{team_id}/teams",
      method: :get,
      query: query,
      response: [
        {200, {:array, {GitHub.Team, :t}}},
        {403, {GitHub.BasicError, :t}},
        {404, {GitHub.BasicError, :t}},
        {422, {GitHub.ValidationError, :t}}
      ],
      opts: opts
    })
  end

  @doc """
  List discussion comments

  ## Options

    * `direction` (String.t()): The direction to sort the results by.
    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-discussion-comments)

  """
  @spec list_discussion_comments_in_org(String.t(), String.t(), integer, keyword) ::
          {:ok, [GitHub.Team.DiscussionComment.t()]} | {:error, GitHub.Error.t()}
  def list_discussion_comments_in_org(org, team_slug, discussion_number, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:direction, :page, :per_page])

    client.request(%{
      args: [org: org, team_slug: team_slug, discussion_number: discussion_number],
      call: {GitHub.Teams, :list_discussion_comments_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/discussions/#{discussion_number}/comments",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Team.DiscussionComment, :t}}}],
      opts: opts
    })
  end

  @doc """
  List discussion comments (Legacy)

  ## Options

    * `direction` (String.t()): The direction to sort the results by.
    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-discussion-comments-legacy)

  """
  @spec list_discussion_comments_legacy(integer, integer, keyword) ::
          {:ok, [GitHub.Team.DiscussionComment.t()]} | {:error, GitHub.Error.t()}
  def list_discussion_comments_legacy(team_id, discussion_number, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:direction, :page, :per_page])

    client.request(%{
      args: [team_id: team_id, discussion_number: discussion_number],
      call: {GitHub.Teams, :list_discussion_comments_legacy},
      url: "/teams/#{team_id}/discussions/#{discussion_number}/comments",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Team.DiscussionComment, :t}}}],
      opts: opts
    })
  end

  @doc """
  List discussions

  ## Options

    * `direction` (String.t()): The direction to sort the results by.
    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.
    * `pinned` (String.t()): Pinned discussions only filter

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-discussions)

  """
  @spec list_discussions_in_org(String.t(), String.t(), keyword) ::
          {:ok, [GitHub.Team.Discussion.t()]} | {:error, GitHub.Error.t()}
  def list_discussions_in_org(org, team_slug, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:direction, :page, :per_page, :pinned])

    client.request(%{
      args: [org: org, team_slug: team_slug],
      call: {GitHub.Teams, :list_discussions_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/discussions",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Team.Discussion, :t}}}],
      opts: opts
    })
  end

  @doc """
  List discussions (Legacy)

  ## Options

    * `direction` (String.t()): The direction to sort the results by.
    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-discussions-legacy)

  """
  @spec list_discussions_legacy(integer, keyword) ::
          {:ok, [GitHub.Team.Discussion.t()]} | {:error, GitHub.Error.t()}
  def list_discussions_legacy(team_id, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:direction, :page, :per_page])

    client.request(%{
      args: [team_id: team_id],
      call: {GitHub.Teams, :list_discussions_legacy},
      url: "/teams/#{team_id}/discussions",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Team.Discussion, :t}}}],
      opts: opts
    })
  end

  @doc """
  List teams for the authenticated user

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-teams-for-the-authenticated-user)

  """
  @spec list_for_authenticated_user(keyword) ::
          {:ok, [GitHub.Team.full()]} | {:error, GitHub.Error.t()}
  def list_for_authenticated_user(opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      call: {GitHub.Teams, :list_for_authenticated_user},
      url: "/user/teams",
      method: :get,
      query: query,
      response: [
        {200, {:array, {GitHub.Team, :full}}},
        {304, nil},
        {403, {GitHub.BasicError, :t}},
        {404, {GitHub.BasicError, :t}}
      ],
      opts: opts
    })
  end

  @doc """
  List team members

  ## Options

    * `role` (String.t()): Filters members returned by their role in the team.
    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-team-members)

  """
  @spec list_members_in_org(String.t(), String.t(), keyword) ::
          {:ok, [GitHub.User.simple()]} | {:error, GitHub.Error.t()}
  def list_members_in_org(org, team_slug, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page, :role])

    client.request(%{
      args: [org: org, team_slug: team_slug],
      call: {GitHub.Teams, :list_members_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/members",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.User, :simple}}}],
      opts: opts
    })
  end

  @doc """
  List team members (Legacy)

  ## Options

    * `role` (String.t()): Filters members returned by their role in the team.
    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-team-members-legacy)

  """
  @spec list_members_legacy(integer, keyword) ::
          {:ok, [GitHub.User.simple()]} | {:error, GitHub.Error.t()}
  def list_members_legacy(team_id, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page, :role])

    client.request(%{
      args: [team_id: team_id],
      call: {GitHub.Teams, :list_members_legacy},
      url: "/teams/#{team_id}/members",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.User, :simple}}}, {404, {GitHub.BasicError, :t}}],
      opts: opts
    })
  end

  @doc """
  List pending team invitations

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-pending-team-invitations)

  """
  @spec list_pending_invitations_in_org(String.t(), String.t(), keyword) ::
          {:ok, [GitHub.Organization.Invitation.t()]} | {:error, GitHub.Error.t()}
  def list_pending_invitations_in_org(org, team_slug, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      args: [org: org, team_slug: team_slug],
      call: {GitHub.Teams, :list_pending_invitations_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/invitations",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Organization.Invitation, :t}}}],
      opts: opts
    })
  end

  @doc """
  List pending team invitations (Legacy)

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-pending-team-invitations-legacy)

  """
  @spec list_pending_invitations_legacy(integer, keyword) ::
          {:ok, [GitHub.Organization.Invitation.t()]} | {:error, GitHub.Error.t()}
  def list_pending_invitations_legacy(team_id, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      args: [team_id: team_id],
      call: {GitHub.Teams, :list_pending_invitations_legacy},
      url: "/teams/#{team_id}/invitations",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Organization.Invitation, :t}}}],
      opts: opts
    })
  end

  @doc """
  List team projects

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-team-projects)

  """
  @spec list_projects_in_org(String.t(), String.t(), keyword) ::
          {:ok, [GitHub.Team.Project.t()]} | {:error, GitHub.Error.t()}
  def list_projects_in_org(org, team_slug, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      args: [org: org, team_slug: team_slug],
      call: {GitHub.Teams, :list_projects_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/projects",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Team.Project, :t}}}],
      opts: opts
    })
  end

  @doc """
  List team projects (Legacy)

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#list-team-projects-legacy)

  """
  @spec list_projects_legacy(integer, keyword) ::
          {:ok, [GitHub.Team.Project.t()]} | {:error, GitHub.Error.t()}
  def list_projects_legacy(team_id, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      args: [team_id: team_id],
      call: {GitHub.Teams, :list_projects_legacy},
      url: "/teams/#{team_id}/projects",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Team.Project, :t}}}, {404, {GitHub.BasicError, :t}}],
      opts: opts
    })
  end

  @doc """
  List team repositories

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#list-team-repositories)

  """
  @spec list_repos_in_org(String.t(), String.t(), keyword) ::
          {:ok, [GitHub.Repository.minimal()]} | {:error, GitHub.Error.t()}
  def list_repos_in_org(org, team_slug, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      args: [org: org, team_slug: team_slug],
      call: {GitHub.Teams, :list_repos_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/repos",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Repository, :minimal}}}],
      opts: opts
    })
  end

  @doc """
  List team repositories (Legacy)

  ## Options

    * `per_page` (integer): The number of results per page (max 100).
    * `page` (integer): Page number of the results to fetch.

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#list-team-repositories-legacy)

  """
  @spec list_repos_legacy(integer, keyword) ::
          {:ok, [GitHub.Repository.minimal()]} | {:error, GitHub.Error.t()}
  def list_repos_legacy(team_id, opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:page, :per_page])

    client.request(%{
      args: [team_id: team_id],
      call: {GitHub.Teams, :list_repos_legacy},
      url: "/teams/#{team_id}/repos",
      method: :get,
      query: query,
      response: [{200, {:array, {GitHub.Repository, :minimal}}}, {404, {GitHub.BasicError, :t}}],
      opts: opts
    })
  end

  @doc """
  Remove team member (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#remove-team-member-legacy)

  """
  @spec remove_member_legacy(integer, String.t(), keyword) :: :ok | {:error, GitHub.Error.t()}
  def remove_member_legacy(team_id, username, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, username: username],
      call: {GitHub.Teams, :remove_member_legacy},
      url: "/teams/#{team_id}/members/#{username}",
      method: :delete,
      response: [{204, nil}, {404, nil}],
      opts: opts
    })
  end

  @doc """
  Remove team membership for a user

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#remove-team-membership-for-a-user)

  """
  @spec remove_membership_for_user_in_org(String.t(), String.t(), String.t(), keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def remove_membership_for_user_in_org(org, team_slug, username, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, username: username],
      call: {GitHub.Teams, :remove_membership_for_user_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/memberships/#{username}",
      method: :delete,
      response: [{204, nil}, {403, nil}],
      opts: opts
    })
  end

  @doc """
  Remove team membership for a user (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#remove-team-membership-for-a-user-legacy)

  """
  @spec remove_membership_for_user_legacy(integer, String.t(), keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def remove_membership_for_user_legacy(team_id, username, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, username: username],
      call: {GitHub.Teams, :remove_membership_for_user_legacy},
      url: "/teams/#{team_id}/memberships/#{username}",
      method: :delete,
      response: [{204, nil}, {403, nil}],
      opts: opts
    })
  end

  @doc """
  Remove a project from a team

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#remove-a-project-from-a-team)

  """
  @spec remove_project_in_org(String.t(), String.t(), integer, keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def remove_project_in_org(org, team_slug, project_id, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, project_id: project_id],
      call: {GitHub.Teams, :remove_project_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/projects/#{project_id}",
      method: :delete,
      response: [{204, nil}],
      opts: opts
    })
  end

  @doc """
  Remove a project from a team (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#remove-a-project-from-a-team-legacy)

  """
  @spec remove_project_legacy(integer, integer, keyword) :: :ok | {:error, GitHub.Error.t()}
  def remove_project_legacy(team_id, project_id, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, project_id: project_id],
      call: {GitHub.Teams, :remove_project_legacy},
      url: "/teams/#{team_id}/projects/#{project_id}",
      method: :delete,
      response: [{204, nil}, {404, {GitHub.BasicError, :t}}, {422, {GitHub.ValidationError, :t}}],
      opts: opts
    })
  end

  @doc """
  Remove a repository from a team

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#remove-a-repository-from-a-team)

  """
  @spec remove_repo_in_org(String.t(), String.t(), String.t(), String.t(), keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def remove_repo_in_org(org, team_slug, owner, repo, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, owner: owner, repo: repo],
      call: {GitHub.Teams, :remove_repo_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/repos/#{owner}/#{repo}",
      method: :delete,
      response: [{204, nil}],
      opts: opts
    })
  end

  @doc """
  Remove a repository from a team (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#remove-a-repository-from-a-team-legacy)

  """
  @spec remove_repo_legacy(integer, String.t(), String.t(), keyword) ::
          :ok | {:error, GitHub.Error.t()}
  def remove_repo_legacy(team_id, owner, repo, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, owner: owner, repo: repo],
      call: {GitHub.Teams, :remove_repo_legacy},
      url: "/teams/#{team_id}/repos/#{owner}/#{repo}",
      method: :delete,
      response: [{204, nil}],
      opts: opts
    })
  end

  @doc """
  Update a discussion comment

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#update-a-discussion-comment)

  """
  @spec update_discussion_comment_in_org(String.t(), String.t(), integer, integer, map, keyword) ::
          {:ok, GitHub.Team.DiscussionComment.t()} | {:error, GitHub.Error.t()}
  def update_discussion_comment_in_org(
        org,
        team_slug,
        discussion_number,
        comment_number,
        body,
        opts \\ []
      ) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [
        org: org,
        team_slug: team_slug,
        discussion_number: discussion_number,
        comment_number: comment_number,
        body: body
      ],
      call: {GitHub.Teams, :update_discussion_comment_in_org},
      url:
        "/orgs/#{org}/teams/#{team_slug}/discussions/#{discussion_number}/comments/#{comment_number}",
      body: body,
      method: :patch,
      request: [{"application/json", :map}],
      response: [{200, {GitHub.Team.DiscussionComment, :t}}],
      opts: opts
    })
  end

  @doc """
  Update a discussion comment (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#update-a-discussion-comment-legacy)

  """
  @spec update_discussion_comment_legacy(integer, integer, integer, map, keyword) ::
          {:ok, GitHub.Team.DiscussionComment.t()} | {:error, GitHub.Error.t()}
  def update_discussion_comment_legacy(
        team_id,
        discussion_number,
        comment_number,
        body,
        opts \\ []
      ) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [
        team_id: team_id,
        discussion_number: discussion_number,
        comment_number: comment_number,
        body: body
      ],
      call: {GitHub.Teams, :update_discussion_comment_legacy},
      url: "/teams/#{team_id}/discussions/#{discussion_number}/comments/#{comment_number}",
      body: body,
      method: :patch,
      request: [{"application/json", :map}],
      response: [{200, {GitHub.Team.DiscussionComment, :t}}],
      opts: opts
    })
  end

  @doc """
  Update a discussion

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#update-a-discussion)

  """
  @spec update_discussion_in_org(String.t(), String.t(), integer, map, keyword) ::
          {:ok, GitHub.Team.Discussion.t()} | {:error, GitHub.Error.t()}
  def update_discussion_in_org(org, team_slug, discussion_number, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, discussion_number: discussion_number, body: body],
      call: {GitHub.Teams, :update_discussion_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}/discussions/#{discussion_number}",
      body: body,
      method: :patch,
      request: [{"application/json", :map}],
      response: [{200, {GitHub.Team.Discussion, :t}}],
      opts: opts
    })
  end

  @doc """
  Update a discussion (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#update-a-discussion-legacy)

  """
  @spec update_discussion_legacy(integer, integer, map, keyword) ::
          {:ok, GitHub.Team.Discussion.t()} | {:error, GitHub.Error.t()}
  def update_discussion_legacy(team_id, discussion_number, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, discussion_number: discussion_number, body: body],
      call: {GitHub.Teams, :update_discussion_legacy},
      url: "/teams/#{team_id}/discussions/#{discussion_number}",
      body: body,
      method: :patch,
      request: [{"application/json", :map}],
      response: [{200, {GitHub.Team.Discussion, :t}}],
      opts: opts
    })
  end

  @doc """
  Update a team

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams#update-a-team)

  """
  @spec update_in_org(String.t(), String.t(), map, keyword) ::
          {:ok, GitHub.Team.full()} | {:error, GitHub.Error.t()}
  def update_in_org(org, team_slug, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [org: org, team_slug: team_slug, body: body],
      call: {GitHub.Teams, :update_in_org},
      url: "/orgs/#{org}/teams/#{team_slug}",
      body: body,
      method: :patch,
      request: [{"application/json", :map}],
      response: [
        {200, {GitHub.Team, :full}},
        {201, {GitHub.Team, :full}},
        {403, {GitHub.BasicError, :t}},
        {404, {GitHub.BasicError, :t}},
        {422, {GitHub.ValidationError, :t}}
      ],
      opts: opts
    })
  end

  @doc """
  Update a team (Legacy)

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/teams/#update-a-team-legacy)

  """
  @spec update_legacy(integer, map, keyword) ::
          {:ok, GitHub.Team.full()} | {:error, GitHub.Error.t()}
  def update_legacy(team_id, body, opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      args: [team_id: team_id, body: body],
      call: {GitHub.Teams, :update_legacy},
      url: "/teams/#{team_id}",
      body: body,
      method: :patch,
      request: [{"application/json", :map}],
      response: [
        {200, {GitHub.Team, :full}},
        {201, {GitHub.Team, :full}},
        {403, {GitHub.BasicError, :t}},
        {404, {GitHub.BasicError, :t}},
        {422, {GitHub.ValidationError, :t}}
      ],
      opts: opts
    })
  end
end