# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# NOTE: This file is auto generated by the elixir code generator program.
# Do not edit this file manually.

defmodule GoogleApi.Drive.V3.Model.Permission do
  @moduledoc """
  A permission for a file. A permission grants a user, group, domain, or the world access to a file or a folder hierarchy. Some resource methods (such as `permissions.update`) require a `permissionId`. Use the `permissions.list` method to retrieve the ID for a file, folder, or shared drive.

  ## Attributes

  *   `allowFileDiscovery` (*type:* `boolean()`, *default:* `nil`) - Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type `domain` or `anyone`.
  *   `deleted` (*type:* `boolean()`, *default:* `nil`) - Output only. Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.
  *   `displayName` (*type:* `String.t`, *default:* `nil`) - Output only. The "pretty" name of the value of the permission. The following is a list of examples for each type of permission: * `user` - User's full name, as defined for their Google account, such as "Joe Smith." * `group` - Name of the Google Group, such as "The Company Administrators." * `domain` - String domain name, such as "thecompany.com." * `anyone` - No `displayName` is present.
  *   `domain` (*type:* `String.t`, *default:* `nil`) - The domain to which this permission refers.
  *   `emailAddress` (*type:* `String.t`, *default:* `nil`) - The email address of the user or group to which this permission refers.
  *   `expirationTime` (*type:* `DateTime.t`, *default:* `nil`) - The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions: - They can only be set on user and group permissions - The time must be in the future - The time cannot be more than a year in the future
  *   `id` (*type:* `String.t`, *default:* `nil`) - Output only. The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as `permissionId`. IDs should be treated as opaque values.
  *   `kind` (*type:* `String.t`, *default:* `drive#permission`) - Output only. Identifies what kind of resource this is. Value: the fixed string `"drive#permission"`.
  *   `pendingOwner` (*type:* `boolean()`, *default:* `nil`) - Whether the account associated with this permission is a pending owner. Only populated for `user` type permissions for files that are not in a shared drive.
  *   `permissionDetails` (*type:* `list(GoogleApi.Drive.V3.Model.PermissionPermissionDetails.t)`, *default:* `nil`) - Output only. Details of whether the permissions on this shared drive item are inherited or directly on this item. This is an output-only field which is present only for shared drive items.
  *   `photoLink` (*type:* `String.t`, *default:* `nil`) - Output only. A link to the user's profile photo, if available.
  *   `role` (*type:* `String.t`, *default:* `nil`) - The role granted by this permission. While new values may be supported in the future, the following are currently allowed: * `owner` * `organizer` * `fileOrganizer` * `writer` * `commenter` * `reader`
  *   `teamDrivePermissionDetails` (*type:* `list(GoogleApi.Drive.V3.Model.PermissionTeamDrivePermissionDetails.t)`, *default:* `nil`) - Output only. Deprecated: Output only. Use `permissionDetails` instead.
  *   `type` (*type:* `String.t`, *default:* `nil`) - The type of the grantee. Valid values are: * `user` * `group` * `domain` * `anyone` When creating a permission, if `type` is `user` or `group`, you must provide an `emailAddress` for the user or group. When `type` is `domain`, you must provide a `domain`. There isn't extra information required for an `anyone` type.
  *   `view` (*type:* `String.t`, *default:* `nil`) - Indicates the view for this permission. Only populated for permissions that belong to a view. 'published' is the only supported value.
  """

  use GoogleApi.Gax.ModelBase

  @type t :: %__MODULE__{
          :allowFileDiscovery => boolean() | nil,
          :deleted => boolean() | nil,
          :displayName => String.t() | nil,
          :domain => String.t() | nil,
          :emailAddress => String.t() | nil,
          :expirationTime => DateTime.t() | nil,
          :id => String.t() | nil,
          :kind => String.t() | nil,
          :pendingOwner => boolean() | nil,
          :permissionDetails =>
            list(GoogleApi.Drive.V3.Model.PermissionPermissionDetails.t()) | nil,
          :photoLink => String.t() | nil,
          :role => String.t() | nil,
          :teamDrivePermissionDetails =>
            list(GoogleApi.Drive.V3.Model.PermissionTeamDrivePermissionDetails.t()) | nil,
          :type => String.t() | nil,
          :view => String.t() | nil
        }

  field(:allowFileDiscovery)
  field(:deleted)
  field(:displayName)
  field(:domain)
  field(:emailAddress)
  field(:expirationTime, as: DateTime)
  field(:id)
  field(:kind)
  field(:pendingOwner)
  field(:permissionDetails, as: GoogleApi.Drive.V3.Model.PermissionPermissionDetails, type: :list)
  field(:photoLink)
  field(:role)

  field(:teamDrivePermissionDetails,
    as: GoogleApi.Drive.V3.Model.PermissionTeamDrivePermissionDetails,
    type: :list
  )

  field(:type)
  field(:view)
end

defimpl Poison.Decoder, for: GoogleApi.Drive.V3.Model.Permission do
  def decode(value, options) do
    GoogleApi.Drive.V3.Model.Permission.decode(value, options)
  end
end

defimpl Poison.Encoder, for: GoogleApi.Drive.V3.Model.Permission do
  def encode(value, options) do
    GoogleApi.Gax.ModelBase.encode(value, options)
  end
end
