schema-fmt

This commit is contained in:
Untone 2025-07-01 12:18:24 +03:00
parent 27a358a41f
commit 971b87c0be
6 changed files with 654 additions and 618 deletions

View File

@ -1,177 +1,191 @@
type EnvVariable { type EnvVariable {
key: String! key: String!
value: String! value: String!
description: String description: String
type: String! type: String!
isSecret: Boolean isSecret: Boolean
} }
type EnvSection { type EnvSection {
name: String! name: String!
description: String description: String
variables: [EnvVariable!]! variables: [EnvVariable!]!
} }
input EnvVariableInput { input EnvVariableInput {
key: String! key: String!
value: String! value: String!
type: String! type: String!
} }
# Типы для управления пользователями # Типы для управления пользователями
type AdminUserInfo { type AdminUserInfo {
id: Int! id: Int!
email: String email: String
name: String name: String
slug: String slug: String
roles: [String!] roles: [String!]
created_at: Int created_at: Int
last_seen: Int last_seen: Int
} }
input AdminUserUpdateInput { input AdminUserUpdateInput {
id: Int! id: Int!
email: String email: String
name: String name: String
slug: String slug: String
roles: [String!] roles: [String!]
community: Int community: Int
} }
type Role { type Role {
id: String! id: String!
name: String! name: String!
description: String description: String
} }
# Тип для пагинированного ответа пользователей # Тип для пагинированного ответа пользователей
type AdminUserListResponse { type AdminUserListResponse {
authors: [AdminUserInfo!]! authors: [AdminUserInfo!]!
total: Int! total: Int!
page: Int! page: Int!
perPage: Int! perPage: Int!
totalPages: Int! totalPages: Int!
} }
# Общий ответ на операцию с данными об успехе и ошибке # Общий ответ на операцию с данными об успехе и ошибке
type OperationResult { type OperationResult {
success: Boolean! success: Boolean!
error: String error: String
} }
# Типы для управления публикациями (Shout) # Типы для управления публикациями (Shout)
type AdminShoutInfo { type AdminShoutInfo {
id: Int! id: Int!
title: String! title: String!
slug: String! slug: String!
body: String! body: String!
lead: String lead: String
subtitle: String subtitle: String
layout: String! layout: String!
lang: String! lang: String!
cover: String cover: String
cover_caption: String cover_caption: String
media: [MediaItem] media: [MediaItem]
seo: String seo: String
created_at: Int! created_at: Int!
updated_at: Int updated_at: Int
published_at: Int published_at: Int
featured_at: Int featured_at: Int
deleted_at: Int deleted_at: Int
created_by: Author! created_by: Author!
updated_by: Author updated_by: Author
deleted_by: Author deleted_by: Author
community: Community! community: Community!
authors: [Author] authors: [Author]
topics: [Topic] topics: [Topic]
version_of: Int version_of: Int
draft: Int draft: Int
stat: Stat stat: Stat
} }
# Тип для пагинированного ответа публикаций # Тип для пагинированного ответа публикаций
type AdminShoutListResponse { type AdminShoutListResponse {
shouts: [AdminShoutInfo!]! shouts: [AdminShoutInfo!]!
total: Int! total: Int!
page: Int! page: Int!
perPage: Int! perPage: Int!
totalPages: Int! totalPages: Int!
} }
input AdminShoutUpdateInput { input AdminShoutUpdateInput {
id: Int! id: Int!
title: String title: String
body: String body: String
lead: String lead: String
subtitle: String subtitle: String
cover: String cover: String
cover_caption: String cover_caption: String
media: [MediaItemInput] media: [MediaItemInput]
seo: String seo: String
published_at: Int published_at: Int
featured_at: Int featured_at: Int
deleted_at: Int deleted_at: Int
} }
# Тип для отображения приглашения в админ-панели # Тип для отображения приглашения в админ-панели
type AdminInviteInfo { type AdminInviteInfo {
inviter_id: Int! inviter_id: Int!
author_id: Int! author_id: Int!
shout_id: Int! shout_id: Int!
status: InviteStatus! status: InviteStatus!
inviter: Author! inviter: Author!
author: Author! author: Author!
shout: AdminShoutInfo! shout: AdminShoutInfo!
created_at: Int created_at: Int
} }
# Тип для пагинированного ответа приглашений # Тип для пагинированного ответа приглашений
type AdminInviteListResponse { type AdminInviteListResponse {
invites: [AdminInviteInfo!]! invites: [AdminInviteInfo!]!
total: Int! total: Int!
page: Int! page: Int!
perPage: Int! perPage: Int!
totalPages: Int! totalPages: Int!
} }
input AdminInviteUpdateInput { input AdminInviteUpdateInput {
inviter_id: Int! inviter_id: Int!
author_id: Int! author_id: Int!
shout_id: Int! shout_id: Int!
status: InviteStatus! status: InviteStatus!
} }
# Входной тип для идентификации приглашения при пакетном удалении # Входной тип для идентификации приглашения при пакетном удалении
input AdminInviteIdInput { input AdminInviteIdInput {
inviter_id: Int! inviter_id: Int!
author_id: Int! author_id: Int!
shout_id: Int! shout_id: Int!
} }
extend type Query { extend type Query {
getEnvVariables: [EnvSection!]! getEnvVariables: [EnvSection!]!
# Запросы для управления пользователями # Запросы для управления пользователями
adminGetUsers(limit: Int, offset: Int, search: String): AdminUserListResponse! adminGetUsers(limit: Int, offset: Int, search: String): AdminUserListResponse!
adminGetRoles: [Role!]! adminGetRoles: [Role!]!
# Запросы для управления публикациями # Запросы для управления публикациями
adminGetShouts(limit: Int, offset: Int, search: String, status: String): AdminShoutListResponse! adminGetShouts(
# Запросы для управления приглашениями limit: Int
adminGetInvites(limit: Int, offset: Int, search: String, status: String): AdminInviteListResponse! offset: Int
search: String
status: String
): AdminShoutListResponse!
# Запросы для управления приглашениями
adminGetInvites(
limit: Int
offset: Int
search: String
status: String
): AdminInviteListResponse!
} }
extend type Mutation { extend type Mutation {
updateEnvVariable(key: String!, value: String!): Boolean! updateEnvVariable(key: String!, value: String!): Boolean!
updateEnvVariables(variables: [EnvVariableInput!]!): Boolean! updateEnvVariables(variables: [EnvVariableInput!]!): Boolean!
# Мутации для управления пользователями # Мутации для управления пользователями
adminUpdateUser(user: AdminUserUpdateInput!): OperationResult! adminUpdateUser(user: AdminUserUpdateInput!): OperationResult!
# Мутации для управления публикациями # Мутации для управления публикациями
adminUpdateShout(shout: AdminShoutUpdateInput!): OperationResult! adminUpdateShout(shout: AdminShoutUpdateInput!): OperationResult!
adminDeleteShout(id: Int!): OperationResult! adminDeleteShout(id: Int!): OperationResult!
adminRestoreShout(id: Int!): OperationResult! adminRestoreShout(id: Int!): OperationResult!
# Мутации для управления приглашениями # Мутации для управления приглашениями
adminCreateInvite(invite: AdminInviteUpdateInput!): OperationResult! adminCreateInvite(invite: AdminInviteUpdateInput!): OperationResult!
adminUpdateInvite(invite: AdminInviteUpdateInput!): OperationResult! adminUpdateInvite(invite: AdminInviteUpdateInput!): OperationResult!
adminDeleteInvite(inviter_id: Int!, author_id: Int!, shout_id: Int!): OperationResult! adminDeleteInvite(
adminDeleteInvitesBatch(invites: [AdminInviteIdInput!]!): OperationResult! inviter_id: Int!
author_id: Int!
shout_id: Int!
): OperationResult!
adminDeleteInvitesBatch(invites: [AdminInviteIdInput!]!): OperationResult!
} }

