defmodule GitHub.SecurityAdvisories do
@moduledoc """
Provides API endpoints related to security advisories
"""
@default_client GitHub.Client
@doc """
Privately report a security vulnerability
## Resources
* [API method documentation](https://docs.github.com/rest/security-advisories/repository-advisories#privately-report-a-security-vulnerability)
"""
@spec create_private_vulnerability_report(
String.t(),
String.t(),
GitHub.PrivateVulnerabilityReport.Create.t(),
keyword
) :: {:ok, GitHub.Repository.Advisory.t()} | {:error, GitHub.Error.t()}
def create_private_vulnerability_report(owner, repo, body, opts \\ []) do
client = opts[:client] || @default_client
client.request(%{
args: [owner: owner, repo: repo, body: body],
call: {GitHub.SecurityAdvisories, :create_private_vulnerability_report},
url: "/repos/#{owner}/#{repo}/security-advisories/reports",
body: body,
method: :post,
request: [{"application/json", {GitHub.PrivateVulnerabilityReport.Create, :t}}],
response: [
{201, {GitHub.Repository.Advisory, :t}},
{403, {GitHub.BasicError, :t}},
{404, {GitHub.BasicError, :t}},
{422, {GitHub.ValidationError, :t}}
],
opts: opts
})
end
@doc """
Create a repository security advisory
## Resources
* [API method documentation](https://docs.github.com/rest/security-advisories/repository-advisories#create-a-repository-security-advisory)
"""
@spec create_repository_advisory(
String.t(),
String.t(),
GitHub.Repository.Advisory.Create.t(),
keyword
) :: {:ok, GitHub.Repository.Advisory.t()} | {:error, GitHub.Error.t()}
def create_repository_advisory(owner, repo, body, opts \\ []) do
client = opts[:client] || @default_client
client.request(%{
args: [owner: owner, repo: repo, body: body],
call: {GitHub.SecurityAdvisories, :create_repository_advisory},
url: "/repos/#{owner}/#{repo}/security-advisories",
body: body,
method: :post,
request: [{"application/json", {GitHub.Repository.Advisory.Create, :t}}],
response: [
{201, {GitHub.Repository.Advisory, :t}},
{403, {GitHub.BasicError, :t}},
{404, {GitHub.BasicError, :t}},
{422, {GitHub.ValidationError, :t}}
],
opts: opts
})
end
@doc """
Get a repository security advisory
## Resources
* [API method documentation](https://docs.github.com/rest/security-advisories/repository-advisories#get-a-repository-security-advisory)
"""
@spec get_repository_advisory(String.t(), String.t(), String.t(), keyword) ::
{:ok, GitHub.Repository.Advisory.t()} | {:error, GitHub.Error.t()}
def get_repository_advisory(owner, repo, ghsa_id, opts \\ []) do
client = opts[:client] || @default_client
client.request(%{
args: [owner: owner, repo: repo, ghsa_id: ghsa_id],
call: {GitHub.SecurityAdvisories, :get_repository_advisory},
url: "/repos/#{owner}/#{repo}/security-advisories/#{ghsa_id}",
method: :get,
response: [
{200, {GitHub.Repository.Advisory, :t}},
{403, {GitHub.BasicError, :t}},
{404, {GitHub.BasicError, :t}}
],
opts: opts
})
end
@doc """
List repository security advisories
## Options
* `direction` (String.t()): The direction to sort the results by.
* `sort` (String.t()): The property to sort the results by.
* `before` (String.t()): A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results before this cursor.
* `after` (String.t()): A cursor, as given in the [Link header](https://docs.github.com/rest/guides/using-pagination-in-the-rest-api#using-link-headers). If specified, the query only searches for results after this cursor.
* `per_page` (integer): Number of advisories to return per page.
* `state` (String.t()): Filter by state of the repository advisories. Only advisories of this state will be returned.
## Resources
* [API method documentation](https://docs.github.com/rest/security-advisories/repository-advisories#list-repository-security-advisories)
"""
@spec list_repository_advisories(String.t(), String.t(), keyword) ::
{:ok, [GitHub.Repository.Advisory.t()]} | {:error, GitHub.Error.t()}
def list_repository_advisories(owner, repo, opts \\ []) do
client = opts[:client] || @default_client
query = Keyword.take(opts, [:after, :before, :direction, :per_page, :sort, :state])
client.request(%{
args: [owner: owner, repo: repo],
call: {GitHub.SecurityAdvisories, :list_repository_advisories},
url: "/repos/#{owner}/#{repo}/security-advisories",
method: :get,
query: query,
response: [
{200, {:array, {GitHub.Repository.Advisory, :t}}},
{400, {GitHub.BasicError, :t}},
{404, {GitHub.BasicError, :t}}
],
opts: opts
})
end
@doc """
Update a repository security advisory
## Resources
* [API method documentation](https://docs.github.com/rest/security-advisories/repository-advisories#update-a-repository-security-advisory)
"""
@spec update_repository_advisory(
String.t(),
String.t(),
String.t(),
GitHub.Repository.Advisory.Update.t(),
keyword
) :: {:ok, GitHub.Repository.Advisory.t()} | {:error, GitHub.Error.t()}
def update_repository_advisory(owner, repo, ghsa_id, body, opts \\ []) do
client = opts[:client] || @default_client
client.request(%{
args: [owner: owner, repo: repo, ghsa_id: ghsa_id, body: body],
call: {GitHub.SecurityAdvisories, :update_repository_advisory},
url: "/repos/#{owner}/#{repo}/security-advisories/#{ghsa_id}",
body: body,
method: :patch,
request: [{"application/json", {GitHub.Repository.Advisory.Update, :t}}],
response: [
{200, {GitHub.Repository.Advisory, :t}},
{403, {GitHub.BasicError, :t}},
{404, {GitHub.BasicError, :t}},
{422, {GitHub.ValidationError, :t}}
],
opts: opts
})
end
end