R/organization.R

Defines functions get_org_invitations create_org_invitation_email create_org_invitation_ghname check_org_public_membership check_org_private_membership remove_org_member add_org_member get_org_members_list get_org_repos_list

Documented in add_org_member check_org_private_membership check_org_public_membership create_org_invitation_email create_org_invitation_ghname get_org_invitations get_org_members_list get_org_repos_list remove_org_member

#' Retrieve Repositories in an Organization
#'
#' Obtains repositories that belong to an organization according to
#' different levels.
#'
#' @param org  Name of the organization
#' @param type The kind of repository to list. Can be one of:
#'             `"all"`, `"public"`, `"private"`, `"forks"`, `"sources"`, `"member"`.
#'             Default: `"all"`
#'
#' @references
#' <https://developer.github.com/v3/repos/#list-organization-repositories>
#' @export
#' @seealso [`get_self_repos_list`], [`get_user_repos_list`]
#' @examples
#' \dontrun{
#' get_org_repos_list("stat385uiuc", "all")
#' }
get_org_repos_list = function(org,
                         type = c("all", "public", "private", "forks",
                                  "sources", "member")) {
  # Require type
  type = match.arg(type)

  get_gh("GET /orgs/:org/repos", org = org, type = type)
}

#' Retrieve Membership list in an Organization
#'
#' Retrieves the usernames of people in an Organization
#'
#' @param org    Name of the organization
#' @param filter Filter members returned in the list. Can be one of: `"2fa_disabled"`
#'                or `"all"`. Default: `"all"`
#' @param role   Filter members returned by their role. Can be one of: `"all"`,
#'               `"admin"`, or `"member"`. Default: `"all"`
#'
#' @section Filter:
#'
#' - `"2fa_disabled"`
#'     - All members the authenticated user can see.
#' - `"all"`
#'     - Members without two-factor authentication enabled. Available for organization owners.
#'
#' @section Members List:
#'
#' - `"all"`
#'     - All members of the organization, regardless of role.
#' - `"admin"`
#'     - Organization owners.
#' - `"member"`
#'     - Non-owner organization members.
#'
#' @references
#' <https://developer.github.com/v3/orgs/members/#members-list>
#' @export
get_org_members_list = function(org,
                                filter = c("all", "2fa_disabled"),
                                role = c("all", "admin", "member")) {
  # Require type
  filter = match.arg(filter)

  # Require type
  role = match.arg(role)

  get_gh(
    "GET /orgs/:org/members",
    org = org,
    filter = filter,
    role = role
  )
}

#' Invite, Remove, or Modify User Membership in an Organization
#'
#' Sends an invitation, removes, or modifies a user role within an organization.
#'
#' @param org      Name of the organization.
#' @param username Name of the user on GitHub.
#' @param role     The role to give the user in the organization. Can be one of:
#'                  `"admin"` or `"member"`. Default: `"member"`
#'
#' @section Role:
#'
#' - `"admin"`
#'     - The user will become an owner of the organization.
#' - `"member"`
#'     - The user will become a non-owner member of the organization.
#'
#' @details
#' To prevent abuse, the authenticated user is limited to 50 organization
#' invitations per 24 hour period. If the organization is more than one month
#' old or on a paid plan, the limit is 500 invitations per 24 hour period.
#' @references
#' <https://developer.github.com/v3/orgs/members/#add-or-update-organization-membership>
#' @rdname org_member
#' @export
add_org_member = function(org, username, role = c("member", "admin")) {
  # Require type
  role = match.arg(role)

  put_gh(
    "PUT /orgs/:org/memberships/:username",
    org = org,
    username = username,
    role = role
  )
}

#' @references
#' <https://developer.github.com/v3/orgs/members/#remove-a-member>
#' @rdname org_member
#' @export
remove_org_member = function(org, username) {
  delete_gh("DELETE /orgs/:org/memberships/:username",
            org = org,
            username = username)
}