View File

@ -1,68 +1,66 @@
enum ReactionStatus { enum ReactionStatus {
NEW NEW
UPDATED UPDATED
CHANGED CHANGED
EXPLAINED EXPLAINED
DELETED DELETED
} }
enum ReactionSort { enum ReactionSort {
newest newest
oldest oldest
like like
dislike dislike
} }
enum ShoutsOrderBy { enum ShoutsOrderBy {
last_commented_at last_commented_at
rating rating
comments_count comments_count
} }
enum ReactionKind { enum ReactionKind {
# collabs
AGREE
DISAGREE
ASK
PROPOSE
PROOF
DISPROOF
ACCEPT
REJECT
# collabs # public feed
AGREE QUOTE
DISAGREE COMMENT
ASK LIKE
PROPOSE DISLIKE
PROOF
DISPROOF
ACCEPT
REJECT
# public feed
QUOTE
COMMENT
LIKE
DISLIKE
} }
enum FollowingEntity { enum FollowingEntity {
TOPIC TOPIC
AUTHOR AUTHOR
SHOUT SHOUT
COMMUNITY COMMUNITY
} }
enum InviteStatus { enum InviteStatus {
PENDING PENDING
ACCEPTED ACCEPTED
REJECTED REJECTED
} }
# Auth enums # Auth enums
enum AuthAction { enum AuthAction {
LOGIN LOGIN
REGISTER REGISTER
CONFIRM_EMAIL CONFIRM_EMAIL
RESET_PASSWORD RESET_PASSWORD
CHANGE_PASSWORD CHANGE_PASSWORD
} }
enum RoleType { enum RoleType {
SYSTEM SYSTEM
COMMUNITY COMMUNITY
CUSTOM CUSTOM
} }

