scalar DateTime ################################### Payload type Result { error: String } type AuthResult { error: String token: String user: User } type UserResult { error: String user: User } type MessageResult { error: String message: Message } input ShoutInput { slug: String! body: String! # replyTo: String # another shout # tags: [String] # actual values topic_ids: [Int] title: String subtitle: String versionOf: String visibleForRoles: [String] # role ids are strings visibleForUsers: [Int] } input ProfileInput { name: String userpic: String links: [String] bio: String } input CommunityInput { title: String! desc: String pic: String } type ShoutResult { error: String shout: Shout } type CommentResult { error: String comment: Comment } enum MessageStatus { NEW UPDATED DELETED } type MessageWithStatus { status: MessageStatus! message: Message! } type ChatRoomResult { messages: [Message]! room: ChatRoom! } ################################### Mutation type Mutation { # message getRoom(chatRoom: Int!): ChatRoomResult! # TODO: private rooms protection createMessage(body: String!, replyTo: Int): MessageResult! updateMessage(id: Int!, body: String!): MessageResult! deleteMessage(messageId: Int!): Result! # auth confirmEmail(token: String!): AuthResult! requestPasswordReset(email: String!): Boolean! confirmPasswordReset(token: String!): Boolean! registerUser(email: String!, password: String): AuthResult! # updatePassword(password: String!, token: String!): Token! # invalidateAllTokens: Boolean! # invalidateTokenById(id: Int!): Boolean! # requestEmailConfirmation: User! # shout createShout(input: ShoutInput!): ShoutResult! updateShout(id: Int!, input: ShoutInput!): ShoutResult! deleteShout(id: Int!): Result! rateShout(shout_id: Int!, value: Int!): Result! viewShout(shout_id: Int!): Result! # user profile # rateUser(value: Int!): Result! # updateOnlineStatus: Result! updateProfile(profile: ProfileInput!): Result! # topics topicSubscribe(slug: String!): Result! topicUnsubscribe(slug: String!): Result! createComment(body: String!, shout: Int!, replyTo: Int): CommentResult! updateComment(id: Int!, body: String!): CommentResult! deleteComment(id: Int!): Result! rateComment(id: Int!, value: Int!): Result! createCommunity(title: String!, desc: String!): Community! updateCommunity(community: CommunityInput!): Community! deleteCommunity(id: Int!): Result! } ################################### Query type Query { # auth isEmailFree(email: String!): Result! signIn(email: String!, password: String): AuthResult! signOut: Result! # profile getCurrentUser: UserResult! getUsersBySlugs(slugs: [String]!): [User]! # rateUser(shout: Int): Int! getUserRoles(slug: String!): [Role]! # messages getMessages(count: Int = 100, page: Int = 1): [Message!]! # shouts getShoutBySlug(slug: String!): Shout! shoutsByTopic(topic: String!, limit: Int!): [Shout]! shoutsByAuthor(author: String!, limit: Int!): [Shout]! shoutsByCommunity(community: String!, limit: Int!): [Shout]! getShoutComments(shout_id: Int!): [Comment]! # mainpage topViewed(limit: Int): [Shout]! topMonth(limit: Int): [Shout]! topOverall(limit: Int): [Shout]! recents(limit: Int): [Shout]! topAuthors(limit: Int): [User]! # topics topicsBySlugs(slugs: [String]): [Topic]! topicsByCommunity(community: String!): [Topic]! topicsByAuthor(author: String!): [Topic]! # getOnlineUsers: [User!]! # communities getCommunity(slug: String): Community! getCommunities: [Community]! } ############################################ Subscription type Subscription { messageChanged: MessageWithStatus! chatUpdated: ChatRoomResult! onlineUpdated: [User!]! shoutUpdated: Shout! userUpdated: User! topicUpdated(user_id: Int!): Shout! } ############################################ Entities type Resource { id: Int! name: String! } type Operation { id: Int! name: String! } type Permission { operation_id: Int! resource_id: Int! } type Role { id: Int! name: String! community: Int! desc: String permissions: [Permission!]! } type Rating { rater_id: Int! value: Int! } type Notification { kind: String! # unique primary key template: String! variables: [String] } type UserNotification { id: Int! # primary key user: Int! kind: String! # NotificationTemplate.name values: [String] } type User { id: Int! username: String! # to login, ex. email createdAt: DateTime! slug: String! name: String # to display email: String password: String oauth: String # provider:token userpic: String links: [String] emailConfirmed: Boolean # should contain all emails too muted: Boolean updatedAt: DateTime wasOnlineAt: DateTime ratings: [Rating] bio: String notifications: [Int] communities: [Int] # user participating communities old_id: String } type Message { author: Int! chatRoom: Int! body: String! createdAt: DateTime! id: Int! replyTo: Int updatedAt: DateTime! visibleForUsers: [Int]! } type ChatRoom { id: Int! createdAt: DateTime! updatedAt: DateTime! notes: String } type Comment { id: Int! author: User! body: String! replyTo: Int createdAt: DateTime! updatedAt: DateTime updatedBy: Int shout: Int! deletedAt: DateTime deletedBy: Int ratings: [CommentRating] views: Int old_id: String old_thread: String } type CommentRating { id: Int! comment_id: Int! createdBy: Int! createdAt: DateTime! value: Int! } # is publication type Shout { id: Int! slug: String! body: String! createdAt: DateTime! authors: [User!]! ratings: [Rating] visibleFor: [User] community: Int cover: String layout: String rating: Int views: Int # replyTo: Shout versionOf: Shout tags: [String] # actual values topics: [Topic] title: String subtitle: String updatedAt: DateTime updatedBy: Int # can be user id? deletedAt: DateTime deletedBy: Int publishedBy: Int # if there is no published field - it is not published publishedAt: DateTime old_id: String } type Community { slug: String! name: String! desc: String pic: String! } type Topic { slug: String! # ID title: String body: String pic: String parents: [String] # NOTE: topic can have parent topics children: [String] # and children cat_id: String community: String } # TODO: resolvers to add/remove topics from publication type Proposal { body: String! shout: Int! range: String # full / 0:2340 author: Int! createdAt: DateTime! } type Token { createdAt: DateTime! expiresAt: DateTime id: Int! ownerId: Int! usedAt: DateTime value: String! }