#' @rdname org_member
#' @export
update_org_member_role = add_org_member


#' @section Private Membership:
#' This function is a work in progress.
#' @references
#' GitHub API Documentation reference for private membership check
#' <https://developer.github.com/v3/orgs/members/#check-membership>
#' @rdname org_member
#' @export
check_org_private_membership = function(org, username) {
  # By default, this returns an empty string "" if it succeeds...
  # A 404 error if it doesn't.
  res = tryCatch({
    get_gh("GET /orgs/:org/members/:username",
           org = org, username = username)
  },
  error = function(e) {
    FALSE
  })


  if(is.logical(res)) {
    return(res)
  }

  TRUE
}

#' @references
#' GitHub API Documentation reference for public membership check
#' <https://developer.github.com/v3/orgs/members/#check-public-membership>
#' @rdname org_member
#' @export
check_org_public_membership = function(org, username) {

  # By default, this returns an empty string "" if it succeeds...
  # A 404 error if it doesn't.
  res = tryCatch({
    get_gh("GET /orgs/:org/public_members/:username",
         org = org, username = username)
    },
    error = function(e) {
      FALSE
    })


  if(is.logical(res)) {
    return(res)
  }

  TRUE
}

#' Create Organization Invitations
#'
#' Invite multiple people to an organization using their GitHub user ID or their
#' e-mail address.
#'
#' @inheritParams get_org_repos_list
#' @param invitee_id GitHub user ID for the person you are inviting.
#'                   Not required if you provide email.
#' @param email      Email address of the person you are inviting, which can be
#'                   an existing GitHub user. Not required if you provide invitee_id.
#' @param role       Specify role for new member. Can be one of:
#' @param team_ids   Specify IDs for the teams you want to invite new members to.
#'
#' @details
#'
#' This set of API bindings is a WIP and requires additional values.
#'
#' @section Role:
#'
#' Specify `role` for new member. Can be one of:
#'
#' - `admin`
#'      - Organization owners with full administrative rights to the
#'        organization and complete access to all repositories and teams.
#' - `direct_member`
#'      - Non-owner organization members with ability to see other members
#'        and join teams by invitation.
#' - `billing_manager`
#'      - Non-owner organization members with ability to manage the billing
#'        settings of your organization.
#'
#' @references
#' GitHub API Documentation reference for public membership check
#' <https://developer.github.com/v3/orgs/members/#create-organization-invitation>
#' @rdname org-invites
#' @export
create_org_invitation_ghname = function(org,
                                        invitee_id,
                                        role = c("admin", "direct_member", "billing_manager"),
                                        team_ids = NULL) {
  if (!is.null(team_ids)) {
    post_gh(
      "POST /orgs/:org/invitations",
      org = org,
      invitee_id = invitee_id,
      role = role,
      team_ids = team_ids
    )
  } else {
    post_gh(
      "POST /orgs/:org/invitations",
      org = org,
      invitee_id = invitee_id,
      role = role
    )

  }
}

#' @rdname org-invites
#' @export
create_org_invitation_email =  function(org,
                                        email,
                                        role = c("admin", "direct_member", "billing_manager"),
                                        team_ids = NULL) {
  if (!is.null(team_ids)) {
    post_gh(
      "POST /orgs/:org/invitations",
      org = org,
      email = email,
      role = role,
      team_ids = team_ids
    )
  } else {
    post_gh(
      "POST /orgs/:org/invitations",
      org = org,
      email = email,
      role = role
    )
  }

}

#' List Organization Invitations
#'
#' Retrieves all pending organization invitations
#'
#' @inheritParams get_org_repos_list
#'
#' @references
#' GitHub API Documentation reference for public membership check
#' <https://developer.github.com/v3/orgs/members/#list-pending-organization-invitations>
#' @export
get_org_invitations = function(org) {
  get_gh("GET /orgs/:org/invitations", org = org)
}
coatless/ghapi documentation built on Jan. 4, 2024, 4:37 a.m.