View File

@ -1,157 +1,157 @@
input MediaItemInput { input MediaItemInput {
url: String url: String
title: String title: String
body: String body: String
source: String source: String
pic: String pic: String
date: String date: String
genre: String genre: String
artist: String artist: String
lyrics: String lyrics: String
} }
input AuthorInput { input AuthorInput {
id: Int! id: Int!
slug: String slug: String
} }
input TopicInput { input TopicInput {
id: Int id: Int
slug: String! slug: String!
title: String title: String
body: String body: String
pic: String pic: String
community: Int community: Int
parent_ids: [Int] parent_ids: [Int]
} }
input TopicMergeInput { input TopicMergeInput {
target_topic_id: Int! target_topic_id: Int!
source_topic_ids: [Int!]! source_topic_ids: [Int!]!
preserve_target_properties: Boolean preserve_target_properties: Boolean
} }
input DraftInput { input DraftInput {
id: Int id: Int
# no created_at, updated_at, deleted_at, updated_by, deleted_by # no created_at, updated_at, deleted_at, updated_by, deleted_by
layout: String layout: String
shout_id: Int # Changed from shout: Shout shout_id: Int # Changed from shout: Shout
author_ids: [Int!] # Changed from authors: [Author] author_ids: [Int!] # Changed from authors: [Author]
topic_ids: [Int!] # Changed from topics: [Topic] topic_ids: [Int!] # Changed from topics: [Topic]
main_topic_id: Int # Changed from main_topic: Topic main_topic_id: Int # Changed from main_topic: Topic
media: [MediaItemInput] # Changed to use MediaItemInput media: [MediaItemInput] # Changed to use MediaItemInput
lead: String lead: String
subtitle: String subtitle: String
lang: String lang: String
seo: String seo: String
body: String body: String
title: String title: String
slug: String slug: String
cover: String cover: String
cover_caption: String cover_caption: String
} }
input ProfileInput { input ProfileInput {
slug: String slug: String
name: String name: String
pic: String pic: String
links: [String] links: [String]
bio: String bio: String
about: String about: String
} }
input ReactionInput { input ReactionInput {
id: Int id: Int
kind: ReactionKind! kind: ReactionKind!
shout: Int! shout: Int!
quote: String quote: String
body: String body: String
reply_to: Int reply_to: Int
} }
input AuthorsBy { input AuthorsBy {
last_seen: Int last_seen: Int
created_at: Int created_at: Int
slug: String slug: String
name: String name: String
topic: String topic: String
order: String order: String
after: Int after: Int
stat: String stat: String
} }
input LoadShoutsFilters { input LoadShoutsFilters {
topic: String topic: String
author: String author: String
layouts: [String] layouts: [String]
featured: Boolean featured: Boolean
reacted: Boolean # requires auth, used in load_shouts_feed reacted: Boolean # requires auth, used in load_shouts_feed
after: Int after: Int
community: Int community: Int
} }
input LoadShoutsOptions { input LoadShoutsOptions {
filters: LoadShoutsFilters filters: LoadShoutsFilters
limit: Int! limit: Int!
random_limit: Int random_limit: Int
offset: Int offset: Int
order_by: ShoutsOrderBy order_by: ShoutsOrderBy
order_by_desc: Boolean order_by_desc: Boolean
} }
input ReactionBy { input ReactionBy {
shout: String shout: String
shout_id: Int shout_id: Int
shouts: [String] shouts: [String]
search: String search: String
kinds: [ReactionKind] kinds: [ReactionKind]
reply_to: Int # filter reply_to: Int # filter
topic: String topic: String
created_by: Int created_by: Int
author_id: Int author_id: Int
author: String author: String
after: Int after: Int
sort: ReactionSort # sort sort: ReactionSort # sort
} }
input NotificationSeenInput { input NotificationSeenInput {
notifications: [Int] notifications: [Int]
thread: Int thread: Int
} }
input CommunityInput { input CommunityInput {
slug: String slug: String
name: String name: String
desc: String desc: String
pic: String pic: String
} }
input CollectionInput { input CollectionInput {
id: Int id: Int
slug: String! slug: String!
title: String! title: String!
desc: String desc: String
pic: String pic: String
} }
# Auth inputs # Auth inputs
input LoginCredentials { input LoginCredentials {
email: String! email: String!
password: String! password: String!
} }
input RegisterInput { input RegisterInput {
email: String! email: String!
password: String password: String
name: String name: String
} }
input ChangePasswordInput { input ChangePasswordInput {
oldPassword: String! oldPassword: String!
newPassword: String! newPassword: String!
} }
input ResetPasswordInput { input ResetPasswordInput {
token: String! token: String!
newPassword: String! newPassword: String!
} }

