"Credentials used to identify and authenticate a share token"
input ShareTokenCredentials {
  token: String!
  password: String
}

"A token used to publicly access an album or media"
type ShareToken {
  id: ID!
  token: String!
  "The user who created the token"
  owner: User!
  "Optional expire date"
  expire: Time
  "Whether or not a password is needed to access the share"
  hasPassword: Boolean!

  "The album this token shares"
  album: Album
  "The media this token shares"
  media: Media
}

extend type Query {
  "Fetch a share token containing an `Album` or `Media`"
  shareToken(credentials: ShareTokenCredentials!): ShareToken!

  "Check if the `ShareToken` credentials are valid"
  shareTokenValidatePassword(credentials: ShareTokenCredentials!): Boolean!
}

extend type Mutation {
  "Generate share token for album"
  shareAlbum(albumId: ID!, expire: Time, password: String): ShareToken! @isAuthorized

  "Generate share token for media"
  shareMedia(mediaId: ID!, expire: Time, password: String): ShareToken! @isAuthorized

  "Delete a share token by it's token value"
  deleteShareToken(token: String!): ShareToken! @isAuthorized

  "Set a password for a token, if null is passed for the password argument, the password will be cleared"
  protectShareToken(token: String!, password: String): ShareToken! @isAuthorized
}
