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

View File

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

View File

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

View File

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

View File

@ -1,80 +1,100 @@
type Query {
# author
get_author(slug: String, author_id: Int): Author
get_authors_all: [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
# author
get_author(slug: String, author_id: Int): Author
get_authors_all: [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
# Auth queries
logout: AuthResult!
me: AuthResult!
isEmailUsed(email: String!): Boolean!
isAdmin: Boolean!
getOAuthProviders: [OAuthProvider!]!
getRoles: [RolesInfo!]!
# Auth queries
logout: AuthResult!
me: AuthResult!
isEmailUsed(email: String!): Boolean!
isAdmin: Boolean!
getOAuthProviders: [OAuthProvider!]!
getRoles: [RolesInfo!]!
# community
get_community: Community
get_communities_all: [Community]
get_communities_by_author(slug: String, user: String, author_id: Int): [Community]
# community
get_community: Community
get_communities_all: [Community]
get_communities_by_author(
slug: String
user: String
author_id: Int
): [Community]
# collection
get_collection(slug: String!): Collection
get_collections_all: [Collection]
get_collections_by_author(slug: String, user: String, author_id: Int): [Collection]
# collection
get_collection(slug: String!): Collection
get_collections_all: [Collection]
get_collections_by_author(
slug: String
user: String
author_id: Int
): [Collection]
# follower
get_shout_followers(slug: String, shout_id: Int): [Author]
get_topic_followers(slug: String): [Author]
get_topic_authors(slug: String): [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_topics(slug: String, user: String, author_id: Int): [Topic]
get_author_follows_authors(slug: String, user: String, author_id: Int): [Author]
# follower
get_shout_followers(slug: String, shout_id: Int): [Author]
get_topic_followers(slug: String): [Author]
get_topic_authors(slug: String): [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_topics(slug: String, user: String, author_id: Int): [Topic]
get_author_follows_authors(
slug: String
user: String
author_id: Int
): [Author]
# reaction
load_reactions_by(by: ReactionBy!, 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_comment_ratings(comment: Int!, limit: Int, offset: Int): [Reaction]
# reaction
load_reactions_by(by: ReactionBy!, 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_comment_ratings(comment: Int!, limit: Int, offset: Int): [Reaction]
# branched comments pagination
load_comments_branch(shout: Int!, parent_id: Int, limit: Int, offset: Int, sort: ReactionSort, children_limit: Int, children_offset: Int): [Reaction]
# branched comments pagination
load_comments_branch(
shout: Int!
parent_id: Int
limit: Int
offset: Int
sort: ReactionSort
children_limit: Int
children_offset: Int
): [Reaction]
# reader
get_shout(slug: String, shout_id: Int): Shout
load_shouts_by(options: LoadShoutsOptions): [Shout]
load_shouts_search(text: String!, options: LoadShoutsOptions): [SearchResult]
get_search_results_count(text: String!): CountResult!
load_shouts_bookmarked(options: LoadShoutsOptions): [Shout]
# reader
get_shout(slug: String, shout_id: Int): Shout
load_shouts_by(options: LoadShoutsOptions): [Shout]
load_shouts_search(text: String!, options: LoadShoutsOptions): [SearchResult]
get_search_results_count(text: String!): CountResult!
load_shouts_bookmarked(options: LoadShoutsOptions): [Shout]
# rating
get_my_rates_shouts(shouts: [Int!]!): [MyRateShout]
get_my_rates_comments(comments: [Int!]!): [MyRateComment]
# rating
get_my_rates_shouts(shouts: [Int!]!): [MyRateShout]
get_my_rates_comments(comments: [Int!]!): [MyRateComment]
# public feeds
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_authored_by(slug: String, options: LoadShoutsOptions): [Shout] # author feed
load_shouts_followed_by(slug: String, options: LoadShoutsOptions): [Shout] # another author feed
# public feeds
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_authored_by(slug: String, options: LoadShoutsOptions): [Shout] # author feed
load_shouts_followed_by(slug: String, options: LoadShoutsOptions): [Shout] # another author feed
# my feeds
load_shouts_feed(options: LoadShoutsOptions): [Shout]
load_shouts_unrated(options: LoadShoutsOptions): [Shout]
load_shouts_coauthored(options: LoadShoutsOptions): [Shout]
load_shouts_discussed(options: LoadShoutsOptions): [Shout]
# my feeds
load_shouts_feed(options: LoadShoutsOptions): [Shout]
load_shouts_unrated(options: LoadShoutsOptions): [Shout]
load_shouts_coauthored(options: LoadShoutsOptions): [Shout]
load_shouts_discussed(options: LoadShoutsOptions): [Shout]
# editor
get_my_shout(shout_id: Int!): CommonResult!
get_shouts_drafts: CommonResult!
load_drafts: CommonResult!
# editor
get_my_shout(shout_id: Int!): CommonResult!
get_shouts_drafts: CommonResult!
load_drafts: CommonResult!
# topic
get_topic(slug: String!): Topic
get_topics_all: [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]
# topic
get_topic(slug: String!): Topic
get_topics_all: [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]
# notifier
load_notifications(after: Int!, limit: Int, offset: Int): NotificationsResult!
# notifier
load_notifications(after: Int!, limit: Int, offset: Int): NotificationsResult!
}

View File

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