type Query {
  torrents(filter: TorrentsFilter, pagination: Pagination): [Torrent!]!
  fsListDir(path: String!): ListDirResponse!
}

input TorrentsFilter {
  name: StringFilter
  bytesCompleted: IntFilter
  bytesMissing: IntFilter

  peersCount: IntFilter
}

type ListDirResponse {
  root: DirEntry!
  entries: [DirEntry!]!
}

input Pagination {
  offset: Int!
  limit: Int!
}

input StringFilter @oneOf {
  eq: String
  substr: String
  in: [String!]
}

input IntFilter @oneOf {
  eq: Int
  gt: Int
  lt: Int
  gte: Int
  lte: Int
  in: [Int!]
}

input DateTimeFilter @oneOf {
  eq: DateTime
  gt: DateTime
  lt: DateTime
  gte: DateTime
  lte: DateTime
}

input BooleanFilter @oneOf {
  eq: Boolean
}