View File

@ -1,74 +1,78 @@
type Mutation { type Mutation {
# Auth mutations # Auth mutations
login(email: String!, password: String!): AuthResult! login(email: String!, password: String!): AuthResult!
logout: AuthSuccess! logout: AuthSuccess!
refreshToken: AuthResult! refreshToken: AuthResult!
registerUser(email: String!, password: String, name: String): AuthResult! registerUser(email: String!, password: String, name: String): AuthResult!
sendLink(email: String!, lang: String, template: String): Author! sendLink(email: String!, lang: String, template: String): Author!
confirmEmail(token: String!): AuthResult! confirmEmail(token: String!): AuthResult!
getSession: SessionInfo! getSession: SessionInfo!
changePassword(oldPassword: String!, newPassword: String!): AuthSuccess! changePassword(oldPassword: String!, newPassword: String!): AuthSuccess!
resetPassword(token: String!, newPassword: String!): AuthSuccess! resetPassword(token: String!, newPassword: String!): AuthSuccess!
requestPasswordReset(email: String!, lang: String): AuthSuccess! requestPasswordReset(email: String!, lang: String): AuthSuccess!
updateSecurity(email: String, old_password: String, new_password: String): SecurityUpdateResult! updateSecurity(
confirmEmailChange(token: String!): SecurityUpdateResult! email: String
cancelEmailChange: SecurityUpdateResult! old_password: String
new_password: String
): SecurityUpdateResult!
confirmEmailChange(token: String!): SecurityUpdateResult!
cancelEmailChange: SecurityUpdateResult!
# author # author
rate_author(rated_slug: String!, value: Int!): CommonResult! rate_author(rated_slug: String!, value: Int!): CommonResult!
update_author(profile: ProfileInput!): CommonResult! update_author(profile: ProfileInput!): CommonResult!
# draft # draft
create_draft(draft_input: DraftInput!): CommonResult! create_draft(draft_input: DraftInput!): CommonResult!
update_draft(draft_id: Int!, draft_input: DraftInput!): CommonResult! update_draft(draft_id: Int!, draft_input: DraftInput!): CommonResult!
delete_draft(draft_id: Int!): CommonResult! delete_draft(draft_id: Int!): CommonResult!
# publication # publication
publish_shout(shout_id: Int!): CommonResult! publish_shout(shout_id: Int!): CommonResult!
publish_draft(draft_id: Int!): CommonResult! publish_draft(draft_id: Int!): CommonResult!
unpublish_draft(draft_id: Int!): CommonResult! unpublish_draft(draft_id: Int!): CommonResult!
unpublish_shout(shout_id: Int!): CommonResult! unpublish_shout(shout_id: Int!): CommonResult!
# follower # follower
follow(what: FollowingEntity!, slug: String!): AuthorFollowsResult! follow(what: FollowingEntity!, slug: String!): AuthorFollowsResult!
unfollow(what: FollowingEntity!, slug: String!): AuthorFollowsResult! unfollow(what: FollowingEntity!, slug: String!): AuthorFollowsResult!
# topic # topic
create_topic(topic_input: TopicInput!): CommonResult! create_topic(topic_input: TopicInput!): CommonResult!
update_topic(topic_input: TopicInput!): CommonResult! update_topic(topic_input: TopicInput!): CommonResult!
delete_topic(slug: String!): CommonResult! delete_topic(slug: String!): CommonResult!
delete_topic_by_id(id: Int!): CommonResult! delete_topic_by_id(id: Int!): CommonResult!
merge_topics(merge_input: TopicMergeInput!): CommonResult! merge_topics(merge_input: TopicMergeInput!): CommonResult!
set_topic_parent(topic_id: Int!, parent_id: Int): CommonResult! set_topic_parent(topic_id: Int!, parent_id: Int): CommonResult!
# reaction # reaction
create_reaction(reaction: ReactionInput!): CommonResult! create_reaction(reaction: ReactionInput!): CommonResult!
update_reaction(reaction: ReactionInput!): CommonResult! update_reaction(reaction: ReactionInput!): CommonResult!
delete_reaction(reaction_id: Int!): CommonResult! delete_reaction(reaction_id: Int!): CommonResult!
# collab # collab
create_invite(slug: String, author_id: Int): CommonResult! create_invite(slug: String, author_id: Int): CommonResult!
remove_author(slug: String, author_id: Int): CommonResult! remove_author(slug: String, author_id: Int): CommonResult!
remove_invite(invite_id: Int!): CommonResult! remove_invite(invite_id: Int!): CommonResult!
accept_invite(invite_id: Int!): CommonResult! accept_invite(invite_id: Int!): CommonResult!
reject_invite(invite_id: Int!): CommonResult! reject_invite(invite_id: Int!): CommonResult!
# bookmark # bookmark
toggle_bookmark_shout(slug: String!): CommonResult! toggle_bookmark_shout(slug: String!): CommonResult!
# notifier # notifier
notification_mark_seen(notification_id: Int!, seen: Boolean): CommonResult! notification_mark_seen(notification_id: Int!, seen: Boolean): CommonResult!
notifications_seen_after(after: Int!, seen: Boolean): CommonResult! notifications_seen_after(after: Int!, seen: Boolean): CommonResult!
notifications_seen_thread(thread_id: String!, seen: Boolean): CommonResult! notifications_seen_thread(thread_id: String!, seen: Boolean): CommonResult!
# community # community
join_community(slug: String!): CommonResult! join_community(slug: String!): CommonResult!
leave_community(slug: String!): CommonResult! leave_community(slug: String!): CommonResult!
create_community(community_input: CommunityInput!): CommonResult! create_community(community_input: CommunityInput!): CommonResult!
update_community(community_input: CommunityInput!): CommonResult! update_community(community_input: CommunityInput!): CommonResult!
delete_community(slug: String!): CommonResult! delete_community(slug: String!): CommonResult!
# collection # collection
create_collection(collection_input: CollectionInput!): CommonResult! create_collection(collection_input: CollectionInput!): CommonResult!
update_collection(collection_input: CollectionInput!): CommonResult! update_collection(collection_input: CollectionInput!): CommonResult!
delete_collection(slug: String!): CommonResult! delete_collection(slug: String!): CommonResult!
} }

