# ===============================================
# COMMENT
# ===============================================

extend type Query {
  comments: CommentQuery
}

extend type Mutation {
  comments: CommentMutation
}

# -----------------------------------------------
# QUERIES
# -----------------------------------------------

type CommentQuery {
  providers: [CommentProvider] @auth(requires: ["manage:system"])

  list(
    locale: String!
    path: String!
  ): [CommentPost]! @auth(requires: ["read:comments", "manage:system"])

  single(
    id: Int!
  ): CommentPost @auth(requires: ["read:comments", "manage:system"])
}

# -----------------------------------------------
# MUTATIONS
# -----------------------------------------------

type CommentMutation {
  updateProviders(
    providers: [CommentProviderInput]
  ): DefaultResponse @auth(requires: ["manage:system"])

  create(
    pageId: Int!
    replyTo: Int
    content: String!
    guestName: String
    guestEmail: String
  ): CommentCreateResponse @auth(requires: ["write:comments", "manage:system"]) @rateLimit(limit: 1, duration: 15)

  update(
    id: Int!
    content: String!
  ): CommentUpdateResponse @auth(requires: ["write:comments", "manage:comments", "manage:system"])

  delete(
    id: Int!
  ): DefaultResponse @auth(requires: ["manage:comments", "manage:system"])
}

# -----------------------------------------------
# TYPES
# -----------------------------------------------

type CommentProvider {
  isEnabled: Boolean!
  key: String!
  title: String!
  description: String
  logo: String
  website: String
  isAvailable: Boolean
  config: [KeyValuePair]
}

input CommentProviderInput {
  isEnabled: Boolean!
  key: String!
  config: [KeyValuePairInput]
}

type CommentPost {
  id: Int!
  content: String! @auth(requires: ["write:comments", "manage:comments", "manage:system"])
  render: String!
  authorId: Int!
  authorName: String!
  authorEmail: String! @auth(requires: ["manage:system"])
  authorIP: String! @auth(requires: ["manage:system"])
  createdAt: Date!
  updatedAt: Date!
}

type CommentCreateResponse {
  responseResult: ResponseStatus
  id: Int
}

type CommentUpdateResponse {
  responseResult: ResponseStatus
  render: String
}
