lib/aws/generated/codeartifact.ex

# WARNING: DO NOT EDIT, AUTO-GENERATED CODE!
# See https://github.com/aws-beam/aws-codegen for more details.

defmodule AWS.Codeartifact do
  @moduledoc """
  CodeArtifact is a fully managed artifact repository compatible with
  language-native package managers and build tools such as npm, Apache Maven, pip,
  and dotnet.

  You can use CodeArtifact to share packages with development teams and pull
  packages. Packages can be pulled from both public and CodeArtifact repositories.
  You can also create an upstream relationship between a CodeArtifact repository
  and another repository, which effectively merges their contents from the point
  of view of a package manager client.

  ## CodeArtifact Components

  Use the information in this guide to help you work with the following
  CodeArtifact components:

    * **Repository## : A CodeArtifact repository contains a set of
  [package versions](https://docs.aws.amazon.com/codeartifact/latest/ug/welcome.html#welcome-concepts-package-version),
  each of which maps to a set of assets, or files. Repositories are polyglot, so a
  single repository can contain packages of any supported type. Each repository
  exposes endpoints for fetching and publishing packages using tools like the 
  `npm` ** CLI, the Maven CLI (** `mvn` **), Python CLIs (** `pip` ** and
  `twine`), and NuGet CLIs (`nuget` and `dotnet`).

    * **Domain**: Repositories are aggregated into a higher-level entity
  known as a *domain*. All package assets and metadata are stored in the domain,
  but are consumed through repositories. A given package asset, such as a Maven
  JAR file, is stored once per domain, no matter how many repositories it's
  present in. All of the assets and metadata in a domain are encrypted with the
  same customer master key (CMK) stored in Key Management Service (KMS).

  Each repository is a member of a single domain and can't be moved to a different
  domain.

  The domain allows organizational policy to be applied across multiple
  repositories, such as which accounts can access repositories in the domain, and
  which public repositories can be used as sources of packages.

  Although an organization can have multiple domains, we recommend a single
  production domain that contains all published artifacts so that teams can find
  and share packages across their organization.

    * **Package**: A *package* is a bundle of software and the metadata
  required to resolve dependencies and install the software. CodeArtifact supports
  [npm](https://docs.aws.amazon.com/codeartifact/latest/ug/using-npm.html), [PyPI](https://docs.aws.amazon.com/codeartifact/latest/ug/using-python.html),
  [Maven](https://docs.aws.amazon.com/codeartifact/latest/ug/using-maven), and [NuGet](https://docs.aws.amazon.com/codeartifact/latest/ug/using-nuget) package
  formats.

  In CodeArtifact, a package consists of:

      * A *name* (for example, `webpack` is the name of a
  popular npm package)

      * An optional namespace (for example, `@types` in
  `@types/node`)

      * A set of versions (for example, `1.0.0`, `1.0.1`,
  `1.0.2`, etc.)

      * Package-level metadata (for example, npm tags)

    * **Package version**: A version of a package, such as `@types/node
  12.6.9`. The version number format and semantics vary for different package
  formats. For example, npm package versions must conform to the [Semantic Versioning specification](https://semver.org/). In CodeArtifact, a package
  version consists of the version identifier, metadata at the package version
  level, and a set of assets.

    * **Upstream repository**: One repository is *upstream* of another
  when the package versions in it can be accessed from the repository endpoint of
  the downstream repository, effectively merging the contents of the two
  repositories from the point of view of a client. CodeArtifact allows creating an
  upstream relationship between two repositories.

    * **Asset**: An individual file stored in CodeArtifact associated
  with a package version, such as an npm `.tgz` file or Maven POM and JAR files.

  CodeArtifact supports these operations:

    * `AssociateExternalConnection`: Adds an existing external
  connection to a repository.

    * `CopyPackageVersions`: Copies package versions from one repository
  to another repository in the same domain.

    * `CreateDomain`: Creates a domain

    * `CreateRepository`: Creates a CodeArtifact repository in a domain.

    * `DeleteDomain`: Deletes a domain. You cannot delete a domain that
  contains repositories.

    * `DeleteDomainPermissionsPolicy`: Deletes the resource policy that
  is set on a domain.

    * `DeletePackageVersions`: Deletes versions of a package. After a
  package has been deleted, it can be republished, but its assets and metadata
  cannot be restored because they have been permanently removed from storage.

    * `DeleteRepository`: Deletes a repository.

    * `DeleteRepositoryPermissionsPolicy`: Deletes the resource policy
  that is set on a repository.

    * `DescribeDomain`: Returns a `DomainDescription` object that
  contains information about the requested domain.

    * `DescribePackage`: Returns a
  [PackageDescription](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PackageDescription.html) object that contains details about a package.

    * `DescribePackageVersion`: Returns a
  [PackageVersionDescription](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PackageVersionDescription.html)
  object that contains details about a package version.

    * `DescribeRepository`: Returns a `RepositoryDescription` object
  that contains detailed information about the requested repository.

    * `DisposePackageVersions`: Disposes versions of a package. A
  package version with the status `Disposed` cannot be restored because they have
  been permanently removed from storage.

    * `DisassociateExternalConnection`: Removes an existing external
  connection from a repository.

    * `GetAuthorizationToken`: Generates a temporary authorization token
  for accessing repositories in the domain. The token expires the authorization
  period has passed. The default authorization period is 12 hours and can be
  customized to any length with a maximum of 12 hours.

    * `GetDomainPermissionsPolicy`: Returns the policy of a resource
  that is attached to the specified domain.

    * `GetPackageVersionAsset`: Returns the contents of an asset that is
  in a package version.

    * `GetPackageVersionReadme`: Gets the readme file or descriptive
  text for a package version.

    * `GetRepositoryEndpoint`: Returns the endpoint of a repository for
  a specific package format. A repository has one endpoint for each package
  format:

      * `maven`

      * `npm`

      * `nuget`

      * `pypi`

    * `GetRepositoryPermissionsPolicy`: Returns the resource policy that
  is set on a repository.

    * `ListDomains`: Returns a list of `DomainSummary` objects. Each
  returned `DomainSummary` object contains information about a domain.

    * `ListPackages`: Lists the packages in a repository.

    * `ListPackageVersionAssets`: Lists the assets for a given package
  version.

    * `ListPackageVersionDependencies`: Returns a list of the direct
  dependencies for a package version.

    * `ListPackageVersions`: Returns a list of package versions for a
  specified package in a repository.

    * `ListRepositories`: Returns a list of repositories owned by the
  Amazon Web Services account that called this method.

    * `ListRepositoriesInDomain`: Returns a list of the repositories in
  a domain.

    * `PutDomainPermissionsPolicy`: Attaches a resource policy to a
  domain.

    * `PutPackageOriginConfiguration`: Sets the package origin
  configuration for a package, which determine how new versions of the package can
  be added to a specific repository.

    * `PutRepositoryPermissionsPolicy`: Sets the resource policy on a
  repository that specifies permissions to access it.

    * `UpdatePackageVersionsStatus`: Updates the status of one or more
  versions of a package.

    * `UpdateRepository`: Updates the properties of a repository.
  """

  alias AWS.Client
  alias AWS.Request

  def metadata do
    %{
      abbreviation: nil,
      api_version: "2018-09-22",
      content_type: "application/x-amz-json-1.1",
      credential_scope: nil,
      endpoint_prefix: "codeartifact",
      global?: false,
      protocol: "rest-json",
      service_id: "codeartifact",
      signature_version: "v4",
      signing_name: "codeartifact",
      target_prefix: nil
    }
  end

  @doc """
  Adds an existing external connection to a repository.

  One external connection is allowed per repository.

  A repository can have one or more upstream repositories, or an external
  connection.
  """
  def associate_external_connection(%Client{} = client, input, options \\ []) do
    url_path = "/v1/repository/external-connection"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"externalConnection", "external-connection"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Copies package versions from one repository to another repository in the same
  domain.

  You must specify `versions` or `versionRevisions`. You cannot specify both.
  """
  def copy_package_versions(%Client{} = client, input, options \\ []) do
    url_path = "/v1/package/versions/copy"
    headers = []

    {query_params, input} =
      [
        {"destinationRepository", "destination-repository"},
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"format", "format"},
        {"namespace", "namespace"},
        {"package", "package"},
        {"sourceRepository", "source-repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Creates a domain.

  CodeArtifact *domains* make it easier to manage multiple repositories across an
  organization. You can use a domain to apply permissions across many repositories
  owned by different Amazon Web Services accounts. An asset is stored only once in
  a domain, even if it's in multiple repositories.

  Although you can have multiple domains, we recommend a single production domain
  that contains all published artifacts so that your development teams can find
  and share packages. You can use a second pre-production domain to test changes
  to the production domain configuration.
  """
  def create_domain(%Client{} = client, input, options \\ []) do
    url_path = "/v1/domain"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Creates a repository.
  """
  def create_repository(%Client{} = client, input, options \\ []) do
    url_path = "/v1/repository"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Deletes a domain.

  You cannot delete a domain that contains repositories. If you want to delete a
  domain with repositories, first delete its repositories.
  """
  def delete_domain(%Client{} = client, input, options \\ []) do
    url_path = "/v1/domain"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Deletes the resource policy set on a domain.
  """
  def delete_domain_permissions_policy(%Client{} = client, input, options \\ []) do
    url_path = "/v1/domain/permissions/policy"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"policyRevision", "policy-revision"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Deletes one or more versions of a package.

  A deleted package version cannot be restored in your repository. If you want to
  remove a package version from your repository and be able to restore it later,
  set its status to `Archived`. Archived packages cannot be downloaded from a
  repository and don't show up with list package APIs (for example,
  [ListackageVersions](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListPackageVersions.html)), but you can restore them using
  [UpdatePackageVersionsStatus](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_UpdatePackageVersionsStatus.html).
  """
  def delete_package_versions(%Client{} = client, input, options \\ []) do
    url_path = "/v1/package/versions/delete"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"format", "format"},
        {"namespace", "namespace"},
        {"package", "package"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Deletes a repository.
  """
  def delete_repository(%Client{} = client, input, options \\ []) do
    url_path = "/v1/repository"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Deletes the resource policy that is set on a repository.

  After a resource policy is deleted, the permissions allowed and denied by the
  deleted policy are removed. The effect of deleting a resource policy might not
  be immediate.

  Use `DeleteRepositoryPermissionsPolicy` with caution. After a policy is deleted,
  Amazon Web Services users, roles, and accounts lose permissions to perform the
  repository actions granted by the deleted policy.
  """
  def delete_repository_permissions_policy(%Client{} = client, input, options \\ []) do
    url_path = "/v1/repository/permissions/policies"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"policyRevision", "policy-revision"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Returns a
  [DomainDescription](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_DomainDescription.html)
  object that contains information about the requested domain.
  """
  def describe_domain(%Client{} = client, domain, domain_owner \\ nil, options \\ []) do
    url_path = "/v1/domain"
    headers = []
    query_params = []

    query_params =
      if !is_nil(domain_owner) do
        [{"domain-owner", domain_owner} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain) do
        [{"domain", domain} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, nil)
  end

  @doc """
  Returns a
  [PackageDescription](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PackageDescription.html)
  object that contains information about the requested package.
  """
  def describe_package(
        %Client{} = client,
        domain,
        domain_owner \\ nil,
        format,
        namespace \\ nil,
        package,
        repository,
        options \\ []
      ) do
    url_path = "/v1/package"
    headers = []
    query_params = []

    query_params =
      if !is_nil(repository) do
        [{"repository", repository} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(package) do
        [{"package", package} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(namespace) do
        [{"namespace", namespace} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(format) do
        [{"format", format} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain_owner) do
        [{"domain-owner", domain_owner} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain) do
        [{"domain", domain} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, nil)
  end

  @doc """
  Returns a
  [PackageVersionDescription](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PackageVersionDescription.html)
  object that contains information about the requested package version.
  """
  def describe_package_version(
        %Client{} = client,
        domain,
        domain_owner \\ nil,
        format,
        namespace \\ nil,
        package,
        package_version,
        repository,
        options \\ []
      ) do
    url_path = "/v1/package/version"
    headers = []
    query_params = []

    query_params =
      if !is_nil(repository) do
        [{"repository", repository} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(package_version) do
        [{"version", package_version} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(package) do
        [{"package", package} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(namespace) do
        [{"namespace", namespace} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(format) do
        [{"format", format} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain_owner) do
        [{"domain-owner", domain_owner} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain) do
        [{"domain", domain} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, nil)
  end

  @doc """
  Returns a `RepositoryDescription` object that contains detailed information
  about the requested repository.
  """
  def describe_repository(
        %Client{} = client,
        domain,
        domain_owner \\ nil,
        repository,
        options \\ []
      ) do
    url_path = "/v1/repository"
    headers = []
    query_params = []

    query_params =
      if !is_nil(repository) do
        [{"repository", repository} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain_owner) do
        [{"domain-owner", domain_owner} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain) do
        [{"domain", domain} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, nil)
  end

  @doc """
  Removes an existing external connection from a repository.
  """
  def disassociate_external_connection(%Client{} = client, input, options \\ []) do
    url_path = "/v1/repository/external-connection"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"externalConnection", "external-connection"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Deletes the assets in package versions and sets the package versions' status to
  `Disposed`.

  A disposed package version cannot be restored in your repository because its
  assets are deleted.

  To view all disposed package versions in a repository, use
  [ListPackageVersions](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListPackageVersions.html) and set the
  [status](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListPackageVersions.html#API_ListPackageVersions_RequestSyntax)
  parameter to `Disposed`.

  To view information about a disposed package version, use
  [DescribePackageVersion](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_DescribePackageVersion.html).
  """
  def dispose_package_versions(%Client{} = client, input, options \\ []) do
    url_path = "/v1/package/versions/dispose"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"format", "format"},
        {"namespace", "namespace"},
        {"package", "package"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Generates a temporary authorization token for accessing repositories in the
  domain.

  This API requires the `codeartifact:GetAuthorizationToken` and
  `sts:GetServiceBearerToken` permissions. For more information about
  authorization tokens, see [CodeArtifact authentication and tokens](https://docs.aws.amazon.com/codeartifact/latest/ug/tokens-authentication.html).

  CodeArtifact authorization tokens are valid for a period of 12 hours when
  created with the `login` command. You can call `login` periodically to refresh
  the token. When you create an authorization token with the
  `GetAuthorizationToken` API, you can set a custom authorization period, up to a
  maximum of 12 hours, with the `durationSeconds` parameter.

  The authorization period begins after `login` or `GetAuthorizationToken` is
  called. If `login` or `GetAuthorizationToken` is called while assuming a role,
  the token lifetime is independent of the maximum session duration of the role.
  For example, if you call `sts assume-role` and specify a session duration of 15
  minutes, then generate a CodeArtifact authorization token, the token will be
  valid for the full authorization period even though this is longer than the
  15-minute session duration.

  See [Using IAM Roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) for
  more information on controlling session duration.
  """
  def get_authorization_token(%Client{} = client, input, options \\ []) do
    url_path = "/v1/authorization-token"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"durationSeconds", "duration"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Returns the resource policy attached to the specified domain.

  The policy is a resource-based policy, not an identity-based policy. For more
  information, see [Identity-based policies and resource-based policies
  ](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)
  in the *IAM User Guide*.
  """
  def get_domain_permissions_policy(
        %Client{} = client,
        domain,
        domain_owner \\ nil,
        options \\ []
      ) do
    url_path = "/v1/domain/permissions/policy"
    headers = []
    query_params = []

    query_params =
      if !is_nil(domain_owner) do
        [{"domain-owner", domain_owner} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain) do
        [{"domain", domain} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, nil)
  end

  @doc """
  Returns an asset (or file) that is in a package.

  For example, for a Maven package version, use `GetPackageVersionAsset` to
  download a `JAR` file, a `POM` file, or any other assets in the package version.
  """
  def get_package_version_asset(
        %Client{} = client,
        asset,
        domain,
        domain_owner \\ nil,
        format,
        namespace \\ nil,
        package,
        package_version,
        package_version_revision \\ nil,
        repository,
        options \\ []
      ) do
    url_path = "/v1/package/version/asset"
    headers = []
    query_params = []

    query_params =
      if !is_nil(repository) do
        [{"repository", repository} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(package_version_revision) do
        [{"revision", package_version_revision} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(package_version) do
        [{"version", package_version} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(package) do
        [{"package", package} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(namespace) do
        [{"namespace", namespace} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(format) do
        [{"format", format} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain_owner) do
        [{"domain-owner", domain_owner} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain) do
        [{"domain", domain} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(asset) do
        [{"asset", asset} | query_params]
      else
        query_params
      end

    options =
      Keyword.put(
        options,
        :response_header_parameters,
        [
          {"X-AssetName", "assetName"},
          {"X-PackageVersion", "packageVersion"},
          {"X-PackageVersionRevision", "packageVersionRevision"}
        ]
      )

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, nil)
  end

  @doc """
  Gets the readme file or descriptive text for a package version.

  For packages that do not contain a readme file, CodeArtifact extracts a
  description from a metadata file. For example, from the `<description>` element
  in the `pom.xml` file of a Maven package.

  The returned text might contain formatting. For example, it might contain
  formatting for Markdown or reStructuredText.
  """
  def get_package_version_readme(
        %Client{} = client,
        domain,
        domain_owner \\ nil,
        format,
        namespace \\ nil,
        package,
        package_version,
        repository,
        options \\ []
      ) do
    url_path = "/v1/package/version/readme"
    headers = []
    query_params = []

    query_params =
      if !is_nil(repository) do
        [{"repository", repository} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(package_version) do
        [{"version", package_version} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(package) do
        [{"package", package} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(namespace) do
        [{"namespace", namespace} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(format) do
        [{"format", format} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain_owner) do
        [{"domain-owner", domain_owner} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain) do
        [{"domain", domain} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, nil)
  end

  @doc """
  Returns the endpoint of a repository for a specific package format.

  A repository has one endpoint for each package format:

    * `maven`

    * `npm`

    * `nuget`

    * `pypi`
  """
  def get_repository_endpoint(
        %Client{} = client,
        domain,
        domain_owner \\ nil,
        format,
        repository,
        options \\ []
      ) do
    url_path = "/v1/repository/endpoint"
    headers = []
    query_params = []

    query_params =
      if !is_nil(repository) do
        [{"repository", repository} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(format) do
        [{"format", format} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain_owner) do
        [{"domain-owner", domain_owner} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain) do
        [{"domain", domain} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, nil)
  end

  @doc """
  Returns the resource policy that is set on a repository.
  """
  def get_repository_permissions_policy(
        %Client{} = client,
        domain,
        domain_owner \\ nil,
        repository,
        options \\ []
      ) do
    url_path = "/v1/repository/permissions/policy"
    headers = []
    query_params = []

    query_params =
      if !is_nil(repository) do
        [{"repository", repository} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain_owner) do
        [{"domain-owner", domain_owner} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(domain) do
        [{"domain", domain} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, nil)
  end

  @doc """
  Returns a list of
  [DomainSummary](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PackageVersionDescription.html)
  objects for all domains owned by the Amazon Web Services account that makes this
  call.

  Each returned `DomainSummary` object contains information about a domain.
  """
  def list_domains(%Client{} = client, input, options \\ []) do
    url_path = "/v1/domains"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Returns a list of
  [AssetSummary](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_AssetSummary.html)
  objects for assets in a package version.
  """
  def list_package_version_assets(%Client{} = client, input, options \\ []) do
    url_path = "/v1/package/version/assets"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"format", "format"},
        {"maxResults", "max-results"},
        {"namespace", "namespace"},
        {"nextToken", "next-token"},
        {"package", "package"},
        {"packageVersion", "version"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Returns the direct dependencies for a package version.

  The dependencies are returned as
  [PackageDependency](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PackageDependency.html)
  objects. CodeArtifact extracts the dependencies for a package version from the
  metadata file for the package format (for example, the `package.json` file for
  npm packages and the `pom.xml` file for Maven). Any package version dependencies
  that are not listed in the configuration file are not returned.
  """
  def list_package_version_dependencies(%Client{} = client, input, options \\ []) do
    url_path = "/v1/package/version/dependencies"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"format", "format"},
        {"namespace", "namespace"},
        {"nextToken", "next-token"},
        {"package", "package"},
        {"packageVersion", "version"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Returns a list of
  [PackageVersionSummary](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PackageVersionSummary.html)
  objects for package versions in a repository that match the request parameters.
  """
  def list_package_versions(%Client{} = client, input, options \\ []) do
    url_path = "/v1/package/versions"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"format", "format"},
        {"maxResults", "max-results"},
        {"namespace", "namespace"},
        {"nextToken", "next-token"},
        {"originType", "originType"},
        {"package", "package"},
        {"repository", "repository"},
        {"sortBy", "sortBy"},
        {"status", "status"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Returns a list of
  [PackageSummary](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PackageSummary.html)
  objects for packages in a repository that match the request parameters.
  """
  def list_packages(%Client{} = client, input, options \\ []) do
    url_path = "/v1/packages"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"format", "format"},
        {"maxResults", "max-results"},
        {"namespace", "namespace"},
        {"nextToken", "next-token"},
        {"packagePrefix", "package-prefix"},
        {"publish", "publish"},
        {"repository", "repository"},
        {"upstream", "upstream"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Returns a list of
  [RepositorySummary](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_RepositorySummary.html)
  objects.

  Each `RepositorySummary` contains information about a repository in the
  specified Amazon Web Services account and that matches the input parameters.
  """
  def list_repositories(%Client{} = client, input, options \\ []) do
    url_path = "/v1/repositories"
    headers = []

    {query_params, input} =
      [
        {"maxResults", "max-results"},
        {"nextToken", "next-token"},
        {"repositoryPrefix", "repository-prefix"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Returns a list of
  [RepositorySummary](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_RepositorySummary.html)
  objects.

  Each `RepositorySummary` contains information about a repository in the
  specified domain and that matches the input parameters.
  """
  def list_repositories_in_domain(%Client{} = client, input, options \\ []) do
    url_path = "/v1/domain/repositories"
    headers = []

    {query_params, input} =
      [
        {"administratorAccount", "administrator-account"},
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"maxResults", "max-results"},
        {"nextToken", "next-token"},
        {"repositoryPrefix", "repository-prefix"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Gets information about Amazon Web Services tags for a specified Amazon Resource
  Name (ARN) in CodeArtifact.
  """
  def list_tags_for_resource(%Client{} = client, input, options \\ []) do
    url_path = "/v1/tags"
    headers = []

    {query_params, input} =
      [
        {"resourceArn", "resourceArn"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Sets a resource policy on a domain that specifies permissions to access it.

  When you call `PutDomainPermissionsPolicy`, the resource policy on the domain is
  ignored when evaluting permissions. This ensures that the owner of a domain
  cannot lock themselves out of the domain, which would prevent them from being
  able to update the resource policy.
  """
  def put_domain_permissions_policy(%Client{} = client, input, options \\ []) do
    url_path = "/v1/domain/permissions/policy"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :put, url_path, query_params, headers, input, options, nil)
  end

  @doc """
  Sets the package origin configuration for a package.

  The package origin configuration determines how new versions of a package can be
  added to a repository. You can allow or block direct publishing of new package
  versions, or ingestion and retaining of new package versions from an external
  connection or upstream source. For more information about package origin
  controls and configuration, see [Editing package origin controls](https://docs.aws.amazon.com/codeartifact/latest/ug/package-origin-controls.html)
  in the *CodeArtifact User Guide*.

  `PutPackageOriginConfiguration` can be called on a package that doesn't yet
  exist in the repository. When called on a package that does not exist, a package
  is created in the repository with no versions and the requested restrictions are
  set on the package. This can be used to preemptively block ingesting or
  retaining any versions from external connections or upstream repositories, or to
  block publishing any versions of the package into the repository before
  connecting any package managers or publishers to the repository.
  """
  def put_package_origin_configuration(%Client{} = client, input, options \\ []) do
    url_path = "/v1/package"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"format", "format"},
        {"namespace", "namespace"},
        {"package", "package"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Sets the resource policy on a repository that specifies permissions to access
  it.

  When you call `PutRepositoryPermissionsPolicy`, the resource policy on the
  repository is ignored when evaluting permissions. This ensures that the owner of
  a repository cannot lock themselves out of the repository, which would prevent
  them from being able to update the resource policy.
  """
  def put_repository_permissions_policy(%Client{} = client, input, options \\ []) do
    url_path = "/v1/repository/permissions/policy"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(client, meta, :put, url_path, query_params, headers, input, options, nil)
  end

  @doc """
  Adds or updates tags for a resource in CodeArtifact.
  """
  def tag_resource(%Client{} = client, input, options \\ []) do
    url_path = "/v1/tag"
    headers = []

    {query_params, input} =
      [
        {"resourceArn", "resourceArn"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Removes tags from a resource in CodeArtifact.
  """
  def untag_resource(%Client{} = client, input, options \\ []) do
    url_path = "/v1/untag"
    headers = []

    {query_params, input} =
      [
        {"resourceArn", "resourceArn"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Updates the status of one or more versions of a package.

  Using `UpdatePackageVersionsStatus`, you can update the status of package
  versions to `Archived`, `Published`, or `Unlisted`. To set the status of a
  package version to `Disposed`, use
  [DisposePackageVersions](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_DisposePackageVersions.html).
  """
  def update_package_versions_status(%Client{} = client, input, options \\ []) do
    url_path = "/v1/package/versions/update_status"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"format", "format"},
        {"namespace", "namespace"},
        {"package", "package"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      headers,
      input,
      options,
      nil
    )
  end

  @doc """
  Update the properties of a repository.
  """
  def update_repository(%Client{} = client, input, options \\ []) do
    url_path = "/v1/repository"
    headers = []

    {query_params, input} =
      [
        {"domain", "domain"},
        {"domainOwner", "domain-owner"},
        {"repository", "repository"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(client, meta, :put, url_path, query_params, headers, input, options, nil)
  end
end