matrix-veles/webui/data/schema.graphql

347 lines
6.2 KiB
GraphQL

# GraphQL schema example
#
# https://gqlgen.com/getting-started/
scalar Time
directive @loggedIn on FIELD_DEFINITION
directive @hasRole(role: UserRole!) on FIELD_DEFINITION
directive @owner on FIELD_DEFINITION
enum UserRole {
ADMIN
USER
UNAUTHENTICATED
}
enum SortDirection {
ASC
DESC
}
type PageInfo {
hasPreviousPage: Boolean!
hasNextPage: Boolean!
startCursor: String!
endCursor: String!
}
input SortRule {
direction: SortDirection!
}
enum HashCheckerMode {
NOTICE # Just post a notice
DELETE # Delete message, post notice
MUTE # Mute user, delete message, post notice
BAN # Ban user, delete message, post notice
}
type HashCheckerConfig {
chatNotice: Boolean!
hashCheckMode: HashCheckerMode!
subscribedLists(first: Int, after: String): ListConnection
}
type Room {
id: ID!
active: Boolean!
deactivated: Boolean!
name: String!
roomId: String!
debug: Boolean!
adminPowerLevel: Int!
hashCheckerConfig: HashCheckerConfig!
}
type RoomConnection {
pageInfo: PageInfo!
edges: [RoomEdge!]!
}
type RoomEdge {
node: Room!
cursor: String!
}
type User {
id: ID!
username: String!
admin: Boolean
matrixLinks: [String!]
pendingMatrixLinks: [String!]
}
type UserConnection {
pageInfo: PageInfo!
edges: [UserEdge!]!
}
type UserEdge {
node: User!
cursor: String!
}
type Entry {
id: ID!
tags: [String!]
partOf(first: Int, after: String): ListConnection
hashValue: String!
timestamp: Time!
addedBy: User!
comments(first: Int, after: String): CommentConnection
}
type EntryConnection {
pageInfo: PageInfo!
edges: [EntryEdge!]!
}
type EntryEdge {
node: Entry!
cursor: String!
}
type List {
id: ID!
name: String!
tags: [String!]
creator: User!
comments(first: Int, after: String): CommentConnection
maintainers(first: Int, after: String): UserConnection!
entries(first: Int, after: String): EntryConnection
}
type ListConnection {
pageInfo: PageInfo!
edges: [ListEdge!]!
}
type ListEdge {
node: List!
cursor: String!
}
type Comment {
timestamp: Time!
author: User!
content: String!
}
type CommentConnection {
pageInfo: PageInfo!
edges: [CommentEdge!]!
}
type CommentEdge {
node: Comment!
cursor: String!
}
input IntFilter {
gt: Int
lt: Int
eq: Int
neq: Int
}
input TimestampFilter {
after: Time
before: Time
}
input StringFilter {
eq: String # Equal
neq: String # Not Equal
regex: String # Regex Check
}
input StringArrayFilter {
containsAll: [String]
elemMatch: StringFilter
length: Int
}
input UserFilter {
id: ID
username: StringFilter
matrixLinks: StringArrayFilter
pendingMatrixLinks: StringArrayFilter
admin: Boolean
}
input UserArrayFilter {
containsAll: [UserFilter]
containsOne: [UserFilter]
length: Int
}
input UserSort {
id: SortRule
username: SortRule
admin: SortRule
}
input ListFilter {
id: ID
name: StringFilter
tags: StringArrayFilter
maintainers: IDArrayFilter
# entries: EntryArrayFilter
}
input IDArrayFilter {
containsAll: [ID]
length: Int
}
input ListArrayFilter {
containsAll: [ListFilter]
containsOne: [ListFilter]
length: Int
}
input ListSort {
id: SortRule
name: SortRule
}
input EntryFilter {
id: ID
hashValue: StringFilter
tags: StringArrayFilter
addedBy: ID
timestamp: TimestampFilter
partOf: IDArrayFilter
}
input EntryArrayFilter {
containsAll: [EntryFilter]
containsOne: [EntryFilter]
length: Int
}
input EntrySort {
id: SortRule
hashValue: SortRule
timestamp: SortRule
addedBy: SortRule
}
input RoomFilter {
id: ID
active: Boolean
debug: Boolean
canEdit: Boolean
}
type Query {
users(first: Int, after: String, filter: UserFilter, sort: UserSort): UserConnection @loggedIn
lists(first: Int, after: String, filter: ListFilter, sort: ListSort): ListConnection @loggedIn
entries(first: Int, after: String, filter: EntryFilter, sort: EntrySort): EntryConnection @loggedIn
rooms(first: Int, after: String, filter: RoomFilter): RoomConnection @loggedIn
room(id: ID): Room @loggedIn
user(id: ID, username: String): User @loggedIn
entry(id: ID, hashValue: String): Entry @loggedIn
list(id: ID, name: String): List @loggedIn
self: User @loggedIn
}
input Login {
username: String!
password: String!
}
input Register {
username: String!
password: String!
mxID: String!
}
input CreateEntry {
tags: [String!]
partOf: [ID!]
hashValue: String!
comment: String
}
input CommentEntry {
entry: ID!
comment: String!
}
input CreateList {
name: String!
tags: [String!]
comment: String
maintainers: [ID!]
entries: [ID!]
}
input CommentList {
list: ID!
comment: String!
}
input AddToLists {
lists: [ID!]!
entry: ID!
}
input RemoveFromLists {
lists: [ID!]!
entry: ID!
}
input AddMXID {
mxid: String!
}
input RemoveMXID {
mxid: String!
}
input RoomConfigUpdate {
id: ID!
deactivate: Boolean
debug: Boolean
adminPowerLevel: Int
hashChecker: HashCheckerConfigUpdate
}
input HashCheckerConfigUpdate {
chatNotice: Boolean
hashCheckMode: HashCheckerMode
}
input ListSubscriptionUpdate {
roomId: ID!
listId: ID!
}
type Mutation {
login(input: Login!): String!
register(input: Register!): String! @hasRole(role: UNAUTHENTICATED)
addMXID(input: AddMXID!): User! @loggedIn
removeMXID(input: RemoveMXID!): User! @loggedIn
reconfigureRoom(input: RoomConfigUpdate!): Room! @loggedIn
subscribeToList(input: ListSubscriptionUpdate!): Room! @loggedIn
unsubscribeFromList(input: ListSubscriptionUpdate!): Room! @loggedIn
createEntry(input: CreateEntry!): Entry! @loggedIn
commentEntry(input: CommentEntry!): Entry! @loggedIn
addToLists(input: AddToLists!): Entry! @loggedIn
removeFromLists(input: RemoveFromLists!): Entry! @loggedIn
createList(input: CreateList!): List! @loggedIn
commentList(input: CommentList!): List! @loggedIn
deleteList(input: ID!): Boolean! @loggedIn @owner
}