View File

@ -1,80 +1,100 @@
type Query { type Query {
# author # author
get_author(slug: String, author_id: Int): Author get_author(slug: String, author_id: Int): Author
get_authors_all: [Author] get_authors_all: [Author]
load_authors_by(by: AuthorsBy!, limit: Int, offset: Int): [Author] load_authors_by(by: AuthorsBy!, limit: Int, offset: Int): [Author]
load_authors_search(text: String!, limit: Int, offset: Int): [Author!] # Search for authors by name or bio load_authors_search(text: String!, limit: Int, offset: Int): [Author!] # Search for authors by name or bio
# Auth queries # Auth queries
logout: AuthResult! logout: AuthResult!
me: AuthResult! me: AuthResult!
isEmailUsed(email: String!): Boolean! isEmailUsed(email: String!): Boolean!
isAdmin: Boolean! isAdmin: Boolean!
getOAuthProviders: [OAuthProvider!]! getOAuthProviders: [OAuthProvider!]!
getRoles: [RolesInfo!]! getRoles: [RolesInfo!]!
# community # community
get_community: Community get_community: Community
get_communities_all: [Community] get_communities_all: [Community]
get_communities_by_author(slug: String, user: String, author_id: Int): [Community] get_communities_by_author(
slug: String
user: String
author_id: Int
): [Community]
# collection # collection
get_collection(slug: String!): Collection get_collection(slug: String!): Collection
get_collections_all: [Collection] get_collections_all: [Collection]
get_collections_by_author(slug: String, user: String, author_id: Int): [Collection] get_collections_by_author(
slug: String
user: String
author_id: Int
): [Collection]
# follower # follower
get_shout_followers(slug: String, shout_id: Int): [Author] get_shout_followers(slug: String, shout_id: Int): [Author]
get_topic_followers(slug: String): [Author] get_topic_followers(slug: String): [Author]
get_topic_authors(slug: String): [Author] get_topic_authors(slug: String): [Author]
get_author_followers(slug: String, user: String, author_id: Int): [Author] get_author_followers(slug: String, user: String, author_id: Int): [Author]
get_author_follows(slug: String, user: String, author_id: Int): CommonResult! get_author_follows(slug: String, user: String, author_id: Int): CommonResult!
get_author_follows_topics(slug: String, user: String, author_id: Int): [Topic] get_author_follows_topics(slug: String, user: String, author_id: Int): [Topic]
get_author_follows_authors(slug: String, user: String, author_id: Int): [Author] get_author_follows_authors(
slug: String
user: String
author_id: Int
): [Author]
# reaction # reaction
load_reactions_by(by: ReactionBy!, limit: Int, offset: Int): [Reaction] load_reactions_by(by: ReactionBy!, limit: Int, offset: Int): [Reaction]
load_shout_comments(shout: Int!, limit: Int, offset: Int): [Reaction] load_shout_comments(shout: Int!, limit: Int, offset: Int): [Reaction]
load_shout_ratings(shout: Int!, limit: Int, offset: Int): [Reaction] load_shout_ratings(shout: Int!, limit: Int, offset: Int): [Reaction]
load_comment_ratings(comment: Int!, limit: Int, offset: Int): [Reaction] load_comment_ratings(comment: Int!, limit: Int, offset: Int): [Reaction]
# branched comments pagination # branched comments pagination
load_comments_branch(shout: Int!, parent_id: Int, limit: Int, offset: Int, sort: ReactionSort, children_limit: Int, children_offset: Int): [Reaction] load_comments_branch(
shout: Int!
parent_id: Int
limit: Int
offset: Int
sort: ReactionSort
children_limit: Int
children_offset: Int
): [Reaction]
# reader # reader
get_shout(slug: String, shout_id: Int): Shout get_shout(slug: String, shout_id: Int): Shout
load_shouts_by(options: LoadShoutsOptions): [Shout] load_shouts_by(options: LoadShoutsOptions): [Shout]
load_shouts_search(text: String!, options: LoadShoutsOptions): [SearchResult] load_shouts_search(text: String!, options: LoadShoutsOptions): [SearchResult]
get_search_results_count(text: String!): CountResult! get_search_results_count(text: String!): CountResult!
load_shouts_bookmarked(options: LoadShoutsOptions): [Shout] load_shouts_bookmarked(options: LoadShoutsOptions): [Shout]
# rating # rating
get_my_rates_shouts(shouts: [Int!]!): [MyRateShout] get_my_rates_shouts(shouts: [Int!]!): [MyRateShout]
get_my_rates_comments(comments: [Int!]!): [MyRateComment] get_my_rates_comments(comments: [Int!]!): [MyRateComment]
# public feeds # public feeds
load_shouts_with_topic(slug: String, options: LoadShoutsOptions): [Shout] # topic feed load_shouts_with_topic(slug: String, options: LoadShoutsOptions): [Shout] # topic feed
load_shouts_random_top(options: LoadShoutsOptions): [Shout] # random order, fixed filter, limit offset can be used load_shouts_random_top(options: LoadShoutsOptions): [Shout] # random order, fixed filter, limit offset can be used
load_shouts_authored_by(slug: String, options: LoadShoutsOptions): [Shout] # author feed load_shouts_authored_by(slug: String, options: LoadShoutsOptions): [Shout] # author feed
load_shouts_followed_by(slug: String, options: LoadShoutsOptions): [Shout] # another author feed load_shouts_followed_by(slug: String, options: LoadShoutsOptions): [Shout] # another author feed
# my feeds # my feeds
load_shouts_feed(options: LoadShoutsOptions): [Shout] load_shouts_feed(options: LoadShoutsOptions): [Shout]
load_shouts_unrated(options: LoadShoutsOptions): [Shout] load_shouts_unrated(options: LoadShoutsOptions): [Shout]
load_shouts_coauthored(options: LoadShoutsOptions): [Shout] load_shouts_coauthored(options: LoadShoutsOptions): [Shout]
load_shouts_discussed(options: LoadShoutsOptions): [Shout] load_shouts_discussed(options: LoadShoutsOptions): [Shout]
# editor # editor
get_my_shout(shout_id: Int!): CommonResult! get_my_shout(shout_id: Int!): CommonResult!
get_shouts_drafts: CommonResult! get_shouts_drafts: CommonResult!
load_drafts: CommonResult! load_drafts: CommonResult!
# topic # topic
get_topic(slug: String!): Topic get_topic(slug: String!): Topic
get_topics_all: [Topic]! get_topics_all: [Topic]!
get_topics_by_author(slug: String, user: String, author_id: Int): [Topic] get_topics_by_author(slug: String, user: String, author_id: Int): [Topic]
get_topics_by_community(community_id: Int!, limit: Int, offset: Int): [Topic] get_topics_by_community(community_id: Int!, limit: Int, offset: Int): [Topic]
# notifier # notifier
load_notifications(after: Int!, limit: Int, offset: Int): NotificationsResult! load_notifications(after: Int!, limit: Int, offset: Int): NotificationsResult!
} }

