scalar DateTime type _Service { sdl: String } ################################### Payload ################################### type UserFollowings { unread: Int topics: [String] authors: [String] reactions: [Int] communities: [String] } type AuthResult { error: String token: String user: User news: UserFollowings } type AuthorStat { followings: Int followers: Int rating: Int commented: Int shouts: Int } type Author { id: Int! slug: String! name: String! userpic: String caption: String # only for full shout bio: String about: String links: [String] stat: AuthorStat roles: [Role] # in different communities lastSeen: DateTime createdAt: DateTime } type Result { error: String slugs: [String] shout: Shout shouts: [Shout] author: Author authors: [Author] reaction: Reaction reactions: [Reaction] topic: Topic topics: [Topic] community: Community communities: [Community] } enum ReactionStatus { NEW UPDATED CHANGED EXPLAINED DELETED } type ReactionUpdating { error: String status: ReactionStatus reaction: Reaction } ################################### Inputs ################################### input ShoutInput { slug: String title: String body: String lead: String description: String layout: String media: String authors: [String] topics: [TopicInput] community: Int mainTopic: TopicInput subtitle: String cover: String } input ProfileInput { slug: String name: String userpic: String links: [String] bio: String about: String } input TopicInput { id: Int, slug: String! # community: String! title: String body: String pic: String # children: [String] # parents: [String] } input ReactionInput { kind: ReactionKind! shout: Int! range: String body: String replyTo: Int } enum FollowingEntity { TOPIC AUTHOR COMMUNITY REACTIONS } ################################### Mutation type Mutation { # auth getSession: AuthResult! registerUser(email: String!, password: String, name: String): AuthResult! sendLink(email: String!, lang: String, template: String): Result! confirmEmail(token: String!): AuthResult! # shout createShout(inp: ShoutInput!): Result! updateShout(shout_id: Int!, shout_input: ShoutInput, publish: Boolean): Result! deleteShout(shout_id: Int!): Result! # user profile rateUser(slug: String!, value: Int!): Result! updateProfile(profile: ProfileInput!): Result! # topics createTopic(input: TopicInput!): Result! # TODO: mergeTopics(t1: String!, t2: String!): Result! updateTopic(input: TopicInput!): Result! destroyTopic(slug: String!): Result! # reactions createReaction(reaction: ReactionInput!): Result! updateReaction(id: Int!, reaction: ReactionInput!): Result! deleteReaction(id: Int!): Result! # following follow(what: FollowingEntity!, slug: String!): Result! unfollow(what: FollowingEntity!, slug: String!): Result! } input AuthorsBy { lastSeen: DateTime createdAt: DateTime slug: String name: String topic: String order: String days: Int stat: String } input LoadShoutsFilters { title: String body: String topic: String author: String layout: String excludeLayout: String visibility: String days: Int reacted: Boolean } input LoadShoutsOptions { filters: LoadShoutsFilters with_author_captions: Boolean limit: Int! offset: Int order_by: String order_by_desc: Boolean } input ReactionBy { shout: String # slug shouts: [String] search: String # fts on body comment: Boolean topic: String # topic.slug createdBy: String # user.slug days: Int # before sort: String # how to sort, default createdAt } type Query { # auth isEmailUsed(email: String!): Boolean! signIn(email: String!, password: String, lang: String): AuthResult! signOut: AuthResult! # zine loadAuthorsBy(by: AuthorsBy, limit: Int, offset: Int): [Author]! loadShout(slug: String, shout_id: Int): Shout loadShouts(options: LoadShoutsOptions): [Shout]! loadDrafts: [Shout]! loadReactionsBy(by: ReactionBy!, limit: Int, offset: Int): [Reaction]! userFollowers(slug: String!): [Author]! userFollowedAuthors(slug: String!): [Author]! userFollowedTopics(slug: String!): [Topic]! authorFollowers(author_id: Int!, limit: Int, offset: Int): [Author]! authorFollowings(author_id: Int!, limit: Int, offset: Int): [Author]! authorsAll: [Author]! getAuthorById(author_id: Int!): Author getAuthor(slug: String!): Author myFeed(options: LoadShoutsOptions): [Shout] # migrate markdownBody(body: String!): String! # topics getTopic(slug: String!): Topic topicsAll: [Topic]! topicsRandom(amount: Int): [Topic]! topicsByCommunity(community: String!): [Topic]! topicsByAuthor(author: String!): [Topic]! # Apollo SDL _service: _Service! } ############################################ Entities type Resource { id: Int! name: String! } type Operation { id: Int! name: String! } type Permission { operation: Int! resource: Int! } type Role { id: Int! name: String! community: String! desc: String permissions: [Permission!]! } type Rating { rater: String! value: Int! } type User { id: Int! username: String! # to login, ex. email, phone createdAt: DateTime! lastSeen: 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 ratings: [Rating] bio: String about: String communities: [Int] # user participating communities oid: String } enum ReactionKind { LIKE DISLIKE AGREE DISAGREE PROOF DISPROOF COMMENT QUOTE PROPOSE ASK REMARK FOOTNOTE ACCEPT REJECT } type Reaction { id: Int! shout: Shout! createdAt: DateTime! createdBy: User! updatedAt: DateTime deletedAt: DateTime deletedBy: User range: String # full / 0:2340 kind: ReactionKind! body: String replyTo: Int stat: Stat old_id: String old_thread: String } # is publication type Shout { id: Int! slug: String! body: String! lead: String description: String createdAt: DateTime! topics: [Topic] mainTopic: String title: String subtitle: String authors: [Author] lang: String community: String cover: String layout: String # music video literature image versionOf: String # for translations and re-telling the same story visibility: String # owner authors community public updatedAt: DateTime updatedBy: User deletedAt: DateTime deletedBy: User publishedAt: DateTime media: String # json [ { title pic url body }, .. ] stat: Stat } type Stat { viewed: Int reacted: Int rating: Int commented: Int ranking: Int } type Community { id: Int! slug: String! name: String! desc: String pic: String! createdAt: DateTime! createdBy: User! } type Collection { id: Int! slug: String! title: String! desc: String amount: Int publishedAt: DateTime createdAt: DateTime! createdBy: User! } type TopicStat { shouts: Int! followers: Int! authors: Int! # viewed: Int # reacted: Int! # commented: Int # rating: Int } type Topic { id: Int! slug: String! title: String body: String pic: String # community: Community! stat: TopicStat oid: String } type Token { createdAt: DateTime! expiresAt: DateTime id: Int! ownerId: Int! usedAt: DateTime value: String! }