View File

@ -1,334 +1,334 @@
type AuthorStat { type AuthorStat {
shouts: Int shouts: Int
topics: Int topics: Int
authors: Int authors: Int
followers: Int followers: Int
rating: Int rating: Int
rating_shouts: Int rating_shouts: Int
rating_comments: Int rating_comments: Int
comments: Int comments: Int
viewed: Int viewed: Int
} }
type Author { type Author {
id: Int! id: Int!
slug: String! slug: String!
name: String name: String
pic: String pic: String
bio: String bio: String
about: String about: String
links: [String] links: [String]
created_at: Int created_at: Int
last_seen: Int last_seen: Int
updated_at: Int updated_at: Int
deleted_at: Int deleted_at: Int
email: String email: String
seo: String seo: String
stat: AuthorStat # ratings inside stat: AuthorStat # ratings inside
communities: [Community] communities: [Community]
roles: [String!] roles: [String!]
email_verified: Boolean email_verified: Boolean
} }
type ReactionUpdating { type ReactionUpdating {
error: String error: String
status: ReactionStatus status: ReactionStatus
reaction: Reaction reaction: Reaction
} }
type Rating { type Rating {
rater: String! rater: String!
value: Int! value: Int!
} }
type Reaction { type Reaction {
id: Int! id: Int!
shout: Shout! shout: Shout!
created_at: Int! created_at: Int!
created_by: Author! created_by: Author!
updated_at: Int updated_at: Int
deleted_at: Int deleted_at: Int
deleted_by: Author deleted_by: Author
range: String range: String
kind: ReactionKind! kind: ReactionKind!
body: String body: String
reply_to: Int reply_to: Int
stat: Stat stat: Stat
oid: String oid: String
# old_thread: String # old_thread: String
first_replies: [Reaction] first_replies: [Reaction]
} }
type MediaItem { type MediaItem {
url: String url: String
title: String title: String
body: String body: String
source: String # image source: String # image
pic: String pic: String
# audio specific properties # audio specific properties
date: String date: String
genre: String genre: String
artist: String artist: String
lyrics: String lyrics: String
} }
type Shout { type Shout {
id: Int! id: Int!
title: String! title: String!
slug: String! slug: String!
body: String! body: String!
layout: String! layout: String!
lead: String lead: String
subtitle: String subtitle: String
lang: String lang: String
cover: String cover: String
cover_caption: String cover_caption: String
community: Community! community: Community!
main_topic: Topic main_topic: Topic
created_by: Author! created_by: Author!
topics: [Topic] topics: [Topic]
authors: [Author] authors: [Author]
updated_by: Author updated_by: Author
deleted_by: Author deleted_by: Author
created_at: Int! created_at: Int!
updated_at: Int updated_at: Int
published_at: Int published_at: Int
featured_at: Int featured_at: Int
deleted_at: Int deleted_at: Int
seo: String # generated if not set seo: String # generated if not set
version_of: Shout # TODO: use version_of somewhere version_of: Shout # TODO: use version_of somewhere
draft: Draft draft: Draft
media: [MediaItem] media: [MediaItem]
stat: Stat stat: Stat
score: Float score: Float
} }
type PublicationInfo { type PublicationInfo {
id: Int! id: Int!
slug: String! slug: String!
published_at: Int published_at: Int
} }
type Draft { type Draft {
id: Int! id: Int!
created_at: Int! created_at: Int!
created_by: Author! created_by: Author!
community: Community! community: Community!
layout: String layout: String
slug: String slug: String
title: String title: String
subtitle: String subtitle: String
lead: String lead: String
body: String body: String
media: [MediaItem] media: [MediaItem]
cover: String cover: String
cover_caption: String cover_caption: String
lang: String lang: String
seo: String seo: String
# auto # auto
updated_at: Int updated_at: Int
deleted_at: Int deleted_at: Int
updated_by: Author updated_by: Author
deleted_by: Author deleted_by: Author
authors: [Author]! authors: [Author]!
topics: [Topic]! topics: [Topic]!
publication: PublicationInfo publication: PublicationInfo
} }
type Stat { type Stat {
rating: Int rating: Int
comments_count: Int comments_count: Int
viewed: Int viewed: Int
last_commented_at: Int last_commented_at: Int
} }
type CommunityStat { type CommunityStat {
shouts: Int! shouts: Int!
followers: Int! followers: Int!
authors: Int! authors: Int!
} }
type Community { type Community {
id: Int! id: Int!
slug: String! slug: String!
name: String! name: String!
desc: String desc: String
pic: String! pic: String!
created_at: Int! created_at: Int!
created_by: Author! created_by: Author!
stat: CommunityStat stat: CommunityStat
} }
type Collection { type Collection {
id: Int! id: Int!
slug: String! slug: String!
title: String! title: String!
desc: String desc: String
pic: String pic: String
amount: Int amount: Int
published_at: Int published_at: Int
created_at: Int! created_at: Int!
created_by: Author! created_by: Author!
} }
type TopicStat { type TopicStat {
shouts: Int! shouts: Int!
followers: Int! followers: Int!
authors: Int! authors: Int!
comments: Int comments: Int
} }
type Topic { type Topic {
id: Int! id: Int!
slug: String! slug: String!
title: String title: String
body: String body: String
pic: String pic: String
community: Int community: Int
parent_ids: [Int] parent_ids: [Int]
stat: TopicStat stat: TopicStat
oid: String oid: String
is_main: Boolean is_main: Boolean
} }
# output type # output type
type CommonResult { type CommonResult {
error: String error: String
message: String message: String
stats: String stats: String
drafts: [Draft] drafts: [Draft]
draft: Draft draft: Draft
slugs: [String] slugs: [String]
shout: Shout shout: Shout
shouts: [Shout] shouts: [Shout]
author: Author author: Author
authors: [Author] authors: [Author]
reaction: Reaction reaction: Reaction
reactions: [Reaction] reactions: [Reaction]
topic: Topic topic: Topic
topics: [Topic] topics: [Topic]
community: Community community: Community
communities: [Community] communities: [Community]
} }
type SearchResult { type SearchResult {
id: Int! id: Int!
slug: String! slug: String!
title: String! title: String!
cover: String cover: String
main_topic: Topic main_topic: Topic
created_at: Int created_at: Int
authors: [Author] authors: [Author]
topics: [Topic] topics: [Topic]
score: Float! score: Float!
} }
type Invite { type Invite {
id: Int! id: Int!
inviter_id: Int! inviter_id: Int!
author_id: Int! author_id: Int!
shout_id: Int! shout_id: Int!
status: InviteStatus status: InviteStatus
} }
type AuthorFollowsResult { type AuthorFollowsResult {
topics: [Topic] topics: [Topic]
authors: [Author] authors: [Author]
communities: [Community] communities: [Community]
error: String error: String
} }
type Notification { type Notification {
id: Int! id: Int!
action: String! action: String!
entity: String! entity: String!
created_at: Int! created_at: Int!
payload: String! payload: String!
seen: [Author] seen: [Author]
} }
type NotificationSeenResult { type NotificationSeenResult {
error: String error: String
} }
type NotificationGroup { type NotificationGroup {
thread: String! thread: String!
entity: String! entity: String!
action: String! action: String!
updated_at: Int! updated_at: Int!
authors: [Author] authors: [Author]
shout: Shout shout: Shout
reactions: [Reaction] reactions: [Reaction]
seen: Boolean seen: Boolean
} }
type NotificationsResult { type NotificationsResult {
notifications: [NotificationGroup!]! notifications: [NotificationGroup!]!
unread: Int! unread: Int!
total: Int! total: Int!
error: String error: String
} }
type MyRateShout { type MyRateShout {
shout_id: Int! shout_id: Int!
my_rate: ReactionKind my_rate: ReactionKind
} }
type MyRateComment { type MyRateComment {
shout_id: Int shout_id: Int
comment_id: Int! comment_id: Int!
my_rate: ReactionKind my_rate: ReactionKind
} }
# Auth types # Auth types
type AuthResult { type AuthResult {
success: Boolean! success: Boolean!
error: String error: String
token: String token: String
author: Author author: Author
} }
type SecurityUpdateResult { type SecurityUpdateResult {
success: Boolean! success: Boolean!
error: String error: String
author: Author author: Author
} }
type Permission { type Permission {
resource: String! resource: String!
action: String! action: String!
conditions: String conditions: String
} }
type SessionInfo { type SessionInfo {
token: String! token: String!
author: Author! author: Author!
} }
type AuthSuccess { type AuthSuccess {
success: Boolean! success: Boolean!
} }
type OAuthProvider { type OAuthProvider {
id: String! id: String!
name: String! name: String!
url: String! url: String!
} }
type RolesInfo { type RolesInfo {
id: String! id: String!
name: String! name: String!
description: String description: String
permissions: [Permission!]! permissions: [Permission!]!
} }
type CountResult { type CountResult {
count: Int! count: Int!
} }