################################################################################ ## Custom Directives ################################################################################ """ USER_AUTH_CONDITIONS describes conditions that would prevent a given User to execute any set of mutations or reserved queries. """ enum USER_AUTH_CONDITIONS { """ MISSING_NAME is provided when the User does not have an associated username or display name. """ MISSING_NAME """ MISSING_EMAIL is provided when the User does not have an associated email address. """ MISSING_EMAIL """ BANNED is provided when the User is currently banned. """ BANNED """ SUSPENDED is provided when the User is currently under an active suspension. """ SUSPENDED """ PENDING_DELETION is provided when the User is scheduled for deletion and will remain after being deleted. """ PENDING_DELETION """ WARNED """ WARNED } """ auth is a directive that will enforce authorization rules on the schema definition. It will restrict the viewer of the field based on roles or if the `userIDField` is specified, it will see if the current users ID equals the field specified. This allows users that own a specific resource (like a comment, or a flag) see their own content, but restrict it to everyone else. If the directive is used without options, it simply requires a logged in user. `permit` can be used to allow specific `USER_AUTH_CONDITIONS` that normally (if present) would deny access to any edge associated with the `@auth` directive. If a User has only some of the conditions listed, they will pass, but if they have at least one more that isn't in the list, the request will be denied. If `unscoped` is provided and is `true`, it will require that the user does not have any moderation scopes applied to their account (such as a site moderator). """ directive @auth( roles: [USER_ROLE!] unscoped: Boolean userIDField: String permit: [USER_AUTH_CONDITIONS!] ) on FIELD_DEFINITION """ constraint is a directive that will perform validation on input fields used as arguments to parameters passed in to operations. """ directive @constraint(min: Int, max: Int) on ARGUMENT_DEFINITION """ rate enforces a rate limit on requests made by the user. """ directive @rate(max: Int = 1, seconds: Int!, key: String) on FIELD_DEFINITION """ deprecated indicates that a field should not be used in the future. """ directive @deprecated( reason: String = "No longer supported" ) on FIELD_DEFINITION | ENUM_VALUE enum CACHE_CONTROL_SCOPE { PUBLIC PRIVATE } directive @cacheControl( scope: CACHE_CONTROL_SCOPE maxAge: Int ) on FIELD_DEFINITION | OBJECT | INTERFACE ################################################################################ ## Custom Scalar Types ################################################################################ """ Time represented as an ISO8601 string. """ scalar Time """ Cursor represents a paginating cursor. """ scalar Cursor """ Locale represents a language code in the BCP 47 format. """ scalar Locale ################################################################################ ## Custom Input Types ################################################################################ input SectionFilter { """ name when provided will filter only those comments/stories that have this section. When name is not provided or is null, only comments/stories without a section (uncategorized) will be returned. In order to return all comments/stories regardless of section, specify null or undefined for this filter option. """ name: String } ################################################################################ ## Actions ################################################################################ """ COMMENT_FLAG_REPORTED_REASON is a reason that is reported by a User on a Comment. """ enum COMMENT_FLAG_REPORTED_REASON { """ COMMENT_REPORTED_OFFENSIVE is used when a User reported a Comment as being offensive. """ COMMENT_REPORTED_OFFENSIVE """ COMMENT_REPORTED_ABUSIVE is used when a User reported a Comment as being abusive. """ COMMENT_REPORTED_ABUSIVE """ COMMENT_REPORTED_SPAM is used when a User reported a Comment as appearing like spam. """ COMMENT_REPORTED_SPAM """ COMMENT_REPORTED_OTHER is used when a User reported a Comment that doesn't fit into the other reported reasons. """ COMMENT_REPORTED_OTHER """ COMMENT_REPORTED_BIO is used when a User reports a bio that is offensive or abusive. """ COMMENT_REPORTED_BIO } """ COMMENT_FLAG_DETECTED_REASON is a reason that is detected by the system on a Comment. """ enum COMMENT_FLAG_DETECTED_REASON { """ COMMENT_DETECTED_TOXIC is used when the Comment was detected as being toxic by the system. """ COMMENT_DETECTED_TOXIC """ COMMENT_DETECTED_SPAM is used when the Comment was detected as having spam by the system. """ COMMENT_DETECTED_SPAM """ COMMENT_DETECTED_LINKS is used when the Comment was detected as containing links. """ COMMENT_DETECTED_LINKS """ COMMENT_DETECTED_BANNED_WORD is used when the Comment was detected as containing a banned word. """ COMMENT_DETECTED_BANNED_WORD """ COMMENT_DETECTED_SUSPECT_WORD is used when the Comment was detected as containing a suspect word. """ COMMENT_DETECTED_SUSPECT_WORD """ COMMENT_DETECTED_RECENT_HISTORY is used when a Comment author has exhibited a recent history of rejected comments. """ COMMENT_DETECTED_RECENT_HISTORY """ COMMENT_DETECTED_PREMOD_USER is used when a Comment author has been tagged as requiring premoderation """ COMMENT_DETECTED_PREMOD_USER """ COMMENT_DETECTED_REPEAT_POST is used when a Comment's text exactly matches a previous recent comment from the same author """ COMMENT_DETECTED_REPEAT_POST } """ COMMENT_FLAG_REASON is the union of the COMMENT_FLAG_REPORTED_REASON and COMMENT_FLAG_DETECTED_REASON types. """ enum COMMENT_FLAG_REASON { COMMENT_REPORTED_OFFENSIVE COMMENT_REPORTED_ABUSIVE COMMENT_REPORTED_SPAM COMMENT_REPORTED_OTHER COMMENT_REPORTED_BIO COMMENT_DETECTED_TOXIC COMMENT_DETECTED_SPAM COMMENT_DETECTED_LINKS COMMENT_DETECTED_BANNED_WORD COMMENT_DETECTED_SUSPECT_WORD COMMENT_DETECTED_RECENT_HISTORY COMMENT_DETECTED_PREMOD_USER COMMENT_DETECTED_NEW_COMMENTER COMMENT_DETECTED_REPEAT_POST } """ ReactionActionCounts stores all the counts for the counts for the reaction action on a given item. """ type ReactionActionCounts { """ total is the total number of reactions against a given item. """ total: Int! } """ DontAgreeActionCounts stores all the counts for the counts for the dontAgree action on a given item. """ type DontAgreeActionCounts { """ total is the total number of dontAgree actions against a given item. """ total: Int! } type IllegalActionCounts { """ total is the total number of illegal actions against a given item. """ total: Int! } type Reacter { username: String userID: String } type Reaction { id: String reacter: Reacter } type ReactionEdge { """ node is the Flag for this edge. """ node: Reaction! """ cursor is used in pagination. """ cursor: Cursor! } type ReactionsConnection { """ edges are a subset of FlagEdge's. """ edges: [ReactionEdge!]! """ nodes is a list of Flags. """ nodes: [Reaction!]! """ pageInfo is information to aid in pagination. """ pageInfo: PageInfo! } type FlagReasonActionCounts { COMMENT_REPORTED_OFFENSIVE: Int! COMMENT_REPORTED_ABUSIVE: Int! COMMENT_REPORTED_SPAM: Int! COMMENT_REPORTED_OTHER: Int! COMMENT_REPORTED_BIO: Int! COMMENT_DETECTED_TOXIC: Int! COMMENT_DETECTED_SPAM: Int! COMMENT_DETECTED_LINKS: Int! COMMENT_DETECTED_BANNED_WORD: Int! COMMENT_DETECTED_SUSPECT_WORD: Int! COMMENT_DETECTED_RECENT_HISTORY: Int! COMMENT_DETECTED_PREMOD_USER: Int! COMMENT_DETECTED_NEW_COMMENTER: Int! COMMENT_DETECTED_REPEAT_POST: Int! } type Flag { """ id is the identifier for this flag action. """ id: ID! """ flagger is the User that created the Flag. If this is null, then the system created the Flag. """ flagger: User """ comment is the comment this flag was created on. """ comment: Comment! """ revision is the comment revision this flag was generated upon. """ revision: CommentRevision """ reason is the selected reason why the Flag is being created. If the reason is not defined, or existed from a previous version of Coral, it will return null to avoid errors. """ reason: COMMENT_FLAG_REASON """ additionalDetails stores information from the User as to why the Flag was created or is relevant. """ additionalDetails: String """ reviewed is whether this flag reason and details have been reviewed by a moderator. """ reviewed: Boolean! """ createdAt is when this flag was created. """ createdAt: Time! """ reportID is the id of the DSAReport that was created when the comment was flagged as potentially containing illegal content. Only exists for illegal content flag type. """ reportID: String } type FlagEdge { """ node is the Flag for this edge. """ node: Flag! """ cursor is used in pagination. """ cursor: Cursor! } type FlagsConnection { """ edges are a subset of FlagEdge's. """ edges: [FlagEdge!]! """ nodes is a list of Flags. """ nodes: [Flag!]! """ pageInfo is information to aid in pagination. """ pageInfo: PageInfo! } """ FlagActionCounts stores all the counts for the counts for the flag action on a given item and the reason counts. """ type FlagActionCounts { """ total is the total number of flags against a given item. """ total: Int! """ reasons stores the counts for the various reasons that an item could be flagged for. """ reasons: FlagReasonActionCounts! } """ ActionCounts returns the counts of each action for an item. """ type ActionCounts { """ reaction returns the counts for the reaction action on an item. """ reaction: ReactionActionCounts! """ dontAgree returns the counts for the dontAgree action on an item. This edge is restricted to administrators and moderators. """ dontAgree: DontAgreeActionCounts! @auth(roles: [ADMIN, MODERATOR]) """ flag returns the counts for the flag action on an item. This edge is restricted to administrators and moderators. """ flag: FlagActionCounts! @auth(roles: [ADMIN, MODERATOR]) """ illegal returns the counts for the illegal content action on on item. """ illegal: IllegalActionCounts! } """ ActionPresence returns whether or not a given item has one of the following actions on it. This is typically used to determine if a given user has left one of the following actions. """ type ActionPresence { """ reaction is true when a reaction action was left on an item. """ reaction: Boolean! """ dontAgree is true when a dontAgree action was left on an item. """ dontAgree: Boolean! """ flag is true when a flag action was left on an item. """ flag: Boolean! """ flag is true when an illegal content actions was left on an item. """ illegal: Boolean! } ################################################################################ ## Settings ################################################################################ enum FEATURE_FLAG { """ SECTIONS when enabled will allow filtering comments in the moderation queue by section. """ SECTIONS """ DISABLE_WARN_USER_OF_TOXIC_COMMENT when enabled will turn off warnings for toxic comments. """ DISABLE_WARN_USER_OF_TOXIC_COMMENT """ ENABLE_QA when enabled will turn off Q&A features client side. """ ENABLE_QA """ DEFAULT_QA_STORY_MODE will set the story mode to QA by default. """ DEFAULT_QA_STORY_MODE """ REDUCED_SECURITY_MODE when true will allow unpersisted queries to be executed in production environments. """ REDUCED_SECURITY_MODE """ DISCUSSIONS will enable the discussions tab for the comment stream. """ DISCUSSIONS """ READ_MORE_NEW_TAB will enable opening a new tab when a user clicks on "read more of this conversation" in the comment stream. """ READ_MORE_NEW_TAB """ AVATARS will enable pulling an avatar URL from sso token and displaying it next to user comments """ AVATARS """ NEW_COMMENT_COUNT enables the comment count update feature. """ NEW_COMMENT_COUNT """ EXTERNAL_MEDIA enables embedding external images """ EXTERNAL_MEDIA """ RTE_SARCASM enables sarcasm RTE feature """ RTE_SARCASM """ VIEWER_COUNT when true will enable the display and tracking of the viewer count. """ VIEWER_COUNT """ ALTERNATE_OLDEST_FIRST_VIEW when enabled will move the create comment form to the bottom of the stream when sorting the comment stream by oldest first. """ ALTERNATE_OLDEST_FIRST_VIEW """ ENABLE_RATINGS_AND_REVIEWS when enabled will allow for the ratings and reviews functionality to be enabled. """ ENABLE_RATINGS_AND_REVIEWS """ DISABLE_LIVE_UPDATES will disable live updates at the tenant level and overrides the configuration option available in the Admin UI for that tenant. """ DISABLE_LIVE_UPDATES """ EMAIL_META will add the email template context as a header to the SMTP as the `X-Coral-Template` header. """ EMAIL_META """ COMMENT_SEEN will mark comment that has been seen/unseen. """ COMMENT_SEEN """ Z_KEY will allow Z key traversal and the mobile toolbar. """ Z_KEY """ CONFIGURE_PUBLIC_PROFILE_URL will allow configuration in the admin of a link to an external profile for a user. """ CONFIGURE_PUBLIC_PROFILE_URL """ DATA_CACHE will allow the use of the data cache to store and load comments, users, and commentActions more quickly. It is disabled by default. """ DATA_CACHE """ COUNTS_V2 will allow the use of the new /counts/v2 api endpoint to retrieve story comment counts. """ COUNTS_V2 """ DISABLE_EXTERNAL_NOTIFICATIONS will disable the external notifications feature at the tenant level. """ DISABLE_EXTERNAL_NOTIFICATIONS } # The moderation mode of the site. enum MODERATION_MODE { """ Comments posted while in `PRE` mode will be labeled with a `PREMOD` status and will require a moderator decision before being visible. """ PRE """ Comments posted while in `POST` will be visible immediately. """ POST """ Comments posted while in `SPECIFIC_SITES_PRE` mode will be labeled with a `PREMOD` status if the site is included in premoderateAllCommentsSites. """ SPECIFIC_SITES_PRE } enum NEW_USER_MODERATION { """ New users who sign up with an email domain configured to this moderation mode will be automatically banned """ BAN """ New users who sign up with an email domain configured to this moderation mode will be automatically always pre-moderated """ PREMOD } """ WordList describes all the available wordLists. """ type WordList { """ banned words will by default reject the comment if it is found. """ banned: [String!]! """ suspect words will simply flag the comment. """ suspect: [String!]! } enum STORY_MODE { """ Coments is when a story is used for general commenting. """ COMMENTS """ QA is used for when the story is in Q&A mode. """ QA """ RATINGS_AND_REVIEWS is used for when the story should be used for ratings and reviews. """ RATINGS_AND_REVIEWS } ################################################################################ ## Moderation ################################################################################ """ ModerationQueue returns the Comments associated with a Moderation Queue. """ type ModerationQueue { """ id is a canonical identifier for this specific moderation queue. """ id: ID! """ count will return the number of Comments that are in this queue. """ count: Int """ comments are the comments on the ModerationQueue. """ comments( first: Int = 10 @constraint(max: 50) after: Cursor orderBy: COMMENT_SORT = CREATED_AT_DESC ): CommentsConnection! } """ ModerationQueues are the list of ModerationQueue's that are supported inside Coral that can be used to moderate Comments. """ type ModerationQueues { """ unmoderated will return a ModerationQueue for all Comments that have not been moderated yet. """ unmoderated: ModerationQueue! """ reported will return a ModerationQueue for all Comments that have been published, have not been moderated by a human yet, and have been reported by a User via a flag. """ reported: ModerationQueue! """ pending will return a ModerationQueue for all Comments that were held back by the system and require moderation in order to be published. """ pending: ModerationQueue! } ################################################################################ ## Auth ################################################################################ ########################## ## AuthenticationTargetFilter ########################## """ AuthenticationTargetFilter when non-null, will specify the targets that a specific authentication integration will be enabled on. """ type AuthenticationTargetFilter { admin: Boolean! stream: Boolean! } ########################## ## LocalAuthIntegration ########################## type LocalAuthIntegration { enabled: Boolean! """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean! """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: AuthenticationTargetFilter! } ########################## ## SSOAuthIntegration ########################## type SigningSecret { """ kid is the identifier for the key used when verifying tokens issued by the provider. """ kid: String! """ secret is the actual underlying secret used to verify the tokens with. """ secret: String! """ createdAt is the date that the key was created at. """ createdAt: Time! """ lastUsedAt is the time that the """ lastUsedAt: Time """ rotatedAt is the time that the token was rotated out. """ rotatedAt: Time """ inactiveAt is the date that the token can no longer be used to validate tokens. """ inactiveAt: Time } """ SSOAuthIntegration is an AuthIntegration that provides a secret to the admins of a tenant, where they can sign a SSO payload with it to provide to the embed to allow single sign on. """ type SSOAuthIntegration { enabled: Boolean! """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean! """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: AuthenticationTargetFilter! """ signingSecrets are the different SigningSecret's used by this Tenant. """ signingSecrets: [SigningSecret!]! @auth(roles: [ADMIN]) """ key is the secret that is used to sign tokens. """ key: String @auth(roles: [ADMIN]) @deprecated(reason: "field is deprecated in favour of `signingSecrets`") """ keyGeneratedAt is the Time that the key was effective from. """ keyGeneratedAt: Time @auth(roles: [ADMIN]) @deprecated(reason: "field is deprecated in favour of `signingSecrets`") } ########################## ## OIDCAuthIntegration ########################## """ DiscoveredOIDCConfiguration contains the discovered Provider Metadata as defined in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata Discovery is not supported on all providers, and is described in the OpenID Connect Discovery 1.0 incorporating errata set 1: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig """ type DiscoveredOIDCConfiguration { """ issuer is defined as the `issuer` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ issuer: String! """ authorizationURL is defined as the `authorization_endpoint` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ authorizationURL: String! """ tokenURL is defined as the `token_endpoint` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ tokenURL: String """ jwksURI is defined as the `jwks_uri` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ jwksURI: String! } """ OIDCAuthIntegration provides a way to store Open ID Connect credentials. This will be used in the admin to provide staff logins for users. """ type OIDCAuthIntegration { """ enabled, when true, allows the integration to be enabled. """ enabled: Boolean! """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean! """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: AuthenticationTargetFilter! """ name is the label assigned to reference the provider of the OIDC integration, and will be used in situations where the name of the provider needs to be displayed, like the login button. """ name: String """ callbackURL is the URL that the user should be redirected to in order to continue the authentication flow with the given integration. This field is not stored, and is instead computed from the Tenant. """ callbackURL: String! @auth(roles: [ADMIN]) """ redirectURL is the URL that the user should be redirected to in order to start an authentication flow with the given integration. This field is not stored, and is instead computed from the Tenant. """ redirectURL: String """ clientID is the Client Identifier as defined in: https://tools.ietf.org/html/rfc6749#section-2.2 """ clientID: String @auth(roles: [ADMIN]) """ clientSecret is the Client Secret as defined in: https://tools.ietf.org/html/rfc6749#section-2.3.1 """ clientSecret: String @auth(roles: [ADMIN]) """ authorizationURL is defined as the `authorization_endpoint` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ authorizationURL: String @auth(roles: [ADMIN]) """ tokenURL is defined as the `token_endpoint` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ tokenURL: String @auth(roles: [ADMIN]) """ jwksURI is defined as the `jwks_uri` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ jwksURI: String @auth(roles: [ADMIN]) """ issuer is defined as the `issuer` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ issuer: String @auth(roles: [ADMIN]) } ########################## ## GoogleAuthIntegration ########################## type GoogleAuthIntegration { """ enabled, when true, will enable Google as an authentication integration. """ enabled: Boolean! """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean! """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: AuthenticationTargetFilter! """ clientID is the Client Identifier as provided by the Google API Console. """ clientID: String @auth(roles: [ADMIN]) """ clientSecret is the Client Secret as provided by the Google API Console. """ clientSecret: String @auth(roles: [ADMIN]) """ callbackURL is the URL that the user should be redirected to in order to continue the authentication flow. This field is not stored, and is instead computed from the Tenant. """ callbackURL: String! @auth(roles: [ADMIN]) """ redirectURL is the URL that the user should be redirected to in order to start an authentication flow with the given integration. This field is not stored, and is instead computed from the Tenant. """ redirectURL: String! } ########################## ## FacebookAuthIntegration ########################## type FacebookAuthIntegration { """ enabled, when true, will enable Facebook as an authentication integration. """ enabled: Boolean! """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean! """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: AuthenticationTargetFilter! """ clientID is the Client Identifier as provided by the Facebook Developer Console. """ clientID: String @auth(roles: [ADMIN]) """ clientSecret is the Client Secret as provided by the Facebook Developer Console. """ clientSecret: String @auth(roles: [ADMIN]) """ callbackURL is the URL that the user should be redirected to in order to continue the authentication flow. This field is not stored, and is instead computed from the Tenant. """ callbackURL: String! @auth(roles: [ADMIN]) """ redirectURL is the URL that the user should be redirected to in order to start an authentication flow with the given integration. This field is not stored, and is instead computed from the Tenant. """ redirectURL: String! } ########################## ## Auth ########################## type AuthIntegrations { """ local stores configuration related to email/password based logins. """ local: LocalAuthIntegration! """ sso stores configuration related to Single Sign On based logins. """ sso: SSOAuthIntegration! """ oidc stores configuration related to OpenID Connect based logins. """ oidc: OIDCAuthIntegration! """ google stores configuration related to Google based logins. """ google: GoogleAuthIntegration! """ facebook stores configuration related to Facebook based logins. """ facebook: FacebookAuthIntegration! } """ Auth contains all the settings related to authentication and authorization. """ type Auth { """ integrations are the set of configurations for the variations of authentication solutions. """ integrations: AuthIntegrations! """ sessionDuration determines the duration in seconds for which an access token is valid """ sessionDuration: Int! @auth(roles: [ADMIN]) } ################################################################################ ## ExternalIntegrations ################################################################################ type AkismetExternalIntegration { """ enabled when True will enable the integration. """ enabled: Boolean! """ ipBased when True will enable IP-based spam detection. """ ipBased: Boolean! """ The key for the Akismet integration. """ key: String """ The site (blog) for the Akismet integration. """ site: String } type PerspectiveExternalIntegration { """ enabled when True will enable the integration. """ enabled: Boolean! """ The endpoint that Coral should use to communicate with the perspective API. """ endpoint: String @auth(roles: [ADMIN]) """ The key for the Perspective API integration. """ key: String @auth(roles: [ADMIN]) """ The threshold that given a specific toxic comment score, the comment will be marked by Coral as toxic. """ threshold: Float """ model is the Perspective model to use. """ model: String @auth(roles: [ADMIN]) """ When True, comments sent will not be stored by the Google Perspective API. """ doNotStore: Boolean @auth(roles: [ADMIN]) """ When True, comment moderation decisions will be sent to the Google Perspective API to help improve the comment analysis algorithms. """ sendFeedback: Boolean @auth(roles: [ADMIN]) } """ COMMENT_BODY_FORMAT describes the various formats that a comment body can be provided in. """ enum COMMENT_BODY_FORMAT { """ HTML describes the format of the comment body using HTML. """ HTML """ PLAIN_TEXT describes the format of the comment body with the HTML stripped. """ PLAIN_TEXT } """ ExternalModerationPhase describes a phase use in the moderation pipeline that calls out to an external resource as defined by the provided URL. """ type ExternalModerationPhase { """ id identifies this particular External Moderation Phase. """ id: ID! """ name is the name assigned to this ExternalModerationPhase for identification purposes. """ name: String! """ enabled when true, will use this phase in the moderation pipeline. """ enabled: Boolean! """ url is the actual URL that should be called. """ url: String! """ format is the format of the comment body sent. """ format: COMMENT_BODY_FORMAT! """ timeout is the number of milliseconds that this moderation is maximum expected to take before it is skipped. """ timeout: Int! """ signingSecret is the secret used to sign outgoing requests to the url during the moderation pipeline. """ signingSecret: SigningSecret! } type CustomExternalIntegration { """ phases is all the external moderation phases for this Tenant. """ phases: [ExternalModerationPhase!]! } type ExternalIntegrations { """ akismet provides integration with the Akismet Spam detection service. """ akismet: AkismetExternalIntegration! """ perspective provides integration with the Perspective API comment analysis platform. """ perspective: PerspectiveExternalIntegration! """ external provides integration details for external moderation phases that can be used in the moderation pipeline. """ external: CustomExternalIntegration } ################################################################################ ## RecentCommentHistory ################################################################################ """ RecentCommentHistoryConfiguration controls the beheviour around when comments from Users should be marked for pre-moderation automatically once they have reached the trigger rate for rejected comments. """ type RecentCommentHistoryConfiguration { """ enabled when true will pre-moderate users new comments once they have reached the trigger rejection rate. """ enabled: Boolean! """ timeFrame specifies the number of seconds that comments from a given User will be taken into account when computing their rejection rate. """ timeFrame: Int! """ triggerRejectionRate specifies the percentage of comments that a given User may have before their comments will then be placed into pre-moderation until the rejection rate decreases. """ triggerRejectionRate: Float! } """ RecentCommentHistory returns data associated with a User's recent commenting history within the specified timeFrame configured. """ type RecentCommentHistory { """ statuses stores the counts of all the statuses against Comments by a User within the timeFrame configured. """ statuses: CommentStatusCounts! } ################################################################################ ## CharCount ################################################################################ type CharCount { """ enabled when true, enables the character count moderation phase. """ enabled: Boolean! """ min is the smallest length of a Comment that may be posted. """ min: Int """ max is the largest length of a Comment that may be posted. """ max: Int } ################################################################################ ## DisableCommenting ################################################################################ type DisableCommenting { """ enabled when true will disable commenting site-wide. """ enabled: Boolean! """ message will be shown above the comment stream while commenting is disabled site-wide. """ message: String! } ################################################################################ ## EmailConfiguration ################################################################################ type SMTP { secure: Boolean host: String port: Int authentication: Boolean username: String password: String } type EmailConfiguration { """ enabled when true, will enable the emailing functionality in Coral. """ enabled: Boolean! fromName: String fromEmail: String smtp: SMTP! @auth(roles: [ADMIN]) } ################################################################################ ## Slack Configuration ################################################################################ type SlackConfiguration { """ channels is the set of Slack channels configured to receive comments """ channels: [SlackChannel!]! } type SlackChannelTriggers { """ reportedComments is whether this channel will receive reported comments """ reportedComments: Boolean """ pendingComments is whether this channel will receive pending comments """ pendingComments: Boolean """ featuredComments is whether this channel will receive featured comments """ featuredComments: Boolean """ allComents is whether the channel will receive all comments """ allComments: Boolean """ staffComments is whether the channel will receive staff comments """ staffComments: Boolean } type SlackChannel { """ enabled is whether this Slack channel is enabled to send comments to its correlated web hook """ enabled: Boolean! """ name is the name assigned to the Slack channel """ name: String """ hookURL defines the URL that comments will be sent to """ hookURL: String """ triggers are the filters of types of comments that will be sent to the correlated channel """ triggers: SlackChannelTriggers! } ################################################################################ ## ReactionConfiguration ################################################################################ """ ReactionConfiguration stores the configuration for reactions used across this Tenant. """ type ReactionConfiguration { """ icon is the string representing the icon to be used for the reactions. """ icon: String! """ iconActive is the string representing the icon that should be used when the icon should be considered active. """ iconActive: String """ label is the string placed beside the reaction icon to provide better context. """ label: String! """ labelActive is the string placed beside the reaction icon to provide better context when it has been selected. """ labelActive: String! """ sortLabel is the string placed inside of the sort menu to sort for comment with most reactions. """ sortLabel: String! """ color is the hex color code that can be used to change the color of the button. """ color: String } ################################################################################ ## CommunityGuidelines ################################################################################ type CommunityGuidelines { """ enable set to true will show the guidelines above the message box. """ enabled: Boolean! """ content of the guidelines. """ content: String } """ StoryMessageBox stores settings related to the Story Message Box. """ type StoryMessageBox { """ enable when true will enable the Message Box on the comment stream. """ enabled: Boolean! """ icon when set will reference the string for the Message box used by the Message Box. """ icon: String """ content when set contains the actual markup for the Message Box. """ content: String } ################################################################################ ## Embed Links ################################################################################ enum GIF_MEDIA_SOURCE { GIPHY TENOR KLIPY } type GifMediaConfiguration { """ enabled is true when gif search via giphy and giphy media objects are enabled. """ enabled: Boolean! """ provider is the source that gif's are pulled from """ provider: GIF_MEDIA_SOURCE """ maximum allowed rating for gifs, g, pg, pg-13, r. """ maxRating: String """ key is the API key for the gif provider. """ key: String } type TwitterMediaConfiguration { """ enabled is true when twitter media objects are enabled. """ enabled: Boolean! } type BlueskyMediaConfiguration { """ enabled is true when Bluesky media objects are enabled. """ enabled: Boolean! } type YouTubeMediaConfiguration { """ enabled is true when youtube media objects are enabled. """ enabled: Boolean! } type ExternalMediaConfiguration { """ enabled is true when external media objects are enabled. """ enabled: Boolean! } type MediaConfiguration { """ twitter is the configuration for Twitter support. """ twitter: TwitterMediaConfiguration! """ bluesky is the configuration for Bluesky support. """ bluesky: BlueskyMediaConfiguration! """ youtube is the configuration for YouTube support. """ youtube: YouTubeMediaConfiguration! """ gifs is the configuration for GIF support. """ gifs: GifMediaConfiguration! """ external is the configuration for external images. """ external: ExternalMediaConfiguration! } ################################################################################ ## Settings ################################################################################ """ CloseCommenting contains settings related to the automatic closing of commenting on Stories. """ type CloseCommenting { """ auto when true will configure the automatic close on each story as they are created based on the current configured timeout option. """ auto: Boolean! @auth(roles: [ADMIN, MODERATOR]) """ timeout is the amount of seconds from the `createdAt` timestamp that a given story will be considered closed. """ timeout: Int! @auth(roles: [ADMIN, MODERATOR]) """ message when provided will be the message that shows when the comment stream is closed for commenting. """ message: String! } """ Organization stores information about the organization behind this specific instance of Coral. """ type Organization { """ name is the name of the organization. """ name: String! """ contactEmail is the email of the organization. """ contactEmail: String! """ url is the URL to the organizations home page. """ url: String! } """ StoryScrapingConfiguration stores the configuration around story scraping. """ type StoryScrapingConfiguration { """ enabled, when true, enables stories to be scraped. When disabled, stories will only be looked up instead, and must be created via the API directly. """ enabled: Boolean! """ proxyURL when specified, allows scraping requests to use the provided proxy. All requests will then be passed through the appropriate proxy as parsed by the [proxy-agent](https://www.npmjs.com/package/proxy-agent) package. """ proxyURL: String """ customUserAgent when specified will override the user agent used by fetch requests made during the scraping process. """ customUserAgent: String """ authentication is whether alternative authentication credentials have been provided for scraping activities. """ authentication: Boolean! """ username is the username to use with basic authentication for scraping jobs. """ username: String """ password is the password to use with basic authentication for scraping jobs. """ password: String } """ StoryConfiguration stores the configuration for working with stories. """ type StoryConfiguration { """ scraping stores configuration around story scraping. """ scraping: StoryScrapingConfiguration! """ disableLazy when true, will only allow lookups of stories created via the API. """ disableLazy: Boolean! } """ CommenterAccountFeatures stores the configuration for commenter account features. """ type CommenterAccountFeatures { """ changeUsername when true, non-sso user may change username every 14 days """ changeUsername: Boolean! """ downloadComments when true, user may download their comment history """ downloadComments: Boolean! """ deleteAccount when true, non-sso user may permanently delete their account """ deleteAccount: Boolean! } """ EmbeddedCommentsConfiguration specifies the configuration for embedded comments. """ type EmbeddedCommentsConfiguration { allowReplies: Boolean """ oEmbedAllowedOrigins are the allowed origins for oEmbed API calls. """ oEmbedAllowedOrigins: [String!]! @auth(roles: [ADMIN, MODERATOR]) } """ BadgeConfiguration specifies the configuration for the staff badges assigned to users with any role above COMMENTER. """ type BadgeConfiguration { """ label is the string used when displaying the STAFF badge to users. """ label: String! @deprecated(reason: "deprecated in favour of staffLabel") """ memberLabel is the string used when displaying the MEMBER badge to users. """ memberLabel: String! """ staffLabel is the string used when displaying the STAFF badge to users. """ staffLabel: String! """ moderatorLabel is the string used when displaying the MODERATOR badge to users. """ moderatorLabel: String! """ adminLabel is the string used when displaying the ADMIN badge to users """ adminLabel: String! } """ topCommenter specifies whether or not the feature is enabled to show that commenters with comments featured within the last 10 days are top commenters """ type TopCommenterConfiguration { """ enabled is whether the Top commenter feature is enabled """ enabled: Boolean } type NewCommenterConfiguration { enabled: Boolean } """ FlairBadgeConfiguration specifies the configuration for flair badges, including whether they are enabled and any configured image urls. """ type FlairBadge { name: String! url: String! } type FlairBadgeConfiguration { flairBadgesEnabled: Boolean badges: [FlairBadge!]! } type WebhookDelivery { success: Boolean! status: Int! statusText: String! request: String! response: String! createdAt: Time! } enum WEBHOOK_EVENT_NAME { STORY_CREATED COMMENT_CREATED COMMENT_REPLY_CREATED COMMENT_ENTERED_MODERATION_QUEUE COMMENT_LEFT_MODERATION_QUEUE } type WebhookEndpoint { """ id is the unique identifier for this specific endpoint. """ id: ID! """ enabled when true will enable events to be sent to this endpoint. """ enabled: Boolean! """ url is the URL that we will POST event data to. """ url: String! """ signingSecret is the current secret used to sign the events sent out. """ signingSecret: SigningSecret! """ deliveries store the deliveries for each event sent for the last 50 events. """ deliveries: [WebhookDelivery!]! """ all is true when all events are subscribed to. """ all: Boolean! """ events are the specific event names that this endpoint is configured to send for. """ events: [WEBHOOK_EVENT_NAME!]! } type WebhookConfiguration { """ endpoints is all the configured endpoints that should receive events. """ endpoints: [WebhookEndpoint!]! } """ NewCommenterConfiguration specifies the features that apply to new commenters """ type NewCommentersConfiguration { """ premodEnabled ensures that new commenters' comments are pre-moderated until they have enough approved comments """ premodEnabled: Boolean! @deprecated( reason: "Use moderation instead for whether premod is enabled and on which sites" ) """ approvedCommentsThreshold is the number of comments a user must have approved before their comments do not require premoderation """ approvedCommentsThreshold: Int! """ moderation is the configuration for moderation for new commenters' comments until they have enough approved comments. It stores whether it is PRE, POST, or SPECIFIC_SITES_PRE for pre-moderation only on specific sites, and in this case, which specific sites. """ moderation: NewCommentersModerationConfig } """ NewCommentersModerationConfig specifies the configuration for moderation for new commenters' comments until they have enough approved comments. It stores whether it is PRE, POST, or SPECIFIC_SITES_PRE for pre-moderation only on specific sites, and in this case, which specific sites. """ type NewCommentersModerationConfig { mode: MODERATION_MODE premodSites: [String!]! } """ EmailDomain specifies the features that apply to certain email domains """ type EmailDomain { """ domain is the email domain after the @ symbol, ex. example.com """ domain: String! """ id is the identifier for the email domain """ id: ID! """ newUserModeration is how new users who sign up with this email domain should be treated, ex. banned or always premoderated """ newUserModeration: NEW_USER_MODERATION! } """ Announcement is an organization-wide announcement displayed above the stream for a set duration """ type Announcement { """ id is a canonical identifier for this Announcement, used to dismiss on front-end. """ id: ID! """ content is the content displayed for the announcement. """ content: String! """ createdAt is the creation date. """ createdAt: Time! @auth(roles: [ADMIN]) """ disableAt is the computed date at which announcement will be invalid. """ disableAt: Time! @auth(roles: [ADMIN]) """ duration determines how long the announcement will be valid for. """ duration: Int! @auth(roles: [ADMIN]) } type Site { """ id is the identifier of the Site. """ id: ID! """ name is the name of the Site. """ name: String! """ allowedOrigins are the allowed origins for embeds. """ allowedOrigins: [String!]! @auth(roles: [ADMIN, MODERATOR]) """ canModerate when true indicates that the current user can moderate comments left on this Site. """ canModerate: Boolean! """ topStories will return stories that have had the most comments within the last 24 hours on this Site. """ topStories(limit: Int = 5 @constraint(max: 5)): [Story!]! """ createdAt is when the site was created. """ createdAt: Time! @auth(roles: [ADMIN, MODERATOR]) } type RTEConfiguration { """ enabled when true turns on basic RTE features including bold, italic, quote, and bullet list. """ enabled: Boolean! """ strikethrough when true turns on the strikethrough feature. """ strikethrough: Boolean! """ spoiler when true turns on the spoiler feature. """ spoiler: Boolean! """ sarcasm when true turns on the sarcasm feature. """ sarcasm: Boolean! } type TooManyPeriodsConfig { """ enabled decides whether the too many periods config is enabled or not. """ enabled: Boolean! } type EmailAliasesConfig { """ enabled decides whether the email aliases config is enabled or not. """ enabled: Boolean! } type PremoderateEmailAddressConfiguration { """ tooManyPeriods is the configuration for premoderating emails that have too many periods. """ tooManyPeriods: TooManyPeriodsConfig """ emailAliases is the configuration for premoderating email aliases that already exist """ emailAliases: EmailAliasesConfig } type DisposableEmailDomainConfiguration { """ enabled decides whether disposable email domains should be pre-moderated """ enabled: Boolean! } type InPageNotificationsConfiguration { enabled: Boolean floatingBellIndicator: Boolean active: Boolean } type ExternalNotificationsConfiguration { active: Boolean } input TooManyPeriodsConfigInput { """ enabled decides whether the too many periods config is enabled or not. """ enabled: Boolean } input EmailAliasesConfigInput { """ enabled decides whether the email aliases config is enabled or not. """ enabled: Boolean } input PremoderateEmailAddressConfigurationInput { """ tooManyPeriods is the configuration for premoderating emails that have too many periods. """ tooManyPeriods: TooManyPeriodsConfigInput """ emailAliases is the configuration for premoderating email aliases that already exist """ emailAliases: EmailAliasesConfigInput } enum DSA_METHOD_OF_REDRESS { NONE EMAIL URL } type DSAMethodOfRedressConfiguration { """ method defines the type of redress that is available to the users about DSA decisions. """ method: DSA_METHOD_OF_REDRESS! """ email is the email used when method is set to EMAIL. """ email: String """ url is the url that is used when method is set to URL. """ url: String } type DSAConfiguration { """ enabled when true turns on the European Union DSA compliance features for commenting, reporting, and moderation flows. """ enabled: Boolean! """ methodOfRedress lets users know if and how they can appeal a moderation decision """ methodOfRedress: DSAMethodOfRedressConfiguration! } """ Settings stores the global settings for a given Tenant. """ type Settings @cacheControl(maxAge: 30) { """ id is a canonical identifier for this Tenant. """ id: ID! """ domain is the domain that is associated with this Tenant. """ domain: String! @auth(roles: [ADMIN]) @cacheControl(maxAge: 0, scope: PRIVATE) """ webhooks store the webhook configuration. """ webhooks: WebhookConfiguration! @auth(roles: [ADMIN]) @cacheControl(maxAge: 0, scope: PRIVATE) """ webhookEvents returns all the events that can trigger webhooks. """ webhookEvents: [WEBHOOK_EVENT_NAME!]! @auth(roles: [ADMIN]) @cacheControl(maxAge: 0, scope: PRIVATE) """ staticURI if configured, is the static URI used to serve static files from. """ staticURI: String @auth(roles: [ADMIN]) @cacheControl(maxAge: 0, scope: PRIVATE) """ locale is the specified locale for this Tenant. """ locale: Locale! """ live provides configuration options related to live updates for stories on this site. """ live: LiveConfiguration! """ moderation is the moderation mode for all Stories on the site. """ moderation: MODERATION_MODE @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ premoderateAllCommentsSites are the sites that should have all comments premoderated when moderation mode is SPECIFIC_SITES_PRE """ premoderateAllCommentsSites: [ID!]! """ communityGuidelines will be shown in the comments stream. """ communityGuidelines: CommunityGuidelines! """ premodLinksEnable will put all comments that contain links into premod. """ premodLinksEnable: Boolean @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ closeCommenting contains settings related to the automatic closing of commenting on Stories. """ closeCommenting: CloseCommenting! """ flattenReplies when enabled, will cause all replies that would normally be hidden by a "Show more of this conversation" button to be displayed linearly sorted by date. """ flattenReplies: Boolean! """ collapseReplies when enabled, will cause first-level replies to be collapsed by default in the comment stream. """ collapseReplies: Boolean! """ customCSSURL is the URL of the custom CSS used to display on the frontend. """ customCSSURL: String @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ customFontsCSSURL is the URL of the custom CSS with @font-face definitions used to display on the frontend. """ customFontsCSSURL: String @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ disableDefaultFonts will turn off font-face loading of Coral's default fonts. """ disableDefaultFonts: Boolean! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ disableCommenting will disable commenting site-wide. """ disableCommenting: DisableCommenting! """ editCommentWindowLength is the length of time (in seconds) after a comment is posted that it can still be edited by the author. """ editCommentWindowLength: Int! """ charCount stores the character count moderation settings. """ charCount: CharCount! """ organization stores information about the organization behind this specific instance of Coral. """ organization: Organization! """ email is the set of credentials and settings associated with the organization. """ email: EmailConfiguration! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ slack is the configuration for slack communication """ slack: SlackConfiguration! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ wordList will return a given list of words. """ wordList: WordList! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ auth contains all the settings related to authentication and authorization. """ auth: Auth! """ integrations contains all the external integrations that can be enabled. """ integrations: ExternalIntegrations! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ recentCommentHistory is the set of settings related to how automatic pre-moderation is controlled. """ recentCommentHistory: RecentCommentHistoryConfiguration! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ reaction specifies the configuration for reactions. """ reaction: ReactionConfiguration! """ featuredBy specifies whether or not to display 'Featured by' for featured comments """ featuredBy: Boolean """ topCommenter specifies whether or not the feature is enabled to show that commenters with comments featured within the last 10 days are top commenters """ topCommenter: TopCommenterConfiguration """ newCommenter specifies whether or not the feature is enabled to show that commenters are new and have joined within the last seven days. """ newCommenter: NewCommenterConfiguration """ staff specifies the configuration for the user badges assigned to users with any role above COMMENTER """ staff: BadgeConfiguration! @deprecated(reason: "Use badges instead") """ badges specifies the configuration for the user badges assigned to users with any role above COMMENTER. """ badges: BadgeConfiguration! """ accountFeatures stores the configuration for commenter account features. """ accountFeatures: CommenterAccountFeatures! """ stories stores the configuration around stories. """ stories: StoryConfiguration! @auth(roles: [ADMIN]) @cacheControl(maxAge: 0, scope: PRIVATE) """ media is the configuration media content attached to Comment's. """ media: MediaConfiguration! """ featureFlags provides the enabled feature flags. """ featureFlags: [FEATURE_FLAG!]! """ createdAt is the time that the Settings was created at. """ createdAt: Time! @auth(roles: [ADMIN]) @cacheControl(maxAge: 0, scope: PRIVATE) """ newCommenters is the configuration for how new commenters comments are treated. """ newCommenters: NewCommentersConfiguration! @auth(roles: [ADMIN]) @cacheControl(maxAge: 0, scope: PRIVATE) """ premoderateSuspectWords when enabled will cause any comments that contain suspect words to be sent to pre-moderation to be reviewed by a moderator prior to being presented in stream. """ premoderateSuspectWords: Boolean! @auth(roles: [ADMIN]) @cacheControl(maxAge: 0, scope: PRIVATE) """ announcement is the currently active Announcement. """ announcement: Announcement """ multisite is whether multiple sites exist for this tenant. """ multisite: Boolean! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(maxAge: 0, scope: PRIVATE) """ rte is the configuration of the Rich-Text-Editor. """ rte: RTEConfiguration! """ memberBios is whether members can define a bio for their account. """ memberBios: Boolean! """ amp is whether Accelerated Mobile Pages Support is activated. """ amp: Boolean! """ forReviewQueue is whether or not to show the For Review queue in the Moderate tab of the admin. This queue allows moderators to review every flag that has been put on a comment by a user. This feature shall help complying with European Law (European Directive 2000/31/CE). """ forReviewQueue: Boolean! """ emailDomainModeration is for any special configuration by email domain for moderating accounts, such as banning or always pre-moderating new users at a certain email domain """ emailDomainModeration: [EmailDomain!]! """ protectedEmailDomains is the configuration for email domains that are protected from email domain moderation rules such as all accounts banned """ protectedEmailDomains: [String!]! """ disposableEmailDomains is the configuration for whether or not new users registering with a disposable email address should be pre-moderated. """ disposableEmailDomains: DisposableEmailDomainConfiguration """ externalProfileURL is a string template for a link to a user's external profile. """ externalProfileURL: String """ embeddedComments includes the configuration for embedded comments. """ embeddedComments: EmbeddedCommentsConfiguration """ flairBadges specifies the configuration for flair badges, including whether they are enabled and any configured image urls """ flairBadges: FlairBadgeConfiguration """ dsa specifies the configuration for the European Union's DSA compliance features and whether they are enabled. """ dsa: DSAConfiguration! """ premoderateEmailAddress is the configuration for finding specific email addresses at sign up and premoderating them according to various rules. """ premoderateEmailAddress: PremoderateEmailAddressConfiguration """ inPageNotifcations is the configuration for in-page notifications, including whether it's enabled as an option for commenters. """ inPageNotifications: InPageNotificationsConfiguration """ externalNotifications is the configuration for external notifications, including whether it's enabled as an option for commenters. """ externalNotifications: ExternalNotificationsConfiguration """ showUnmoderatedCounts is whether to show the unmoderated comment count in the moderation queues. """ showUnmoderatedCounts: Boolean } ################################################################################ ## User ################################################################################ enum USER_ROLE { COMMENTER MEMBER STAFF MODERATOR ADMIN } type LocalProfile { id: String! } type OIDCProfile { id: String! provider: String! } type SSOProfile { id: String! } type FacebookProfile { id: String! } type GoogleProfile { id: String! } """ Profile is all the different profiles that a given User may have associated with their account. """ union Profile = LocalProfile | OIDCProfile | SSOProfile | FacebookProfile | GoogleProfile """ Token facilitates accessing Coral externally with a token. """ type Token { id: ID! name: String! createdAt: Time! } """ Invite represents a given User that is pending registration that has been invited by an Administrator. """ type Invite { """ id is the identifier for the Invite. """ id: ID! """ email is the email address that will be assigned and used for the invited User. """ email: String! """ role is the USER_ROLE that the User will be assigned upon account creation. """ role: USER_ROLE! """ createdBy is the User that created the Invite. """ createdBy: User! """ createdAt is the time that the Invite was created on. """ createdAt: Time! } """ BanStatusHistory is the list of all ban events against a specific User. """ type BanStatusHistory { """ active when true, indicates that the given user is banned. """ active: Boolean! """ createdBy is the User that suspended the User. If `null`, then the given User was banned by the system. """ createdBy: User """ createdAt is the time that the given User was banned. """ createdAt: Time! """ message is sent to banned user via email. If `null`, then no email was sent (i.e. in the case of a system ban of a new user account). """ message: String """ sites are set when the ban was created to perform a site specific ban. """ sites: [Site!] } """ BanStatus contains information about a ban for a given User. """ type BanStatus { """ active when true, indicates that the given user is banned. """ active: Boolean! """ sites is a list of sites that the user has been site banned on. """ sites: [Site!] """ history is the list of all ban events against a specific User. """ history: [BanStatusHistory!]! @auth(roles: [ADMIN, MODERATOR]) } """ TimeRange represents a range of times. """ type TimeRange { """ start is the time that the time range started on. """ start: Time! """ finish is the time that the time range finished at. """ finish: Time! } """ SuspensionStatusHistory is the list of all suspension events against a specific User. """ type SuspensionStatusHistory { """ active is true when the given suspension status time range applies now. """ active: Boolean! """ from is the time range that the suspension is active for. """ from: TimeRange! """ createdBy is the User that suspended the User. If `null`, the then the given User was suspended by the system. """ createdBy: User """ createdAt is the time that the suspension was created at. """ createdAt: Time! """ modifiedBy is the User that canceled/edited the suspension. If `null`, then the suspension has not been canceled/edited, or has been edited by the system. """ modifiedBy: User """ modifiedAt is the time that the suspension was canceled/edited. If `null`, then the suspension has not been canceled/edited. """ modifiedAt: Time """ message is sent to suspended user via email. """ message: String! } """ SuspensionStatus stores the user suspension status as well as the history of changes. """ type SuspensionStatus { """ active when true, indicates that the given user is suspended. """ active: Boolean! """ until is the time that the current user suspension is over. """ until: Time """ history is the list of all suspension events against a specific User. """ history: [SuspensionStatusHistory!]! @auth(roles: [ADMIN, MODERATOR]) } type WarningStatusHistory { """ active when true, indicates that the given user has been warned but has not acknowledged the warning. """ active: Boolean! """ createdBy is the user that warned the commenter """ createdBy: User! """ createdAt is the time the user was warned """ createdAt: Time! """ acknowledgedAt is the time the commenter acknowledged the warning. if `null` then the warning has not been acknowledged """ acknowledgedAt: Time """ message is the custom message sent to the commenter """ message: String } type WarningStatus { """ active when true, indicates that the given user has been warned but has not acknowledged it. """ active: Boolean! """ message is the current message for the warning on the User. """ message: String """ history will return the status history items for warnings. """ history: [WarningStatusHistory!]! @auth(roles: [ADMIN, MODERATOR]) } type ModMessageStatusHistory { """ active when true, indicates that the given user has been sent a moderation message but has not acknowledged the message. """ active: Boolean! """ createdBy is the user that messaged the commenter """ createdBy: User! """ createdAt is the time the user was messaged """ createdAt: Time! """ acknowledgedAt is the time the commenter acknowledged the message. if `null` then the message has not been acknowledged """ acknowledgedAt: Time """ message is the custom message sent to the commenter """ message: String } type ModMessageStatus { """ active when true, indicates that the given user has been sent a moderation message but has not acknowledged it. """ active: Boolean! """ message is the current message for the moderation message sent to the User. """ message: String """ history will return the status history items for moderation messages. """ history: [ModMessageStatusHistory!]! @auth(roles: [ADMIN, MODERATOR]) } type PremodStatusHistory { """ active when true, indicates that the given user is premodded. """ active: Boolean! """ createdBy is the user that flagged the commenter as pre-mod. If `null`, then the given User was set to pre-mod by the system. """ createdBy: User """ createdAt is the time the user was set to pre-mod """ createdAt: Time! } type PremodStatus { """ active when true, indicates that the given user is set to pre-mod. """ active: Boolean! """ history is the list of all suspension events against a specific User. """ history: [PremodStatusHistory!]! } type UsernameHistory { """ username is the username that was assigned """ username: String! """ createdBy is the user that created this username """ createdBy: User! @auth(roles: [ADMIN, MODERATOR]) """ createdAt is the time the username was created """ createdAt: Time! } type UsernameStatus { """ history is the list of all usernames for this user """ history: [UsernameHistory!]! } enum UserDeletionUpdateType { REQUESTED CANCELED } type UserDeletionHistory { """ updateType is the type of deletion status update that was made. For example, user deletion was requested or canceled. """ updateType: UserDeletionUpdateType! """ createdBy is the user that made the deletion status update. """ createdBy: User """ createdAt is the time the user had a deletion status update. """ createdAt: Time! } type UserDeletionStatus { history: [UserDeletionHistory!]! @auth(roles: [ADMIN, MODERATOR]) } """ UserStatus stores the user status information regarding moderation state. """ type UserStatus { """ current represents the current statuses applied to the User. """ current: [USER_STATUS!]! @auth( userIDField: "userID" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ username stores the history of username changes for this user """ username: UsernameStatus! @auth( userIDField: "userID" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ deletion stores the history of deletion requests and cancellations for the user """ deletion: UserDeletionStatus! @auth( userIDField: "userID" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ banned stores the user banned status as well as the history of changes. """ ban: BanStatus! @auth( userIDField: "userID" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ suspension stores the user suspension status as well as the history of changes. """ suspension: SuspensionStatus! @auth( userIDField: "userID" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ premod stores the user premod status as well as the history of changes. """ premod: PremodStatus! @auth(roles: [ADMIN, MODERATOR]) """ warning stores the user warning status as well as the history of warnings """ warning: WarningStatus! @auth( userIDField: "userID" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ modMessage stores the user moderation message status as well as the history of moderation messages """ modMessage: ModMessageStatus! @auth( userIDField: "userID" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) } enum DSAREPORT_STATUS_FILTER { AWAITING_REVIEW UNDER_REVIEW COMPLETED VOID } enum USER_STATUS_FILTER { """ ACTIVE is used when a User is not suspended or banned. """ ACTIVE """ BANNED is used when a User is banned. """ BANNED """ SUSPENDED is used when a User is currently suspended. """ SUSPENDED """ PREMOD is used when a User is currently set to require pre-moderation. """ PREMOD """ WARNED is used when a user has been warned about behaviour and has not acknowledged """ WARNED """ SITE_BANNED is used when a User is site banned. """ SITE_BANNED } """ USER_STATUS is used to describe the current state of a User. A User may exist in multiple states. """ enum USER_STATUS { """ ACTIVE is used when a User is not suspended or banned. """ ACTIVE """ BANNED is used when a User is banned. """ BANNED """ SUSPENDED is used when a User is currently suspended. """ SUSPENDED """ PREMOD is used when a User is currently set to require pre-moderation. """ PREMOD """ WARNED is used when a user has been warned about behaviour and has not acknowledged """ WARNED } type ModeratorNote { """ id is the identifier of the Note. """ id: ID! """ body is the content of the Note """ body: String! """ createdAt is the date in which the Note was created. """ createdAt: Time! """ createdBy is the Moderator that authored the Note. """ createdBy: User! } enum DIGEST_FREQUENCY { """ NONE will have the notifications send immediately rather than bundling for digesting. """ NONE """ DAILY will queue up the notifications and send them daily. """ DAILY """ HOURLY will queue up the notifications and send them hourly. """ HOURLY } """ UserMediaSettings are the user's preferences around embed stream behaviour. """ type UserMediaSettings { """ unfurlEmbeds is whether the user has chosen to immediately show embed contents without having to click "Show Tweet", "Show GIF", etc. """ unfurlEmbeds: Boolean! } """ UserEmailNotificationSettings stores the email notification settings for a given User. """ type UserEmailNotificationSettings { """ onReply, when true, will enable email notifications to be sent to users that have replies to their comments. """ onReply: Boolean! """ onFeatured, when true, will enable email notifications to be sent to users that have their comment's featured. """ onFeatured: Boolean! """ onStaffReplies when true, will enable email notifications to be sent to users that have a staff member reply to their comments. These notifications will supercede notifications that would have been sent for a basic reply notification. """ onStaffReplies: Boolean! """ onModeration when true, will enable email notifications to be sent to users when a comment that they wrote that was previously unpublished, becomes published due to a moderator action. """ onModeration: Boolean! """ digestFrequency is the frequency to send email notifications. """ digestFrequency: DIGEST_FREQUENCY! } enum InPageNotificationReplyType { """ The user wishes to receive in-page notifications from everyone """ ALL """ The user wishes to receive in-page notifications from staff members only """ STAFF } type OnReplySettings { """ In-page notifications for replies is enabled """ enabled: Boolean! """ This keeps track of what type of reply the user would like to be notified on when in-page reply notifications is enabled """ showReplies: InPageNotificationReplyType! } """ UserInPageNotificationSettings stores the in-page notification settings for a given User. """ type UserInPageNotificationSettings { """ enabled, when true, means the in-page notifications updates with notification count; when disabled, it still appears and can be clicked but shows no indication of updates """ enabled: Boolean! """ onReply, when true, will enable in-page notifications to be sent to users that have replies to their comments. """ onReply: OnReplySettings! """ onFeatured, when true, will enable in-page notifications to be sent to users that have their comment's featured. """ onFeatured: Boolean! """ onModeration when true, will enable in-page notifications to be sent to users when a comment that they wrote that was previously unpublished, becomes published due to a moderator action. """ onModeration: Boolean! } """ UserModerationScopes describes the scopes for moderation. These only apply when the user has a MODERATOR role. """ type UserModerationScopes { """ scoped returns true when the moderator has a scoped moderation role, and cannot moderate organization wide. """ scoped: Boolean! """ sites (when not null) list the sites that the user is only allowed to moderate on. When null, it means that the user is allowed to moderate on all sites. """ sites: [Site!] """ siteIDs (when not null) list the sites that the user is only allowed to moderate on. When null, it means that the user is allowed to moderate on all sites. """ siteIDs: [String!] } """ UserMembershipScopes describes the scopes of membership. These only apply when the user has a MEMBER role. """ type UserMembershipScopes { """ scoped returns true when the user has a scoped membership, and is not a member organization wide. """ scoped: Boolean! """ sites (when not null) list the sites that the user is a member of When null, it means that the user is a member of all sites within the organization. """ sites: [Site!] """ siteIDs (when not null) list the sites that the user is a member of When null, it means that the user is a member of all sites within the organization. """ siteIDs: [String!] } type UserCommentCounts { """ statuses stores the counts of all the statuses against the parent user. """ statuses: CommentStatusCounts! @auth(roles: [ADMIN, MODERATOR]) } """ User is someone that leaves Comments, and logs in. """ type User { """ id is the identifier of the User. """ id: ID! """ username is the name of the User visible to other Users. """ username: String """ avatar is the url to the avatar for a specific User. """ avatar: String """ badges are user display badges """ badges: [String!] """ email is the current email address for the User. """ email: String @auth( roles: [ADMIN, MODERATOR] userIDField: "id" permit: [ MISSING_NAME MISSING_EMAIL SUSPENDED BANNED PENDING_DELETION WARNED ] ) @cacheControl(scope: PRIVATE, maxAge: 0) """ duplicateEmail is set on users that have a matching email with another user in the database. Only relevant during the account completion process. """ duplicateEmail: String @auth( userIDField: "id" permit: [ MISSING_NAME MISSING_EMAIL SUSPENDED BANNED PENDING_DELETION WARNED ] ) @cacheControl(scope: PRIVATE, maxAge: 0) """ emailVerified when true indicates that the given email address has been verified. """ emailVerified: Boolean @auth( roles: [ADMIN, MODERATOR] userIDField: "id" permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ profiles is the array of profiles assigned to the user. """ profiles: [Profile!]! @auth( roles: [ADMIN, MODERATOR] userIDField: "id" permit: [ MISSING_NAME MISSING_EMAIL SUSPENDED BANNED PENDING_DELETION WARNED ] ) @cacheControl(scope: PRIVATE, maxAge: 0) """ role is the current role of the User. """ role: USER_ROLE! @auth( roles: [ADMIN, MODERATOR] userIDField: "id" permit: [ MISSING_NAME MISSING_EMAIL SUSPENDED BANNED PENDING_DELETION WARNED ] ) """ moderatorNotes are notes left by moderators about the User. """ moderatorNotes: [ModeratorNote!]! @auth(roles: [ADMIN, MODERATOR]) """ ignoreable is a computed property based on the user's role. Typically, users with elevated privileges aren't allowed to be ignored. """ ignoreable: Boolean! """ comments are the comments written by the User. """ comments( first: Int = 10 @constraint(max: 50) orderBy: COMMENT_SORT = CREATED_AT_DESC after: Cursor ): CommentsConnection! @auth( userIDField: "id" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ allComments are comments regardless of visibility status. """ allComments( first: Int = 10 @constraint(max: 50) after: Cursor ): CommentsConnection! @auth(roles: [ADMIN, MODERATOR]) """ rejectedComments are comments that have been rejected. """ rejectedComments( first: Int = 10 @constraint(max: 50) after: Cursor ): CommentsConnection! @auth(roles: [ADMIN, MODERATOR]) """ ongoingDiscussions are stories where the given user has written comments in sorted by their last comment date. """ ongoingDiscussions(limit: Int = 5 @constraint(max: 5)): [Story!]! @auth( userIDField: "id" permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ recentCommentHistory returns recent commenting history by the User. """ recentCommentHistory: RecentCommentHistory! @auth(roles: [ADMIN, MODERATOR]) """ commentModerationActionHistory returns a CommentModerationActionConnection that this User has created. """ commentModerationActionHistory( first: Int = 10 @constraint(max: 50) after: Cursor ): CommentModerationActionConnection! @auth(roles: [MODERATOR, ADMIN]) """ status stores the user status information regarding moderation state. """ status: UserStatus! @auth( userIDField: "id" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ tokens lists the access tokens associated with the account. """ tokens: [Token!]! @auth( userIDField: "id" roles: [ADMIN] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ ignoredUsers will return the list of ignored users. """ ignoredUsers: [User!]! @auth( userIDField: "id" permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ notifications stores the email notification settings for the given User. """ notifications: UserEmailNotificationSettings! @auth( userIDField: "id" roles: [ADMIN] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ inPageNotifications stores the in-page notification settings for the given User. """ inPageNotifications: UserInPageNotificationSettings! @auth( userIDField: "id" roles: [ADMIN] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ createdAt is the time that the User was created at. """ createdAt: Time! """ lastDownloadedAt the last time the user made a download request of their account data. """ lastDownloadedAt: Time @auth( userIDField: "id" permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ scheduledDeletionDate is the time when the User is scheduled to be deleted. """ scheduledDeletionDate: Time @auth( userIDField: "id" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ deletedAt is the time when the User was deleted. """ deletedAt: Time @auth( userIDField: "id" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ moderationScopes describes the scopes for moderation. These only apply when the user has a MODERATOR role. """ moderationScopes: UserModerationScopes @auth( userIDField: "id" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ membershiptScopes describes the scopes for membership. These only apply when the user has a MEMBER role. """ membershipScopes: UserMembershipScopes """ ssoURL is the url for managing sso account """ ssoURL: String @auth( userIDField: "id" permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ mediaSettings are the user's preferences around media stream behaviour. """ mediaSettings: UserMediaSettings! @auth( userIDField: "id" permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ bio is a user-defined biography. """ bio: String """ premoderatedBecauseOfEmailAt is set when a user was set to pre-moderated comments for having an email that was caught by the email pre-moderation filter. """ premoderatedBecauseOfEmailAt: Time @auth(roles: [MODERATOR, ADMIN]) """ hasNewNotifications returns true if the user has received new notifications since they last viewed their notifications tab. """ hasNewNotifications: Boolean! @auth( userIDField: "id" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ lastSeenNotificationDate is the date of the last notification the user viewed. """ lastSeenNotificationDate: Time @auth( userIDField: "id" roles: [ADMIN, MODERATOR] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ lastFeaturedDate is when a user last had a comment featured. This is used for the Top commenter badge feature. """ lastFeaturedDate: Time """ featuredCommenter is whether a user has had a comment featured within the last 10 days or not """ featuredCommenter: Boolean """ newCommenter is whether a user has joined within the last seven days. """ newCommenter: Boolean """ commentCounts are the tallies for various comment status for this user. """ commentCounts: UserCommentCounts } """ UserEdge represents a unique User in a UsersConnection. """ type UserEdge { """ node is the User for this edge. """ node: User! """ cursor is used in pagination. """ cursor: Cursor! } """ UsersConnection represents a subset of a stories list. """ type UsersConnection { """ edges are a subset of UserEdge's. """ edges: [UserEdge!]! """ nodes is a list of User's. """ nodes: [User!]! """ pageInfo is information to aid in pagination. """ pageInfo: PageInfo! } """ SiteEdge represents a unique Site in a SitesConnection. """ type SiteEdge { """ node is the Site for this edge. """ node: Site! """ cursor is used in pagination. """ cursor: Cursor! } """ UsersConnection represents a subset of a stories list. """ type SitesConnection { """ edges are a subset of SiteEdge's. """ edges: [SiteEdge!]! """ nodes is a list of Site's. """ nodes: [Site!]! """ pageInfo is information to aid in pagination. """ pageInfo: PageInfo! } """ DSAReportEdge represents a unique DSAReport in a DSAReportConnection. """ type DSAReportEdge { """ node is the DSAReport for this edge. """ node: DSAReport! """ cursor is used in pagination. """ cursor: Cursor! } """ DSAReportsConnection represents a subset of a DSA reports list. """ type DSAReportsConnection { """ edges are a subset of DSAReportEdge's. """ edges: [DSAReportEdge!]! """ nodes is a list of DSAReports. """ nodes: [DSAReport!]! """ pageInfo is information to aid in pagination. """ pageInfo: PageInfo! } ################################################################################ ## Comment ################################################################################ type EditInfo { """ edited will be True when the Comment has been edited in the past. """ edited: Boolean! """ editableUntil is the time that the comment is editable until. This will return null if the current viewer is not the author of the Comment. """ editableUntil: Time } enum COMMENT_STATUS { """ The comment is not PREMOD, but was not applied a moderation status by a moderator. """ NONE """ The comment has been approved by a moderator. """ APPROVED """ The comment has been rejected by a moderator. """ REJECTED """ The comment was created while the stories premoderation option was on, and new comments that haven't been moderated yet are referred to as "premoderated" or "premod" comments. """ PREMOD """ SYSTEM_WITHHELD represents a comment that was withheld by the system because it was flagged by an internal process for further review. """ SYSTEM_WITHHELD } enum REJECTION_REASON_CODE { """ OFFENSIVE represents a rejection of a comment for being offensive. """ OFFENSIVE """ ABUSIVE represents a rejection of a comment for being abusive. """ ABUSIVE """ SPAM represents a rejection of a comment for being spam. """ SPAM """ BANNED_WORD represents a rejection of a comment for containing a banned word. """ BANNED_WORD """ AD represents a rejection of a comment for being and ad. """ AD """ ILLEGAL_CONTENT represents a rejection of a comment for containing illegal content. """ ILLEGAL_CONTENT """ HARASSMENT_BULLYING represents a rejection of a comment for being harassment or bullying. """ HARASSMENT_BULLYING """ MISINFORMATION represents a rejection of a comment for being misinformation. """ MISINFORMATION """ HATE_SPEECH represents a rejection of a comment for being hate speech. """ HATE_SPEECH """ IRRELEVANT_CONTENT represents a rejection of a comment for being irrelevant to the conversation. """ IRRELEVANT_CONTENT """ OTHER is reserved for reasons that arent adequately described by the other options. """ OTHER } type RejectionReason { """ code is the reason that the comment was rejected """ code: REJECTION_REASON_CODE! """ legalGrounds is the specific laws broken as described by the reporter """ legalGrounds: String """ detailedExplanation is any additional information the user wishes to provide. """ detailedExplanation: String """ customReason is a reason provided for rejection when the Other rejection code is selected. """ customReason: String } type CommentModerationAction { id: ID! """ revision is the moderated CommentRevision. """ revision: CommentRevision """ comment is the moderated Comment. """ comment: Comment """ status represents the status that was assigned by the moderator. """ status: COMMENT_STATUS! """ moderator is the User that performed the Moderator action. If null, this means that the system has assigned the moderation status. """ moderator: User """ reason is the reason the comment was rejected, if it was rejected """ rejectionReason: RejectionReason """ createdAt is the time that the CommentModerationAction was created. """ createdAt: Time! """ customReason is a reason provided for rejection when the Other rejection code is selected. """ customReason: String } type CommentModerationActionEdge { """ node is the CommentModerationAction for this edge. """ node: CommentModerationAction! """ cursor is used in pagination. """ cursor: Cursor! } type CommentModerationActionConnection { """ edges are a subset of CommentModerationActionEdge's. """ edges: [CommentModerationActionEdge!]! """ nodes is a list of CommentModerationAction's. """ nodes: [CommentModerationAction!]! """ pageInfo is information to aid in pagination. """ pageInfo: PageInfo! } """ DSAReportStatus keeps track of where a DSAReport is in the process of being reviewed """ enum DSAReportStatus { AWAITING_REVIEW UNDER_REVIEW COMPLETED """ VOID is set for a DSAReport if its reported comment/user are deleted while the report is in review """ VOID } """ DSAReportDecision keeps track of whether a DSAReport was determined illegal or not """ enum DSAReportDecisionLegality { LEGAL ILLEGAL } enum DSAReportHistoryType { STATUS_CHANGED NOTE DECISION_MADE SHARE } type DSAReportDecision { legality: DSAReportDecisionLegality! legalGrounds: String detailedExplanation: String } type DSAReportHistoryItem { id: ID! """ type is the kind of DSA report history item this is """ type: DSAReportHistoryType """ createdAt is when this report history item was created """ createdAt: Time! """ createdBy is the user who added this report history item """ createdBy: User """ decision is included if the report history item is making a decision """ decision: DSAReportDecision """ note is included as an explanation for a report history item decision """ note: String """ status is the new status if the report history item type changes the status """ status: DSAReportStatus """ body is the text added if the report history item decision is a note added """ body: String } type DSAReport { id: ID! """ referenceID is a human-friendly ID to keep track of the DSAReport """ referenceID: String! """ submissionID keeps track of comments that were submitted together in one form """ submissionID: String! """ user who submitted the DSAReport """ reporter: User """ comment reported as containing illegal content """ comment: Comment """ createdAt is when the DSAReport was created """ createdAt: Time! """ status of DSAReport """ status: DSAReportStatus """ lawBrokenDescription is the text entered by the submitting user to describe which law is broken by the reported comment """ lawBrokenDescription: String! """ additionalInformation is more explanation entereted by the submitting user to describe how the comment breaks the law """ additionalInformation: String! """ decision is the determination of whether the reported comment is illegal or not, as well as the legal grounds for the decision and additional detailed explanation of decision """ decision: DSAReportDecision """ history includes report history items such as notes added to a report, when a report's status is changed, and if a decision is made regarding whether the related comment contains illegal content or not """ history: [DSAReportHistoryItem] """ lastUpdated is when the DSAReport last had an action created and added to its history, such as a note added, status changed, or decision made """ lastUpdated: Time """ relatedReports are DSAReports that share a submissionID and were submitted at the same time in one illegal content report """ relatedReports( first: Int = 10 @constraint(max: 50) orderBy: REPORT_SORT = CREATED_AT_DESC after: Cursor ): DSAReportsConnection! } type CommentRevisionPerspectiveMetadata { """ score is the value detected from the perspective API. This is returned as the percentage chance it would be considered toxic and can be compared to the defined threshold value. """ score: Float! } type WordlistMatch { """ value is the value detected by the word list pipeline. """ value: String! """ index is the starting index of the word occurence in the comment body. """ index: Int! """ length is the length of the value string. """ length: Int! } type CommentRevisionWordListMetadata { """ timedOut is whether the wordlist analysis timed out when this revision of the comment was sent through the moderation phases. """ timedOut: Boolean """ suspectWords are any suspect words that were matched and found on this comment revision. """ suspectWords: [WordlistMatch!] """ bannedWords are any banned words that were matched and found on this comment revision. """ bannedWords: [WordlistMatch!] } type ExternalModerationPhaseAction { reason: COMMENT_FLAG_REASON } type ExternalModerationPhaseResult { status: COMMENT_STATUS tags: [TAG!] actions: [ExternalModerationPhaseAction!] } type CommentRevisionExternalModerationPhaseMetadata { name: String! analyzedAt: Time! result: ExternalModerationPhaseResult! } type CommentRevisionMetadata { """ perspective stores metadata associated with the pipeline analysis of this revision's body. """ perspective: CommentRevisionPerspectiveMetadata """ wordList metadata stores extra status details about what occurred during word list analysis of this comment revision. """ wordList: CommentRevisionWordListMetadata """ externalModeration are the phases and their actions that were used to analyze this comment revision. """ externalModeration: [CommentRevisionExternalModerationPhaseMetadata!] } """ TenorMedia is a particular GIF that is provided by the Tenor platform. """ type TenorMedia { """ url is the URL to a image of the GIF. """ url: String! """ title is the title of the GIF. """ title: String """ still is a thumbnail preview of the GIF. """ still: String """ video is a URL to the mp4 video of the GIF. """ video: String """ width is the width of the GIF in pixels. """ width: Int """ height is the height of the GIF in pixels. """ height: Int } """ KlipyMedia is a particular GIF that is provided by the Klipy platform. """ type KlipyMedia { """ url is the URL to a image of the GIF. """ url: String! """ title is the title of the GIF. """ title: String """ width is the width of the GIF in pixels. """ width: Int """ height is the height of the GIF in pixels. """ height: Int """ still is a thumbnail preview of the GIF. """ still: String """ video is a URL to the mp4 video of the GIF. """ video: String } """ GiphyMedia is a particular GIF that is provided by the Giphy platform. """ type GiphyMedia { """ url is the URL to a image of the GIF. """ url: String! """ original is the URL to a image of the GIF. """ original: String! """ still is a thumbnail preview of the GIF. """ still: String! """ video is a URL to the mp4 video of the GIF. """ video: String! """ width is the width of the GIF in pixels. """ width: Int """ height is the height of the GIF in pixels. """ height: Int """ title is the title of the GIF. """ title: String } """ TwitterMedia is a specific Twitter Tweet. """ type TwitterMedia { """ url is the URL of a Twitter tweet. """ url: String! """ width is the width of the Twitter tweet in pixels. """ width: Int } """ BlueskyMedia is a specific Bluesky Tweet. """ type BlueskyMedia { """ url is the URL of a Bluesky tweet. """ url: String! """ width is the width of the Bluesky tweet in pixels. """ width: Int } """ YouTubeMedia is a specific YouTube video. """ type YouTubeMedia { """ url is the URL of a YouTube video. """ url: String! """ still is the thumbnail of the YouTube video. """ still: String! """ title is the title of the YouTube video. """ title: String """ width is the width of the YouTube video in pixels. """ width: Int """ height is the height of the YouTube video in pixels. """ height: Int } type ExternalMedia { """ url is the URL of a YouTube video. """ url: String! """ extension is the file extension """ extension: String! """ width is the width of the YouTube video in pixels. """ width: Int """ height is the height of the YouTube video in pixels. """ height: Int } """ CommentMedia is the various media types that can be attached to a Comment. """ union CommentMedia = GiphyMedia | TwitterMedia | YouTubeMedia | ExternalMedia | TenorMedia | KlipyMedia | BlueskyMedia type CommentRevision { """ id is the identifier of the CommentRevision. """ id: ID! """ comment is the reference to the original Comment associated with the current Comment. """ comment: Comment! """ actionCounts stores the counts of all the actions for the CommentRevision specifically. """ actionCounts: ActionCounts! @auth(roles: [MODERATOR, ADMIN]) """ body is the content of the CommentRevision. If null, it indicates that the body text was deleted. """ body: String """ media is the optional media object attached to this revision. """ media: CommentMedia """ metadata stores details on a CommentRevision. """ metadata: CommentRevisionMetadata! @auth(roles: [ADMIN, MODERATOR]) """ createdAt is the time that the CommentRevision was created. """ createdAt: Time! """ status is the status of the CommentRevision. """ status: COMMENT_STATUS } enum TAG { """ STAFF is used when a Comment is written by a User that has the STAFF, ADMIN, or MODERATOR role. """ STAFF """ ADMIN is used when a Comment is written by a User that has the ADMIN, role. """ ADMIN """ MODERATOR is used when a Comment is written by a User that has the MODERATOR, role. """ MODERATOR """ MEMBER is used when a Comment is written by a User that has the Member role. """ MEMBER """ FEATURED is used when a Comment is marked as such by a staff member. """ FEATURED """ EXPERT is used when an a Comment is written by a User that is assigned as an expert on a story. """ EXPERT """ UNANSWERED is used when a Comment is written by a user and has not been answered by an expert on a Story that is set to Q&A. """ UNANSWERED """ REVIEW is used when a Comment is written with a rating on a Story that is set to Ratings and Reviews. """ REVIEW """ QUESTION is used when a Comment is written without a rating on a Story that is set to Ratings and Reviews. """ QUESTION } """ Tag is a simple text message that can be displayed to segment tagable entities. """ type Tag { """ code is the machine representation of the tag name. """ code: TAG! """ createdBy is the User that assigned the Tag. This is null when the Tag is assigned by the System. """ createdBy: User """ createdAt is the time that the Tag was assigned on. """ createdAt: Time! @auth(roles: [MODERATOR, ADMIN]) } """ CommentTagCounts provides count data for Tags made against Comment's. """ type CommentTagCounts { """ ADMIN is the count of Comment's with the ADMIN tag. """ ADMIN: Int! """ EXPERT is the count of Comment's with the EXPERT tag. """ EXPERT: Int! """ FEATURED is the count of Comment's with the FEATURED tag. """ FEATURED: Int! """ MEMBER is the count of Comment's with the MEMBER tag. """ MEMBER: Int! """ MODERATOR is the count of Comment's with the MODERATOR tag. """ MODERATOR: Int! """ QUESTION is the count of Comment's with the QUESTION tag. """ QUESTION: Int! """ REVIEW is the count of Comment's with the REVIEW tag. """ REVIEW: Int! """ STAFF is the count of Comment's with the STAFF tag. """ STAFF: Int! """ UNANSWERED is the count of Comment's with the UNANSWERED tag. """ UNANSWERED: Int! } """ Comment is a comment left by a [User](/api/types/objects/User) on an [Story](/api/types/objects/Story) or another [Comment](/api/types/objects/Comment) as a reply. """ type Comment @cacheControl(maxAge: 5) { """ id is the identifier of the [Comment](/api/types/objects/Comment). """ id: ID! """ body is the content of the [Comment](/api/types/objects/Comment), and is an alias to the body of the `revision.body`. """ body: String """ revision is the current revision of the [Comment](/api/types/objects/Comment)'s body. """ revision: CommentRevision """ revisionHistory stores the previous [CommentRevision](/api/types/objects/comment-revision)'s, with the most recent edit last. """ revisionHistory: [CommentRevision!]! @auth( userIDField: "author_id" roles: [MODERATOR, ADMIN] permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED] ) """ createdAt is the date in which the Comment was created. """ createdAt: Time! """ author is the User that authored the Comment. """ author: User """ status represents the Comment's current status. """ status: COMMENT_STATUS! """ initialStatus represents the Comment's status when it was initially created. """ initialStatus: COMMENT_STATUS """ statusHistory returns a CommentModerationActionConnection that will list the history of moderator actions performed on the Comment, with the most recent last. """ statusHistory( first: Int = 10 @constraint(max: 50) after: Cursor ): CommentModerationActionConnection! @auth(roles: [MODERATOR, ADMIN]) """ parentCount is the number of direct parents for this Comment. Currently this value is the same as depth. """ parentCount: Int! """ allChildComments is a CommentsConnection that includes all comments that are children of a comment (i.e. that have the comment included in their ancestorIDs) """ allChildComments( first: Int = 10 orderBy: COMMENT_SORT = CREATED_AT_DESC ): CommentsConnection! """ ancestorIDs """ ancestorIDs: [String]! """ depth is the number of levels that a given comment is deep. """ depth: Int! """ replyCount is the number of replies. Only direct replies to this Comment are counted. Removed comments are included in this count. """ replyCount: Int! """ replies will return the replies to this Comment. """ replies( first: Int = 10 orderBy: COMMENT_SORT = CREATED_AT_DESC after: Cursor flatten: Boolean refreshStream: Boolean ): CommentsConnection! """ parent is the immediate parent of a given comment. """ parent: Comment """ rootParent is the highest level parent Comment. This Comment would have been left on the Story itself. """ rootParent: Comment """ parents returns a CommentsConnection that allows accessing direct parents of the given Comment. """ parents(last: Int = 1, before: Cursor): CommentsConnection! """ editing returns details about the edit status of a Comment. """ editing: EditInfo! """ actionCounts stores the counts of all the actions for the Comment. """ actionCounts: ActionCounts! """ reactions is the actual Flags that were left by the Users or the system. """ reactions( first: Int = 10 @constraint(max: 50) after: Cursor ): ReactionsConnection! @auth(permit: [PENDING_DELETION]) """ flags is the actual Flags that were left by the Users or the system. """ flags(first: Int = 10 @constraint(max: 50), after: Cursor): FlagsConnection! @auth(roles: [ADMIN, MODERATOR]) """ illegalContent is the illegal content flags left by users. """ illegalContent( first: Int = 10 @constraint(max: 50) after: Cursor ): FlagsConnection! @auth(roles: [ADMIN, MODERATOR]) """ viewerActionPresence stores the presence information for all the actions left by the current User on this Comment. """ viewerActionPresence: ActionPresence """ story is the Story that the Comment was written on. """ story: Story! """ The permalink for this comment. """ permalink: String! """ tags are the list of tags assigned to the Comment. """ tags: [Tag!]! """ deleted is whether the comment has been deleted. """ deleted: Boolean """ canModerate returns true if the current user can moderate this Comment. """ canModerate: Boolean! """ canReply returns true if the comment is able to be responded to. """ canReply: Boolean! """ site is the Site referenced by the Story for this Comment. """ site: Site! """ rating is the optional rating that is attached to the Comment. """ rating: Int """ seen determines whether a comment has been seen by the user already. """ seen: Boolean """ embeddedAt is the date at which the comment was first embedded. """ embeddedAt: Time } type PageInfo { """ Indicates that there are more nodes after this subset. """ hasNextPage: Boolean! """ Included for legacy Relay reasons. Always set to false. """ hasPreviousPage: Boolean! """ Included for legacy Relay reasons. Always set to null. """ startCursor: Cursor """ Specifies the last node's cursor for forwards pagination. """ endCursor: Cursor } """ CommentEdge represents a unique Comment in a CommentsConnection. """ type CommentEdge { """ node is the Comment for this edge. """ node: Comment! """ cursor is used in pagination. """ cursor: Cursor! } """ CommentsConnection represents a subset of a comment list. """ type CommentsConnection { """ edges are a subset of CommentEdge's. """ edges: [CommentEdge!]! """ nodes is a list of Comment's. """ nodes: [Comment!]! """ pageInfo is information to aid in pagination. """ pageInfo: PageInfo! } ################################################################################ ## CommentCounts ################################################################################ type CommentStatusCounts { """ The comment is not PREMOD, but was not applied a moderation status by a moderator. """ NONE: Int! """ The comment has been approved by a moderator. """ APPROVED: Int! """ The comment has been rejected by a moderator. """ REJECTED: Int! """ The comment was created while the stories premoderation option was on, and new comments that haven't been moderated yet are referred to as "premoderated" or "premod" comments. """ PREMOD: Int! """ SYSTEM_WITHHELD represents a comment that was withheld by the system because it was flagged by an internal process for further review. """ SYSTEM_WITHHELD: Int! } type CommentCounts { """ totalPublished will return the count of all published Comments. """ totalPublished: Int! """ tags stores the counts of all the Tags against Comment's on this Story. """ tags: CommentTagCounts! """ statuses stores the counts of all the statuses against Comments on this Story. """ statuses: CommentStatusCounts! @auth(roles: [ADMIN, MODERATOR]) } ################################################################################ ## Story ################################################################################ enum COMMENT_SORT { CREATED_AT_DESC CREATED_AT_ASC REPLIES_DESC REACTION_DESC } enum REPORT_SORT { CREATED_AT_DESC CREATED_AT_ASC } """ StoryMetadata stores all the metadata that is scraped using the scraping tools inside Coral. Coral utilizes [metascraper](https://metascraper.js.org/) which uses a variety of filters derived from [The Open Graph Protocol](https://ogp.me/) to scan for metadata on the page. """ type StoryMetadata { """ title stores the scraped title from the Story page. """ title: String """ author stores the scraped author from the Story page. """ author: String """ description stores the scraped description from the Story page. """ description: String """ image stores the scraped image from the Story page. """ image: String """ publishedAt stores the scraped publication date from the Story page. """ publishedAt: Time """ modifiedAt stores the scraped modified date from the Story page. """ modifiedAt: Time """ section stores the scraped section from the Story page. """ section: String } """ LiveConfiguration provides configuration options related to live updates. """ type LiveConfiguration { """ configurable when false indicates that live updates cannot be modified. """ configurable: Boolean! @auth(roles: [ADMIN, MODERATOR]) """ enabled when true will allow live updates. """ enabled: Boolean! } type StorySettings { """ live provides configuration options related to live updates on this Story. """ live: LiveConfiguration! """ moderation determines whether or not this is a PRE or POST moderated story. """ moderation: MODERATION_MODE! """ premodLinksEnable will put all comments that contain links into premod. """ premodLinksEnable: Boolean! """ messageBox stores settings related to the Story Message Box. """ messageBox: StoryMessageBox! """ mode is the specified mode that the story should be updated with. """ mode: STORY_MODE! """ experts are used during Q&A mode to assign users to answer questions on a Q&A stream. It is an optional parameter and is only used when the story stream is in Q&A mode. """ experts: [User!]! } """ STORY_STATUS represents filtering states that a Story can be in. """ enum STORY_STATUS { """ OPEN represents when a given Story is open for commenting. """ OPEN """ CLOSED represents when a given Story is not open for commenting. """ CLOSED } type StoryRatings { """ average refers to the average rating across all ratings for the Story from published comments. """ average: Float! """ count refers to the number of ratings that have been submitted that contributes to the `average`. """ count: Int! } """ Story is an Article or Page where Comments are written on by Users. """ type Story @cacheControl(maxAge: 30) { """ id is the identifier of the Story. """ id: ID! """ status is the status of the Story. """ status: STORY_STATUS! """ url is the url that the Story is located on. """ url: String! """ metadata stores the scraped metadata from the Story page. """ metadata: StoryMetadata """ scrapedAt is the Time that the Story had it's metadata scraped at. If the time is null, the Story has not been scraped yet. """ scrapedAt: Time @auth(roles: [ADMIN, MODERATOR]) """ featuredComments are the Comments with the FEATURED tag on the Story. """ featuredComments( first: Int = 10 @constraint(max: 50) orderBy: COMMENT_SORT = CREATED_AT_DESC after: Cursor ): CommentsConnection! """ comments are the comments on the Story. """ comments( first: Int = 20 @constraint(max: 99999) orderBy: COMMENT_SORT = CREATED_AT_DESC after: Cursor refreshStream: Boolean """ rating allows filtering for comments with a specific rating. If this feature has not been enabled on this tenant or story, this option has no effect. """ rating: Int @constraint(min: 1, max: 5) """ This is a workaround to allow filtering for current Q&A functionality. This is used to filter on UNANSWERED to populate its corresponding Unanswered questions tab. In the future, we want a dedicated edge for unansweredComments. """ tag: TAG ): CommentsConnection! """ commentActionCounts stores the counts of all the actions against this Story and it's Comments. """ commentActionCounts: ActionCounts! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(scope: PRIVATE, maxAge: 0) """ moderationQueues returns the set of ModerationQueues that are available for this Story. """ moderationQueues: ModerationQueues! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(scope: PRIVATE, maxAge: 0) """ closedAt is the Time that the Story is closed for commenting. If null or in the future, the story is not yet closed. """ closedAt: Time """ isClosed returns true when the Story is currently closed for commenting. """ isClosed: Boolean! """ isArchiving returns true when the Story is currently in the process of being archived. A story must always be closed (isClosed: true) when it is archiving. """ isArchiving: Boolean! """ isArchived returns true when the Story is current archived. A story must always be closed (isClosed: true) when it is archived. """ isArchived: Boolean! """ isUnarchiving returns true when a story is in-between being unarchived and is yet to be fully unarchived. """ isUnarchiving: Boolean! """ commentCounts stores all the counts of Comments that are left on the Comment. """ commentCounts: CommentCounts! """ createdAt is the date that the Story was created at. """ createdAt: Time! """ settings is the set of Settings on a Story that inherit from the global settings. """ settings: StorySettings! """ lastCommentedAt is the last time someone commented on this story. """ lastCommentedAt: Time @auth(roles: [ADMIN]) @cacheControl(scope: PRIVATE, maxAge: 0) """ canModerate returns true if the current user can moderate comments on this Story. """ canModerate: Boolean! """ site is the site associated with the story """ site: Site! """ viewerCount is the number of viewers active on this Story. """ viewerCount: Int """ ratings is information about ratings that is attached to this story by published comments. """ ratings: StoryRatings """ viewerRating is the Comment with a rating that the viewer has already added to this story. """ viewerRating: Comment """ cached returns whether a story's stream is currently cached in redis or not. """ cached: Boolean } """ StoryEdge represents a unique Story in a StoriesConnection. """ type StoryEdge { """ node is the Story for this edge. """ node: Story! """ cursor is used in pagination. """ cursor: Cursor! } """ StoriesConnection represents a subset of a stories list. """ type StoriesConnection { """ edges are a subset of StoryEdge's. """ edges: [StoryEdge!]! """ nodes is a list of Story's. """ nodes: [Story!]! """ pageInfo is information to aid in pagination. """ pageInfo: PageInfo! } ################################################################################ ## Queue ################################################################################ type QueueCounts { """ waiting is the number of jobs that are in line to be processed. """ waiting: Int! """ active is the number of jobs that are being actively processed. """ active: Int! """ delayed is the number of jobs that have been delayed due to a failure and are waiting for a backoff. """ delayed: Int! } type Queue { """ counts is the current counts associated with the Queue. """ counts: QueueCounts! } type Queues { """ mailer is the Queue associated with the Mailer queue. """ mailer: Queue! """ scraper is the Queue associated with the Scraper queue. """ scraper: Queue! """ notifier is the Queue associated with the Notifier queue. """ notifier: Queue! """ webhook is the Queue associated with the Webhook queue. """ webhook: Queue! """ rejector is the Queue associated with the Rejector queue. """ rejector: Queue! """ unarchiver is the Queue associated with unarchiving stories. """ unarchiver: Queue! } ################################################################################ ## Notifications ################################################################################ enum NOTIFICATION_TYPE { UNKNOWN COMMENT_FEATURED COMMENT_APPROVED COMMENT_REJECTED ILLEGAL_REJECTED DSA_REPORT_DECISION_MADE REPLY REPLY_STAFF PREVIOUSLY_REJECTED_COMMENT_APPROVED } type Notification { """ id is the uuid identifier for the notification. """ id: ID! """ ownerID is the string identifier for who this notification is directed to. """ ownerID: ID! """ type defines the template type for this notification used to generate it. Useful for sorting and filtering categorized notifications. """ type: NOTIFICATION_TYPE """ createdAt is when this notification was created, used for sorting. """ createdAt: Time! """ comment is the optional comment that is linked to this notification. """ comment: Comment """ commentReply is the optional comment reply that is linked to this notification. """ commentReply: Comment """ commentStatus is the optional status of the comment when the notification was created. This allows for the context of the state of the comment to be persisted even if the comment reference undergoes multiple moderation actions since the notification was created. """ commentStatus: COMMENT_STATUS """ previousStatus is the optional prior status of the comment when the notification was created. This allows us to determine if a comment was previously pending review, or reported to compare against the current status (rejected, approved, etc). """ previousStatus: COMMENT_STATUS """ rejectionReason is an optional field that defines why a comment was rejected. """ rejectionReason: REJECTION_REASON_CODE """ decisionDetails is an optional field that contains further details pertaining to DSA or moderation decisions. """ decisionDetails: NotificationDecisionDetails """ customReason is a reason provided for rejection when the Other rejection code is selected. """ customReason: String """ dsaReport is the details of the DSA Report related to the notification. This is usually in reference to the comment that is also related to the notification. """ dsaReport: NotificationDSAReportDetails } type NotificationEdge { """ node is the Flag for this edge. """ node: Notification! """ cursor is used in pagination. """ cursor: Cursor! } type NotificationsConnection { """ edges are a subset of FlagEdge's. """ edges: [NotificationEdge!]! """ nodes is a list of Flags. """ nodes: [Notification!]! """ pageInfo is information to aid in pagination. """ pageInfo: PageInfo! } type NotificationDSAReportDetails { """ id is the primary identifier of the DSA report. """ id: ID! """ createdAt is the date when this report was created """ createdAt: Time! """ referenceID is the friendly identifier that is human readable for the DSA report. """ referenceID: String! """ comment is the comment associated with the DSA report. """ comment: Comment """ user is the target user (of the comment) the DSA report pertains to. """ user: User """ lawBrokenDescription describes the law that was allegedly broken in the DSA report. """ lawBrokenDescription: String @auth(roles: [ADMIN, MODERATOR]) """ additionalInformation is any further relevant details added by the user who filed the DSA report. """ additionalInformation: String @auth(roles: [ADMIN, MODERATOR]) """ submissionID is the linking id that connects this DSA report to other reports that may have been submitted at the same time by the same reporting user as a collection of co-related DSA reports. """ submissionID: ID @auth(roles: [ADMIN, MODERATOR]) } type NotificationDecisionDetails { """ legality defines whether the rejection reason is of legal or illegal state. """ legality: DSAReportDecisionLegality """ grounds is the legal grounds for which the rejection may have been made. """ grounds: String """ explanation gives further context to the reasons for rejection. """ explanation: String } type PersistedQuery { id: String! operation: String! operationName: String! query: String! bundle: String! version: String! } ################################################################################ ## Query ################################################################################ type Query { """ comment returns a specific comment. """ comment(id: ID!): Comment """ comments returns a filtered comments connection that can be paginated. This is a fairly expensive edge to filter against, moderation queues should utilize the dedicated edges for more optimized responses. """ comments( first: Int = 10 @constraint(max: 50) after: Cursor storyID: ID siteID: ID status: COMMENT_STATUS section: SectionFilter tag: TAG query: String orderBy: COMMENT_SORT = CREATED_AT_DESC ): CommentsConnection! @auth(roles: [ADMIN, MODERATOR]) """ story is a specific article that can be identified by either an ID or a URL. """ story(id: ID, url: String): Story """ stream will load a specific story that can be identified by either an ID or a URL and will create the story if that feature is enabled. """ stream(id: ID, url: String, mode: STORY_MODE): Story """ stories returns filtered stories that can be paginated. """ stories( first: Int = 10 @constraint(max: 50) after: Cursor status: STORY_STATUS query: String siteIDs: [ID!] ): StoriesConnection! @auth(roles: [ADMIN, MODERATOR]) """ user will return the user referenced by their ID. TODO: evaluate adding a profile based lookup. """ user(id: ID!): User @auth(roles: [ADMIN, MODERATOR]) """ users returns filtered users that can be paginated. TODO: evaluate adding status based filtering. """ users( first: Int = 10 @constraint(max: 50) after: Cursor role: USER_ROLE query: String status: USER_STATUS_FILTER ): UsersConnection! @auth(roles: [ADMIN, MODERATOR]) site(id: ID!): Site @auth(roles: [ADMIN, MODERATOR]) sites( first: Int = 10 @constraint(max: 50) after: Cursor query: String ): SitesConnection! @auth(roles: [ADMIN, MODERATOR]) """ viewer is the current logged in User. If no user is currently logged in, it will return null. This is the only nullable field that can be returned that depends on the authentication state that will not throw an error. """ viewer: User """ settings is the Settings for a given Tenant. """ settings: Settings! """ discoverOIDCConfiguration will discover the OpenID Connect configuration based on the provided issuer. Discovery is not supported on all providers, and is described in the OpenID Connect Discovery 1.0 incorporating errata set 1: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig If the provider does not support discovery, the response will be null. """ discoverOIDCConfiguration(issuer: String!): DiscoveredOIDCConfiguration @auth(roles: [ADMIN]) """ debugScrapeStoryMetadata will return the information that Coral was able to scrape from the given URL. No data will be saved related to the Story based on this scrape. """ debugScrapeStoryMetadata(url: String!): StoryMetadata @auth(roles: [ADMIN]) """ moderationQueues returns the set of ModerationQueues that are available for all stories or if given the story identified by the `storyID`. """ moderationQueues( storyID: ID siteID: ID section: SectionFilter ): ModerationQueues! @auth(roles: [ADMIN, MODERATOR]) @cacheControl(scope: PRIVATE, maxAge: 0) """ sections will return the unique sections used by this Tenant. """ sections: [String!] @auth(roles: [ADMIN, MODERATOR]) """ activeStories is the list of most recently commented on stories identified by their `lastCommentedAt` field """ activeStories(limit: Int = 10 @constraint(max: 25)): [Story!]! @auth(roles: [ADMIN]) @rate(max: 2, seconds: 1) """ webhookEndpint will return a specific WebhookEndpoint if it exists. """ webhookEndpoint(id: ID!): WebhookEndpoint @auth(roles: [ADMIN]) """ queues returns information on queues used in Coral to manage """ queues: Queues! @auth(roles: [ADMIN]) """ externalModerationPhase will return a specific ExternalModerationPhase if it exists. """ externalModerationPhase(id: ID!): ExternalModerationPhase @auth(roles: [ADMIN]) """ flags are the list of flags from user reported comments. """ flags( first: Int = 10 @constraint(max: 50) after: Cursor orderBy: COMMENT_SORT storyID: ID siteID: ID section: SectionFilter ): FlagsConnection! @auth(roles: [ADMIN, MODERATOR]) """ emailDomain will return a specific emailDomain configuration if it exists. """ emailDomain(id: ID!): EmailDomain @auth(roles: [ADMIN]) """ dsaReports are the list of dsaReports """ dsaReports( first: Int = 10 @constraint(max: 50) after: Cursor orderBy: REPORT_SORT = CREATED_AT_DESC status: [DSAREPORT_STATUS_FILTER!] query: String ): DSAReportsConnection! @auth(roles: [ADMIN, MODERATOR]) """ dsaReport returns a specific dsaReport. """ dsaReport(id: ID!): DSAReport """ notifications will return a list of notifications for an ownerID. """ notifications( ownerID: ID! first: Int = 10 @constraint(max: 50) after: Cursor ): NotificationsConnection! notificationCount(userID: ID!): Int """ persistedQueries returns all the persisted query records in the database """ persistedQueries: [PersistedQuery!] @auth(roles: [ADMIN]) } ################################################################################ ## Mutations ################################################################################ ################## ## updateEmailNotificationSettings ################## input UpdateEmailNotificationSettingsInput { """ onReply, when true, will enable email notifications to be sent to users that have replies to their comments. """ onReply: Boolean """ onFeatured, when true, will enable email notifications to be sent to users that have their comment's featured. """ onFeatured: Boolean """ onStaffReplies when true, will enable email notifications to be sent to users that have a staff member reply to their comments. These notifications will supercede notifications that would have been sent for a basic reply notification. """ onStaffReplies: Boolean """ onModeration when true, will enable email notifications to be sent to users when a comment that they wrote that was previously unpublished, becomes published due to a moderator action. """ onModeration: Boolean """ digestFrequency is the frequency to send email notifications. """ digestFrequency: DIGEST_FREQUENCY """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateEmailNotificationSettingsPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } input OnReplySettingsInput { """ In-page notifications for replies is enabled """ enabled: Boolean! """ This keeps track of what type of reply the user would like to be notified on when in-page reply notifications is enabled """ showReplies: InPageNotificationReplyType! } ################## ## updateInPageNotificationSettings ################## input UpdateInPageNotificationSettingsInput { """ onReply, when true, will enable in-page notifications to be sent to users that have replies to their comments. """ onReply: OnReplySettingsInput """ onFeatured, when true, will enable in-page notifications to be sent to users that have their comment's featured. """ onFeatured: Boolean """ onModeration when true, will enable in-page notifications to be sent to users when a comment that they wrote that was previously unpublished, becomes published due to a moderator action. """ onModeration: Boolean """ enabled, when true, shows a notification count for in-page notifications """ enabled: Boolean """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateInPageNotificationSettingsPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } input UpdateUserMediaSettingsInput { unfurlEmbeds: Boolean clientMutationId: String! } type UpdateUserMediaSettingsPayload { user: User! clientMutationId: String! } ################## ## createComment ################## """ CreateCommentInput provides the input for the createComment Mutation. """ input CreateCommentInput { """ nudge when true will instead return an error related to recoverable moderation faults such as a toxic comment or spam comment to provide user feedback to nudge the user to correct the comment. """ nudge: Boolean = false """ storyID is the ID of the Story where we are creating a comment on. """ storyID: ID! """ body is the Comment body, the content of the Comment. """ body: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! """ media is the optional media attachment to be added to a Comment. """ media: CreateCommentMediaInput """ rating is the optional rating that can be added to a Comment. """ rating: Int } """ CreateCommentPayload contains the created Comment after the createComment mutation. """ type CreateCommentPayload { """ edge is the possibly created comment edge. """ edge: CommentEdge! """ clientMutationId is required for Relay support. """ clientMutationId: String! } """ CreateCommentMediaInput is used for creating media to be attached to a Comment. """ input CreateCommentMediaInput { """ type specifies the type of media that can be attached. Valid values for this are: `giphy`, `external`, `twitter`, and `youtube`. """ type: String! """ id refers to a foreign id for the specific media provider. """ id: String """ url is the URL to the media resource. """ url: String! """ width is the width to the media resource. """ width: String """ height is the height to the media resource. """ height: String } ################## ## createCommentReply ################## """ CreateCommentReplyInput provides the input for the createCommentReply Mutation. """ input CreateCommentReplyInput { """ nudge when true will instead return an error related to recoverable moderation faults such as a toxic comment or spam comment to provide user feedback to nudge the user to correct the comment. """ nudge: Boolean = false """ storyID is the ID of the Story where we are creating a comment on. """ storyID: ID! """ parentID is the ID of the Comment that we are replying to. """ parentID: ID! """ parentRevisionID is the ID of the CommentRevision that we are replying to. """ parentRevisionID: ID! """ body is the Comment body, the content of the Comment. """ body: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! """ media is the optional media attachment to be added to a Comment. """ media: CreateCommentMediaInput } """ CreateCommentReplyPayload contains the created Comment after the createCommentReply mutation. """ type CreateCommentReplyPayload { """ edge is the possibly created comment edge. """ edge: CommentEdge! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## editComment ################## """ EditCommentInput provides the input for the editComment Mutation. """ input EditCommentInput { """ commentID is the ID of the comment being edited. """ commentID: ID! """ body is the Comment body, the content of the Comment. """ body: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! """ media is the optional media attachment to be added to a Comment. """ media: CreateCommentMediaInput } """ EditCommentPayload contains the edited Comment after the editComment mutation. """ type EditCommentPayload { """ comment is the possibly edited comment. """ comment: Comment! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## updateSettings ################## input SettingsOIDCAuthIntegrationInput { """ enabled, when true, allows the integration to be enabled. """ enabled: Boolean """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: SettingsAuthenticationTargetFilterInput """ name is the label assigned to reference the provider of the OIDC integration, and will be used in situations where the name of the provider needs to be displayed, like the login button. """ name: String """ clientID is the Client Identifier as defined in: https://tools.ietf.org/html/rfc6749#section-2.2 """ clientID: String """ clientSecret is the Client Secret as defined in: https://tools.ietf.org/html/rfc6749#section-2.3.1 """ clientSecret: String """ authorizationURL is defined as the `authorization_endpoint` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ authorizationURL: String """ tokenURL is defined as the `token_endpoint` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ tokenURL: String """ jwksURI is defined as the `jwks_uri` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ jwksURI: String """ issuer is defined as the `issuer` in: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata """ issuer: String } input SettingsSMTPInput { secure: Boolean host: String port: Int authentication: Boolean username: String password: String } input SettingsEmailConfigurationInput { """ enabled when True, will enable the emailing functionality in Coral. """ enabled: Boolean smtp: SettingsSMTPInput fromName: String fromEmail: String } input SettingsWordListInput { """ banned words will by default reject the comment if it is found. """ banned: [String!] """ suspect words will simply flag the comment. """ suspect: [String!] } input SettingsAuthenticationTargetFilterInput { admin: Boolean! stream: Boolean! } input SettingsLocalAuthIntegrationInput { enabled: Boolean """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: SettingsAuthenticationTargetFilterInput } input SettingsSSOAuthIntegrationInput { enabled: Boolean """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: SettingsAuthenticationTargetFilterInput } input SettingsGoogleAuthIntegrationInput { """ enabled, when true, will enable Google as an authentication integration. """ enabled: Boolean """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: SettingsAuthenticationTargetFilterInput """ clientID is the Client Identifier as provided by the Google API Console. """ clientID: String """ clientSecret is the Client Secret as provided by the Google API Console. """ clientSecret: String } input SettingsFacebookAuthIntegrationInput { """ enabled, when true, will enable Facebook as an authentication integration. """ enabled: Boolean """ allowRegistration when true will allow users that have not signed up before with this authentication integration to sign up. """ allowRegistration: Boolean """ targetFilter will restrict where the authentication integration should be displayed. If the value of targetFilter is null, then the authentication integration should be displayed in all targets. """ targetFilter: SettingsAuthenticationTargetFilterInput """ clientID is the Client Identifier as provided by the Facebook Developer Console. """ clientID: String """ clientSecret is the Client Secret as provided by the Facebook Developer Console. """ clientSecret: String } input SettingsAuthIntegrationsInput { """ local stores configuration related to email/password based logins. """ local: SettingsLocalAuthIntegrationInput """ sso stores configuration related to Single Sign On based logins. """ sso: SettingsSSOAuthIntegrationInput """ oidc stores configuration related to OpenID Connect based logins. """ oidc: SettingsOIDCAuthIntegrationInput """ google stores configuration related to Google based logins. """ google: SettingsGoogleAuthIntegrationInput """ facebook stores configuration related to Facebook based logins. """ facebook: SettingsFacebookAuthIntegrationInput } """ Auth contains all the settings related to authentication and authorization. """ input SettingsAuthInput { """ integrations are the set of configurations for the variations of authentication solutions. """ integrations: SettingsAuthIntegrationsInput """ sessionDuration determines the duration in seconds for which an access token is valid """ sessionDuration: Int! } input SettingsAkismetExternalIntegrationInput { """ enabled when True will enable the integration. """ enabled: Boolean """ ipBased when True will enable IP-based spam detection. """ ipBased: Boolean """ The key for the Akismet integration. """ key: String """ The site (blog) for the Akismet integration. """ site: String } input SettingsPerspectiveExternalIntegrationInput { """ enabled when True will enable the integration. """ enabled: Boolean """ The endpoint that Coral should use to communicate with the perspective API. """ endpoint: String """ The key for the Perspective API integration. """ key: String """ model is the name of the Perspective model to use. """ model: String """ The threshold that given a specific toxic comment score, the comment will be marked by Coral as toxic. """ threshold: Float """ When True, comments sent will not be stored by the Google Perspective API. """ doNotStore: Boolean """ When True, moderation actions will be sent to the Google Perspective API. """ sendFeedback: Boolean } input SettingsExternalIntegrationsInput { """ akismet provides integration with the Akismet Spam detection service. """ akismet: SettingsAkismetExternalIntegrationInput """ perspective provides integration with the Perspective API comment analysis platform. """ perspective: SettingsPerspectiveExternalIntegrationInput } """ RecentCommentHistoryConfigurationInput controls the beheviour around when comments from Users should be marked for pre-moderation automatically once they have reached the trigger rate for rejected comments. """ input RecentCommentHistoryConfigurationInput { """ enabled when true will pre-moderate users new comments once they have reached the trigger rejection rate. """ enabled: Boolean """ timeFrame specifies the number of seconds that comments from a given User will be taken into account when computing their rejection rate. """ timeFrame: Int """ triggerRejectionRate specifies the percentage of comments that a given User may have before their comments will then be placed into pre-moderation until the rejection rate decreases. """ triggerRejectionRate: Float } input FlattenRepliesInput { enabled: Boolean! } input CreateAnnouncementInput { """ content of the announcement. """ content: String! duration: Int! """ clientMutationId is required for Relay support. """ clientMutationId: String! } input DeleteAnnouncementInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CreateAnnouncementPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! settings: Settings! } type DeleteAnnouncementPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! settings: Settings! } input SettingsCommunityGuidelinesInput { """ enable set to true will show the guidelines above the message box. """ enabled: Boolean """ content of the guidelines. """ content: String } input SettingsCharCountInput { """ enabled when true, enables the character count moderation phase. """ enabled: Boolean """ min is the smallest length of a Comment that may be posted. """ min: Int """ max is the largest length of a Comment that may be posted. """ max: Int } input SettingsDisableCommentingInput { """ enabled when true will disable commenting site-wide. """ enabled: Boolean """ message will be shown above the comment stream while commenting is disabled site-wide. """ message: String } input SettingsOrganizationInput { """ name is the name of the organization. """ name: String """ contactEmail is the email of the organization. """ contactEmail: String """ url is the URL to the organizations home page. """ url: String } input SettingsCloseCommentingInput { """ auto when true will configure the automatic close on each story as they are created based on the current configured timeout option. """ auto: Boolean """ timeout is the amount of seconds from the `createdAt` timestamp that a given story will be considered closed. """ timeout: Int """ message when provided will be the message that shows when the comment stream is closed for commenting. """ message: String } """ StoryScrapingConfigurationInput stores the configuration around story scraping. """ input StoryScrapingConfigurationInput { """ enabled, when true, enables stories to be scraped. When disabled, stories will only be looked up instead, and must be created via the API directly. """ enabled: Boolean """ proxyURL when specified, allows scraping requests to use the provided proxy. All requests will then be passed through the appropriate proxy as parsed by the [proxy-agent](https://www.npmjs.com/package/proxy-agent) package. """ proxyURL: String """ customUserAgent when specified will override the user agent used by fetch requests made during the scraping process. """ customUserAgent: String """ authentication is whether alternative authentication credentials have been provided for scraping activities. """ authentication: Boolean! """ username is the username to use with basic authentication for scraping jobs. """ username: String """ password is the password to use with basic authentication for scraping jobs. """ password: String } """ StoryConfiguration stores the configuration for working with stories. """ input StoryConfigurationInput { """ scraping stores configuration around story scraping. """ scraping: StoryScrapingConfigurationInput """ disableLazy when true, will only allow lookups of stories created via the API. """ disableLazy: Boolean } """ ReactionConfigurationInput stores the configuration for reactions used across this Tenant. """ input ReactionConfigurationInput { """ icon is the string representing the icon to be used for the reactions. """ icon: String """ iconActive is the string representing the icon that should be used when the icon should be considered active. """ iconActive: String """ label is the string placed beside the reaction icon to provide better context. """ label: String """ labelActive is the string placed beside the reaction icon to provide better context when it has been selected. """ labelActive: String """ sortLabel is the string placed inside of the sort menu to sort for comment with most reactions. """ sortLabel: String """ color is the hex color code that can be used to change the color of the button. """ color: String } """ topCommenter specifies whether or not the feature is enabled to show that commenters with comments featured within the last 10 days are top commenters """ input TopCommenterConfigurationInput { """ enabled is whether the Top commenter feature is enabled """ enabled: Boolean } """ newCommenter specifies whether or not the feature is enabled to show that commenters are new and have joined within the last seven days. """ input NewCommenterConfigurationInput { enabled: Boolean } """ BadgeConfigurationInput specifies the configuration for the staff badges assigned to users with any role above COMMENTER. """ input BadgeConfigurationInput { """ staffLabel is the string used when displaying the STAFF badge to users. """ staffLabel: String """ adminLabel is the string used when displaying the ADMIN badge to users. """ adminLabel: String """ moderatorLabel is the string used when displaying the MODERATOR badge to users. """ moderatorLabel: String """ memberLabel is the string used when displaying the MEMBER badget to users. """ memberLabel: String } """ CommenterAccountFeatures stores the configuration for commenter account features. """ input CommenterAccountFeaturesInput { """ changeUsername when true, non-sso user may change username every 14 days """ changeUsername: Boolean """ downloadComments when true, user may download their comment history """ downloadComments: Boolean """ deleteAccount when true, non-sso user may permanently delete their account """ deleteAccount: Boolean } input SlackTriggersConfigurationInput { """ reportedComments is whether this channel will receive reported comments """ reportedComments: Boolean """ pendingComments is whether this channel will receive pending comments """ pendingComments: Boolean """ featuredComments is whether this channel will receive featured comments """ featuredComments: Boolean """ allComents is whether the channel will receive all comments """ allComments: Boolean """ staffComments is whether the channel will receive staff comments """ staffComments: Boolean } input SlackChannelConfigurationInput { """ enabled is whether this Slack channel is enabled to send comments to its correlated web hook """ enabled: Boolean """ name is the name assigned to the Slack channel """ name: String """ hookURL defines the URL that comments will be sent to """ hookURL: String """ triggers are the filters of types of comments that will be sent to the correlated channel """ triggers: SlackTriggersConfigurationInput } input SlackConfigurationInput { """ channels are the channels configured for Slack integration """ channels: [SlackChannelConfigurationInput!] } input TwitterMediaConfigurationInput { """ enabled is true when twitter media objects are enabled. """ enabled: Boolean } input BlueskyMediaConfigurationInput { """ enabled is true when Bluesky media objects are enabled. """ enabled: Boolean } input YouTubeMediaConfigurationInput { """ enabled is true when youtube media objects are enabled. """ enabled: Boolean } input GifMediaConfigurationInput { """ enabled is true when gif search via giphy and giphy media objects are enabled. """ enabled: Boolean """ provider is the source for which gifs are pulled from """ provider: GIF_MEDIA_SOURCE """ maximum allowed rating for gifs, g, pg, pg-13, r """ maxRating: String """ key is the API key for Giphy. """ key: String } input MediaConfigurationInput { """ twitter is the configuration for Twitter support. """ twitter: TwitterMediaConfigurationInput """ bluesky is the configuration for Bluesky support. """ bluesky: BlueskyMediaConfigurationInput """ youtube is the configuration for YouTube support. """ youtube: YouTubeMediaConfigurationInput """ gifs is the configuration for gif support. """ gifs: GifMediaConfigurationInput } """ NewCommentersModerationConfigInput specifies the moderation configuration for new commenters' comments. """ input NewCommentersModerationConfigInput { """ mode is whether new commenters' comments should be moderated PRE, POST, or SPECIFIC_SITES_PRE (pre-moderated for specific sites) """ mode: MODERATION_MODE """ premodSites is the specific sites that new commenters' comments should be pre-moderated on if the SPECIFIC_SITES_PRE moderation mode is set """ premodSites: [String!] } """ NewCommentersConfigurationInput specifies the features that apply to new commenters """ input NewCommentersConfigurationInput { """ premodEnabled ensures that new commenters' comments are pre-moderated until they have enough approved comments """ premodEnabled: Boolean """ approvedCommentsThreshold is the number of comments a user must have approved before their comments do not require premoderation """ approvedCommentsThreshold: Int """ moderation is the configuration for pre-moderation for new commenters' comments until they have enough approved comments. It stores whether it is PRE, POST, or SPECIFIC_SITES_PRE for pre-moderation only on specific sites, and in this case, which specific sites. """ moderation: NewCommentersModerationConfigInput } """ DisposableEmailDomainsConfigurationInput specifies the configuration for disposable emails and whether users who sign up with them should be pre-moderated. """ input DisposableEmailDomainsConfigurationInput { enabled: Boolean! } """ EmbeddedCommentsConfigurationInput specifies the configuration for comment embeds. """ input EmbeddedCommentsConfigurationInput { allowReplies: Boolean """ oEmbedAllowedOrigins are the allowed origins for oEmbed API calls. """ oEmbedAllowedOrigins: [String!] } """ RTEConfigurationInput specifies the configuration for the rte. """ input RTEConfigurationInput { """ enabled when true turns on basic RTE features including bold, italic, quote, and bullet list. """ enabled: Boolean! """ strikethrough when true turns on the strikethrough feature. """ strikethrough: Boolean! """ spoiler when true turns on the spoiler feature. """ spoiler: Boolean! } """ InPageNotificationsConfigurationInput specifies the configuration for in-page notifications. """ input InPageNotificationsConfigurationInput { """ enabled when true turns on in-page notifications as an option for commenters. """ enabled: Boolean """ floatingBellIndicator when true shows a floating bell for notifications; when false, there is no floating bell and the Notifications tab is aligned left. """ floatingBellIndicator: Boolean } """ FlairBadgeConfigurationInput specifies the configuration for flair badges, including whether they are enabled and their image urls. """ input FlairBadgeConfigurationInput { flairBadgesEnabled: Boolean flairBadgeURLs: [String!] } """ DSAMethodOfRedressConfigurationInput specifies the methods of redress and their configuration values for users disputing DSA reporting decisions. """ input DSAMethodOfRedressConfigurationInput { """ method defines the type of redress that is available to the users about DSA decisions. """ method: DSA_METHOD_OF_REDRESS """ email is the email used when method is set to EMAIL. """ email: String """ url is the url that is used when method is set to URL. """ url: String } """ DSAConfigurationInput specifies the configuration for DSA European Union moderation and reporting features. """ input DSAConfigurationInput { """ enabled when true turns on the European Union DSA compliance features for commenting, reporting, and moderation flows. """ enabled: Boolean """ methodOfRedress lets users know if and how they can appeal a moderation decision """ methodOfRedress: DSAMethodOfRedressConfigurationInput } """ SettingsInput is the partial type of the Settings type for performing mutations. """ input SettingsInput { """ live provides configuration options related to live updates for stories on this site. """ live: LiveConfigurationInput """ moderation is the moderation mode for all Stories on the site. """ moderation: MODERATION_MODE """ premoderateAllCommentsSites are the sites that should have all comments premoderated when moderation mode is SPECIFIC_SITES_PRE """ premoderateAllCommentsSites: [ID!] """ communityGuidelines will be shown in the comments stream. """ communityGuidelines: SettingsCommunityGuidelinesInput """ premodLinksEnable will put all comments that contain links into premod. """ premodLinksEnable: Boolean """ customCSSURL is the URL of the custom CSS used to display on the frontend. """ customCSSURL: String """ customFontsCSSURL is the URL of the custom CSS with @font-face definitions used to display on the frontend. """ customFontsCSSURL: String """ disableDefaultFonts will turn off font-face loading of Coral's default fonts. """ disableDefaultFonts: Boolean """ disableCommenting will disable commenting site-wide. """ disableCommenting: SettingsDisableCommentingInput """ editCommentWindowLength is the length of time (in seconds) after a comment is posted that it can still be edited by the author. """ editCommentWindowLength: Int """ organization stores information about the organization behind this specific instance of Coral. """ organization: SettingsOrganizationInput """ closeCommenting contains settings related to the automatic closing of commenting on Stories. """ closeCommenting: SettingsCloseCommentingInput """ wordList will return a given list of words. """ wordList: SettingsWordListInput """ email is the set of credentials and settings associated with the organization. """ email: SettingsEmailConfigurationInput """ auth contains all the settings related to authentication and authorization. """ auth: SettingsAuthInput """ integrations contains all the external integrations that can be enabled. """ integrations: SettingsExternalIntegrationsInput """ recentCommentHistory is the set of settings related to how automatic pre-moderation is controlled. """ recentCommentHistory: RecentCommentHistoryConfigurationInput """ charCount stores the character count moderation settings. """ charCount: SettingsCharCountInput """ stories stores the configuration around stories. """ stories: StoryConfigurationInput """ reaction specifies the configuration for reactions. """ reaction: ReactionConfigurationInput """ featuredBy specifies whether or not the "Featured by" featured is enabled """ featuredBy: Boolean """ topCommenter specifies whether or not the feature is enabled to show that commenters with comments featured within the last 10 days are top commenters """ topCommenter: TopCommenterConfigurationInput """ newCommenter specifies whether or not the feature is enabled to show that commenters are new and have joined within the last seven days. """ newCommenter: NewCommenterConfigurationInput """ badges specifies the configuration for user badges assigned to users with any role above COMMENTER. """ badges: BadgeConfigurationInput """ DEPRECATED: staff specifies the configuration for user badges assigned to users with any role above COMMENTER. """ staff: BadgeConfigurationInput """ accountFeatures specifies the configuration for accounts. """ accountFeatures: CommenterAccountFeaturesInput """ slack specifies the configuration for Slack integration. """ slack: SlackConfigurationInput """ locale specifies the locale for this Tenant. """ locale: Locale """ newCommenters is the configuration for how new commenters comments are treated. """ newCommenters: NewCommentersConfigurationInput """ premoderateSuspectWords when enabled will cause any comments that contain suspect words to be sent to pre-moderation to be reviewed by a moderator prior to being presented in stream. """ premoderateSuspectWords: Boolean """ rte is the configuration of the Rich-Text-Editor. """ rte: RTEConfigurationInput """ media is the configuration media content attached to Comment's. """ media: MediaConfigurationInput """ memberBios is whether members can define a bio for their account. """ memberBios: Boolean """ amp is whether Accelerated Mobile Pages Support is activated. """ amp: Boolean """ flattenReplies is whether or not to flatten replies """ flattenReplies: Boolean """ collapseReplies is whether or not to collapse first-level replies by default """ collapseReplies: Boolean """ forReviewQueue is whether or not to show the For Review queue in the Moderate tab of the admin. This queue allows moderators to review every flag that has been put on a comment by a user. This feature shall help complying with European Law (European Directive 2000/31/CE). """ forReviewQueue: Boolean """ externalProfileURL is a string template for a link to a user's external profile. """ externalProfileURL: String """ embeddedComments includes the configuration for embedded comments. """ embeddedComments: EmbeddedCommentsConfigurationInput """ flairBadges specifies the configuration for flair badges, including whether they are enabled and any configured image urls """ flairBadges: FlairBadgeConfigurationInput """ dsa specifies the configuration for DSA European Union moderation and reporting features. """ dsa: DSAConfigurationInput """ premoderateEmailAddress is the configuration for finding specific email addresses at sign up and premoderating them according to various rules. """ premoderateEmailAddress: PremoderateEmailAddressConfigurationInput """ protectedEmailDomains is the configuration for email domains that are protected from email domain moderation rules such as all accounts banned """ protectedEmailDomains: [String!] """ disposableEmailDomains is the configuration for whether or not new users registering with a disposable email address should be pre-moderated. """ disposableEmailDomains: DisposableEmailDomainsConfigurationInput """ inPageNotifications specifies the configuration for in-page notifications """ inPageNotifications: InPageNotificationsConfigurationInput """ showUnmoderatedCounts is whether or not to show the unmoderated counts in the moderation queue. """ showUnmoderatedCounts: Boolean } """ UpdateSettingsInput provides the input for the updateSettings Mutation. """ input UpdateSettingsInput { """ settings is the partial set of settings that will be used as a patch against the existing settings object. """ settings: SettingsInput! """ clientMutationId is required for Relay support. """ clientMutationId: String! } """ UpdateSettingsPayload contains the updated Settings after the updateSettings mutation. """ type UpdateSettingsPayload { """ settings is the updated Settings. """ settings: Settings """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## createCommentReaction ################## input CreateCommentReactionInput { """ commentID is the Comment's ID that we want to create a Reaction on. """ commentID: ID! """ commentRevisionID is the revision ID of the Comment that we're creating the Reaction on. """ commentRevisionID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CreateCommentReactionPayload { """ comment is the Comment that the Reaction was created on. """ comment: Comment """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## removeCommentReaction ################## input RemoveCommentReactionInput { """ commentID is the Comment's ID that we want to remove a Reaction on. """ commentID: ID! """ commentRevisionID is the Comment's revision ID that we want to remove a reaction on. """ commentRevisionID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RemoveCommentReactionPayload { """ comment is the Comment that the Reaction was removed on. """ comment: Comment """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## createCommentDontAgree ################## input CreateCommentDontAgreeInput { """ commentID is the Comment's ID that we want to create a DontAgree on. """ commentID: ID! """ commentRevisionID is the revision ID of the Comment that we're creating the DontAgree on. """ commentRevisionID: ID! """ additionalDetails stores information from the User as to why the Flag was created or is relevant. """ additionalDetails: String """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CreateCommentDontAgreePayload { """ comment is the Comment that the DontAgree was created on. """ comment: Comment """ clientMutationId is required for Relay support. """ clientMutationId: String! } input CreateIllegalContentInput { """ commentID is the id of the comment reported for illegal content. """ commentID: ID! """ commentRevisionID is the revision ID of the comment reported for illegal content. """ commentRevisionID: ID! } type CreateIllegalContentPayload { """ comment is the Comment that the illegal content report was created on. """ comment: Comment """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## removeCommentDontAgree ################## input RemoveCommentDontAgreeInput { """ commentID is the Comment's ID that we want to remove a DontAgree on. """ commentID: ID! """ commentRevisionID is the Comment's revision ID that we want to remove a reaction on. """ commentRevisionID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RemoveCommentDontAgreePayload { """ comment is the Comment that the DontAgree was removed on. """ comment: Comment """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## createCommentFlag ################## input CreateCommentFlagInput { """ commentID is the Comment's ID that we want to create a Flag on. """ commentID: ID! """ commentRevisionID is the revision ID of the Comment that we're creating the Flag on. """ commentRevisionID: ID! """ reason is the selected reason why the Flag is being created. """ reason: COMMENT_FLAG_REPORTED_REASON! """ additionalDetails stores information from the User as to why the Flag was created or is relevant. """ additionalDetails: String """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CreateCommentFlagPayload { """ comment is the Comment that the Flag was created on. """ comment: Comment """ clientMutationId is required for Relay support. """ clientMutationId: String! } input AddDSAReportNoteInput { """ id of the user who added the note to the DSAReport """ userID: ID! """ body is the text of the note added to the DSAReport """ body: String! """ reportID is the id of the DSAReport to which the note is being added """ reportID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type AddDSAReportNotePayload { """ dsaReport is the DSAReport that the note was added to """ dsaReport: DSAReport """ clientMutationId is required for Relay support. """ clientMutationId: String! } input AddDSAReportShareInput { """ id of the user who shared the DSAReport """ userID: ID! """ reportID is the id of the DSAReport which was downloaded to share """ reportID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type AddDSAReportSharePayload { """ dsaReport is the DSAReport that was downloaded to share """ dsaReport: DSAReport """ clientMutationId is required for Relay support. """ clientMutationId: String! } input DeleteDSAReportNoteInput { """ id of the note to be deleted from DSAReport history """ id: ID! """ reportID is the id of the DSAReport from which the note is to be deleted """ reportID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type DeleteDSAReportNotePayload { """ dsaReport is the DSAReport from which the note was deleted """ dsaReport: DSAReport """ clientMutationId is required for Relay support. """ clientMutationId: String! } input MakeDSAReportDecisionInput { """ id of the user who made a decision for the DSAReport """ userID: ID! """ legality is the legality decision made for the DSAReport """ legality: DSAReportDecisionLegality! """ legal grounds is an overview of the law broken as part of illegal content decision """ legalGrounds: String """ detailedExplanation provides more information as part of illegal content decision """ detailedExplanation: String """ commentID is the id of the comment about which the DSAReport legality decision is being made """ commentID: ID! """ commentRevisionID is the revision id of the comment about which the DSAReport legality decision is being made """ commentRevisionID: ID! """ reportID is the id of the DSAReport that is being decided on """ reportID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type MakeDSAReportDecisionPayload { """ dsaReport is the DSAReport that was decided on """ dsaReport: DSAReport """ clientMutationId is required for Relay support. """ clientMutationId: String! } input ChangeDSAReportStatusInput { """ id of the user who changed the status of the DSAReport """ userID: ID! """ status is the new status of the DSAReport """ status: DSAReportStatus! """ reportID is the id of the DSAReport that is having its status changed """ reportID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type ChangeDSAReportStatusPayload { """ dsaReport is the DSAReport that had its status changed """ dsaReport: DSAReport """ clientMutationId is required for Relay support. """ clientMutationId: String! } input CreateDSAReportInput { """ id of the reported comment """ commentID: ID! """ id of the user who submitted the DSAReport """ userID: ID """ lawBrokenDescription is the text entered by the submitting user to describe which law is broken by the reported comment """ lawBrokenDescription: String! """ additionalInformation is more explanation entereted by the submitting user to describe how the comment breaks the law """ additionalInformation: String! """ submissionID keeps track of comments that were submitted together in one form """ submissionID: ID """ commentRevisionID is the revision ID for the comment for which a DSA report is being submitted. """ commentRevisionID: String """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CreateDSAReportPayload { """ dsaReport is the report that was newly created """ dsaReport: DSAReport """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## createStory ################## """ StoryMetadataInput is the metadata for a given Story as provided via this API. """ input StoryMetadataInput { """ title stores the title from the Story page. """ title: String """ author stores the author from the Story page. """ author: String """ description stores the description from the Story page. """ description: String """ image stores the image from the Story page. """ image: String """ publishedAt stores the publication date from the Story page. """ publishedAt: Time """ modifiedAt stores the modified date from the Story page. """ modifiedAt: Time """ section stores the section from the Story page. """ section: String } """ CreateStory is the input required to create a Story. """ input CreateStory { """ id is the identifier of the Story. """ id: ID! """ url is the url that the Story is located on. """ url: String! """ mode is the specified mode that the story should be created with. """ mode: STORY_MODE """ metadata is the set of information relating to this Story that would normally be scraped, but can be provided here. """ metadata: StoryMetadataInput """ closedAt when provided specifies the date that the given story will be closed at. If not provided, the story close will use the settings to determine the automatic close date. """ closedAt: Time } input CreateStoryInput { """ story is the Story input needed to create a Story. """ story: CreateStory! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CreateStoryPayload { """ story is the Story that was possibly created. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## updateStory ################## """ UpdateStory is the input required to update a Story. """ input UpdateStory { """ url is the url that the Story is located on. """ url: String """ metadata is the set of information relating to this Story that would normally be scraped, but can be provided here. """ metadata: StoryMetadataInput } input UpdateStoryInput { """ id is the identifier of the Story used either when the Story was created via the API or from Coral when it was lazily created. """ id: ID! """ story contains the fields that should be updated. Any fields not specified will not be changed. """ story: UpdateStory! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateStoryPayload { """ story is the Story that was possibly updated. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## updateStorySettings ################## """ StoryMessageBoxInput stores settings related to the Story Message Box. """ input StoryMessageBoxInput { """ enable when true will enable the Message Box on the comment stream. """ enabled: Boolean """ icon when set will reference the string for the Message box used by the Message Box. """ icon: String """ content when set contains the actual markup for the Message Box. """ content: String } """ LiveConfigurationInput provides configuration options related to live updates. """ input LiveConfigurationInput { """ enabled when true will allow live updates. """ enabled: Boolean } """ UpdateStorySettings is the input required to update a Story's Settings. """ input UpdateStorySettings { """ live provides configuration options related to live updates on this Story. """ live: LiveConfigurationInput """ moderation determines whether or not this is a PRE or POST moderated story. """ moderation: MODERATION_MODE """ premodLinksEnable will put all comments that contain links into premod. """ premodLinksEnable: Boolean """ messageBox stores settings related to the Story Message Box. """ messageBox: StoryMessageBoxInput } input UpdateStorySettingsInput { """ id is the identifier of the Story used either when the Story was created via the API or from Coral when it was lazily created. """ id: ID! """ settings contains the fields on the story settings that should be updated. Any fields not specified will not be changed. """ settings: UpdateStorySettings! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateStorySettingsPayload { """ story is the Story that was possibly updated. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## closeStory ################## input CloseStoryInput { """ id is the identifier of the Story used either when the Story was created via the API or from Coral when it was lazily created. """ id: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CloseStoryPayload { """ story is the Story that was possibly updated. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## openStory ################## input OpenStoryInput { """ id is the identifier of the Story used either when the Story was created via the API or from Coral when it was lazily created. """ id: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type OpenStoryPayload { """ story is the Story that was possibly updated. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## mergeStories ################## input MergeStoriesInput { """ sourceIDs are the list of Story ID's that should have their Comment's moved onto the Story indicated by `destinationID`. The Stories indicated by the `sourceIDs` field will be removed after the Comment's have been moved. """ sourceIDs: [ID!]! """ destinationID is the ID of the Story where all the other "source" Stories will have their Comment's moved onto. """ destinationID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type MergeStoriesPayload { """ story is the Story that all the source stories were merged into. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## removeStory ################## input RemoveStoryInput { """ id is the identifier of the Story used either when the Story was created via the API or from Coral when it was lazily created. """ id: ID! """ includeComments when true will remove any Comment's that were left on the Story. This option should be used rarely, instead preferring to updating the Story URL and/or merging with the correct Story. """ includeComments: Boolean = false """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RemoveStoryPayload { """ story is the Story that was possibly removed. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## scrapeStory ################## input ScrapeStoryInput { """ id is the identifier of the Story used either when the Story was created via the API or from Coral when it was lazily created. """ id: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type ScrapeStoryPayload { """ story is the Story that was possibly scraped. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # approveComment ################## input ApproveCommentInput { """ commentID is the ID of the Comment that was approved. """ commentID: ID! """ commentRevisionID is the ID of the CommentRevision that is being approved. """ commentRevisionID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type ApproveCommentPayload { """ comment is the Comment that was approved. """ comment: Comment """ moderationQueues will return the selected moderation queues. If the `storyID` is provided, it will filter the moderation queues for only comments in that Story. """ moderationQueues( storyID: ID siteID: ID section: SectionFilter ): ModerationQueues """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # rejectComment ################## input RejectCommentReasonInput { """ code is the enumerated code for the reason the comment is being rejected. """ code: REJECTION_REASON_CODE! """ legalGrounds is the specific laws broken as described by the reporter. """ legalGrounds: String """ detailedExplanation is any additional information the user wishes to provide. """ detailedExplanation: String """ customReason is a reason provided for rejection when the Other rejection code is selected. """ customReason: String } input RejectCommentInput { """ commentID is the ID of the Comment that was rejected. """ commentID: ID! """ commentRevisionID is the ID of the CommentRevision that is being rejected. """ commentRevisionID: ID! """ reason is the reason the comment is being rejected if DSA features are enabled. """ reason: RejectCommentReasonInput """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RejectCommentPayload { """ comment is the Comment that was rejected. """ comment: Comment """ moderationQueues will return the selected moderation queues. If the `storyID` is provided, it will filter the moderation queues for only comments in that Story. """ moderationQueues( storyID: ID siteID: ID section: SectionFilter ): ModerationQueues """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # featureComment ################## input FeatureCommentInput { """ commentID is the ID of the Comment that should be featured. """ commentID: ID! """ commentRevisionID is the ID of the CommentRevision that should be featured """ commentRevisionID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type FeatureCommentPayload { """ comment is the Comment that was featured. """ comment: Comment """ clientMutationId is required for Relay support. """ clientMutationId: String! """ moderationQueues will return the selected moderation queues. If the `storyID` is provided, it will filter the moderation queues for only comments in that Story. """ moderationQueues(storyID: ID): ModerationQueues } ################## # unfeatureComment ################## input UnfeatureCommentInput { """ commentID is the ID of the featured Comment that should be unfeatured. """ commentID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UnfeatureCommentPayload { """ comment is the Comment that was unfeatured. """ comment: Comment """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # setUsername ################## input SetUsernameInput { """ username is the desired username that should be set to the current User. """ username: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type SetUsernamePayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # updateBio ################## input UpdateBioInput { """ bio is the desired bio that should be set to the current User. """ bio: String """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateBioPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # updateUsername ################## input UpdateUsernameInput { """ username is the desired username that should be set to the current User. """ username: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateUsernamePayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # inviteUser ################## input InviteUsersInput { """ emails is the email addresses of the Users to be invited. """ emails: [String!]! """ role is the designated role of the User being invited. """ role: USER_ROLE! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type InviteUsersPayload { """ invites is the references to the invited Users. """ invites: [Invite]! """ clientMutationId is required for Relay support. """ clientMutationId: String! } input CreateModeratorNoteInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ body is the content of the Note """ body: String! """ userID the id of the User who is the subject of the note. """ userID: ID! } input DeleteModeratorNoteInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ userID is the user who is the subject of the note """ userID: ID! """ id is the identifier of the note """ id: ID! } type CreateModeratorNotePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ createdBy is the moderator who created the note user is the updated user. """ user: User! } type DeleteModeratorNotePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the updated user. """ user: User! } ################## # createWebhookEndpoint ################## input CreateWebhookEndpointInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ url is the URL that Coral will POST event data to. """ url: String! """ all is true when all events are subscribed to. """ all: Boolean! """ events are the specific event names that this endpoint is configured to send for. """ events: [WEBHOOK_EVENT_NAME!]! } type CreateWebhookEndpointPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ endpoint is the endpoint that we just created. """ endpoint: WebhookEndpoint! """ settings is the updated settings also containing the new endpoint. """ settings: Settings! } ################## # updateWebhookEndpoint ################## input UpdateWebhookEndpointInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the WebhookEndpoint being updated. """ id: ID! """ url is the URL that Coral will POST event data to. """ url: String """ all is true when all events are subscribed to. """ all: Boolean """ events are the specific event names that this endpoint is configured to send for. """ events: [WEBHOOK_EVENT_NAME!] } type UpdateWebhookEndpointPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ endpoint is the endpoint that we just created. """ endpoint: WebhookEndpoint! } ################## # rotateWebhookEndpointSigningSecret ################## input RotateWebhookEndpointSigningSecretInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the WebhookEndpoint being updated. """ id: ID! """ inactiveIn is the number of seconds that the current active Secret should be kept active. """ inactiveIn: Int! } type RotateWebhookEndpointSigningSecretPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ endpoint is the endpoint that we just updated. """ endpoint: WebhookEndpoint! } ################## # disableWebhookEndpoint ################## input DisableWebhookEndpointInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the WebhookEndpoint being disabled. """ id: ID! } type DisableWebhookEndpointPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ endpoint is the endpoint that we just disabled. """ endpoint: WebhookEndpoint! } ################## # enableWebhookEndpoint ################## input EnableWebhookEndpointInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the WebhookEndpoint being enabled. """ id: ID! } type EnableWebhookEndpointPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ endpoint is the endpoint that we just enabled. """ endpoint: WebhookEndpoint! } ################## # deleteWebhookEndpoint ################## input DeleteWebhookEndpointInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the WebhookEndpoint being deleted. """ id: ID! } type DeleteWebhookEndpointPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ endpoint is the endpoint that we just deleted. """ endpoint: WebhookEndpoint! } ################# # createExternalModerationPhase ################## input CreateExternalModerationPhaseInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ name is the name assigned to this ExternalModerationPhase for identification purposes. """ name: String! """ url is the URL that Coral will POST moderation queries to. """ url: String! """ format is the format of the comment body sent. """ format: COMMENT_BODY_FORMAT! """ timeout is the number of milliseconds that this moderation is maximum expected to take before it is skipped. """ timeout: Int! } type CreateExternalModerationPhasePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ phase is the ExternalModerationPhase that we just created. """ phase: ExternalModerationPhase! """ settings is the updated settings also containing the new phase. """ settings: Settings! } ################## # updateExternalModerationPhase ################## input UpdateExternalModerationPhaseInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the ExternalModerationPhase being updated. """ id: ID! """ name is the name assigned to this ExternalModerationPhase for identification purposes. """ name: String """ url is the URL that Coral will POST moderation queries to. """ url: String """ format is the format of the comment body sent. """ format: COMMENT_BODY_FORMAT """ timeout is the number of milliseconds that this moderation is maximum expected to take before it is skipped. """ timeout: Int } type UpdateExternalModerationPhasePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ phase is the ExternalModerationPhase that we just updated. """ phase: ExternalModerationPhase! } ################## # deleteExternalModerationPhase ################## input DeleteExternalModerationPhaseInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the ExternalModerationPhase being deleted. """ id: ID! } type DeleteExternalModerationPhasePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ phase is the ExternalModerationPhase that we just deleted. """ phase: ExternalModerationPhase! } ################## # disableExternalModerationPhase ################## input DisableExternalModerationPhaseInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the ExternalModerationPhase being disabled. """ id: ID! } type DisableExternalModerationPhasePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ phase is the ExternalModerationPhase that we just disabled. """ phase: ExternalModerationPhase! } ################## # enableExternalModerationPhase ################## input EnableExternalModerationPhaseInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the ExternalModerationPhase being enabled. """ id: ID! } type EnableExternalModerationPhasePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ phase is the ExternalModerationPhase that we just enabled. """ phase: ExternalModerationPhase! } ################## # rotateExternalModerationPhaseSigningSecret ################## input RotateExternalModerationPhaseSigningSecretInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the ExternalModerationPhase being updated. """ id: ID! """ inactiveIn is the number of seconds that the current active Secret should be kept active. """ inactiveIn: Int! } type RotateExternalModerationPhaseSigningSecretPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ phase is the ExternalModerationPhase that we just updated. """ phase: ExternalModerationPhase! } ################## # setEmail ################## input SetEmailInput { """ email is the email address to be associated with the User. """ email: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type SetEmailPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # setPassword ################## input SetPasswordInput { """ password is the password that should be associated with the User. """ password: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type SetPasswordPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # updatePassword ################## input UpdatePasswordInput { """ oldPassword is the old password that that should be compared against when trying to change the password before the change. """ oldPassword: String! """ newPassword is the new password that should be associated with the User. """ newPassword: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdatePasswordPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # requestAccountDeletion ################## input RequestAccountDeletionInput { """ password to verify for the current User. """ password: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RequestAccountDeletionPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # scheduleAccountDeletion ################## input ScheduleAccountDeletionInput { """ userID is the ID of the User being deleted. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type ScheduleAccountDeletionPayload { """ user is the User that was deleted. """ user: User """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # cancelScheduledAccountDeletion ################## input CancelScheduledAccountDeletionInput { """ userID is the ID of the User whose scheduled deletion is being canceled. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CancelScheduledAccountDeletionPayload { """ user is the User whose scheduled deletion was canceled. """ user: User """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # deleteUserAccount ################## input DeleteUserAccountInput { """ userID is the ID of the User being deleted. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type DeleteUserAccountPayload { """ user is the User that was deleted. """ user: User """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # cancelAccountDeletion ################## input CancelAccountDeletionInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CancelAccountDeletionPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # createToken ################## input CreateTokenInput { """ name is the desired name for the Token. """ name: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CreateTokenPayload { """ user is the possibly modified User. """ user: User! """ token is the Token that was created. """ token: Token! """ signedToken is the signed Token associated with the account. """ signedToken: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # deactivateToken ################## input DeactivateTokenInput { """ id is the ID of the Token that should be deactivated. """ id: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type DeactivateTokenPayload { """ user is the possibly modified User. """ user: User! """ token is the Token that was deleted. """ token: Token """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # updateUserUsername ################## input UpdateUserUsernameInput { """ userID is the ID of the User that should have their username updated. """ userID: ID! """ username is the desired username to set for the User. """ username: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateUserUsernamePayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # updateEmail ################## input UpdateEmailInput { """ email is the email address to set for the User. """ email: String! """ password is the users password. """ password: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateEmailPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # updateUserEmail ################## input UpdateUserEmailInput { """ userID is the ID of the User that should have their email address updated. """ userID: ID! """ email is the email address to set for the User. """ email: String! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateUserEmailPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # updateUserAvatar ################## input UpdateUserAvatarInput { """ userID is the ID of the User that should have their avatar updated. """ userID: ID! """ avatar is the URL to the avatar to set for the User. If set to `null` or not provided, it will be unset. """ avatar: String """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateUserAvatarPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # updateUserModerationScopes ################## """ ModerationScopesInput describes the different scopes that a given moderator could be assigned. """ input ModerationScopesInput { """ scoped is whether or not the user's moderation priveledges are limited to specified sites """ scoped: Boolean! """ siteIDs is an array of ID's that should be the list of sites that a moderator is limited to. If none are passed, it will remove the scoping for this User. """ siteIDs: [ID!]! } input UpdateUserModerationScopesInput { """ userID is the ID of the User that should have their role updated. """ userID: ID! """ moderationScopes defines the scopes that a given moderator should be limited to when """ moderationScopes: ModerationScopesInput! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateUserModerationScopesPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ############################ # updateUserMembershipScopes ############################ input MembershipScopesInput { """ scoped is whether or not a user's membership is limited to specific sites. """ scoped: Boolean! """ siteIDs are the ids of the sites on which to scope a user's membership to. """ siteIDs: [ID!]! } input UpdateUserMembershipScopesInput { """ userID is the id of the user whos membership scopes are to be updated. """ userID: ID! """ membershipScopes represent the scopes of the user's membership. """ membershipScopes: MembershipScopesInput! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateUserMembershipScopesPayload { """ user is the possible udpated user. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # updateUserRole ################## input UpdateUserRoleInput { """ userID is the ID of the User that should have their role updated. """ userID: ID! """ role is the `USER_ROLE` that the User should be set to. """ role: USER_ROLE! """ scoped is whether or not the role will be limited to specific sites or not. """ scoped: Boolean! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateUserRolePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } ################## # promoteModerator ################## input PromoteModeratorInput { """ userID is the ID of the User that should have their role promoted. """ userID: ID! """ siteIDs are the IDs of the Sites on which the User should have their role promoted. """ siteIDs: [String!]! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type PromoteModeratorPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } ################## # demoteModerator ################## input DemoteModeratorInput { """ userID is the ID of the User that should have their moderator role demoted. """ userID: ID! """ siteIDs are the IDs of the Sites on which the User should have their moderator role demoted. """ siteIDs: [String!]! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type DemoteModeratorPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } ################## # promoteMember ################## input PromoteMemberInput { """ userID is the ID of the User that should have their member role promoted. """ userID: ID! """ siteIDs are the IDs of the Sites on which the User should have their member role promoted. """ siteIDs: [String!]! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type PromoteMemberPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } ################## # demoteMember ################## input DemoteMemberInput { """ userID is the ID of the User that should have their member role demoted. """ userID: ID! """ siteIDs are the IDs of the Sites on which the User should have their member role demoted. """ siteIDs: [String!]! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type DemoteMemberPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } ################## # warnUser ################## input WarnUserInput { """ userID is the ID of the User that should have their account banned. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! """ message is displayed to the user in the stream """ message: String! } type WarnUserPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } input RemoveUserWarningInput { """ userID is the ID of the User that should be warned. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RemoveUserWarningPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } input AcknowledgeWarningInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! } type AcknowledgeWarningPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } ################## # sendModMessage ################## input SendModMessageInput { """ userID is the ID of the User that should have their account messaged. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! """ message is displayed to the user in the stream """ message: String! } type SendModMessagePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } input AcknowledgeModMessageInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! } type AcknowledgeModMessagePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the possibly modified User. """ user: User! } ################## # banUser ################## input BanUserInput { """ userID is the ID of the User that should have their account banned. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! """ message is sent to banned user via email. """ message: String! """ site ID's to scope the ban to. """ siteIDs: [ID!] """ whether or not to reject all the user's previous comments when banning them. """ rejectExistingComments: Boolean """ rejectionReason is the reason provided for why any existing comments are being rejected if DSA is enabled """ rejectionReason: RejectCommentReasonInput } type BanUserPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } input UpdateUserBanInput { """ userID is the id of the user whose ban status should be updated """ userID: ID! """ banSiteIDs are the ids of sites on which the user should be banned """ banSiteIDs: [ID!] """ unbanSiteIDs are the ids of sites on which the user should be unbanned """ unbanSiteIDs: [ID!] """ message is the message that should be sent to the user (if sites have been added to their ban list) """ message: String! """ rejectExistingComments is whether existing comments should be rejected on sites on which the user has been newly banned, if any. """ rejectExistingComments: Boolean """ rejectionReason is the reason provided for why any existing comments are being rejected if DSA is enabled """ rejectionReason: RejectCommentReasonInput """ clientMutationID is required for relay support """ clientMutationId: String! } type UpdateUserBanPayload { """ user is the updated user """ user: User! """ clientMutationID is required for relay support """ clientMutationId: String! } ################## # suspendUser ################## input SuspendUserInput { """ userID is the ID of the User that should be suspended. """ userID: ID! """ timeout is the length of time (in seconds) that a User should be suspended for. """ timeout: Int! """ clientMutationId is required for Relay support. """ clientMutationId: String! """ message is sent to suspended user via email. """ message: String! } type SuspendUserPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # removeUserBan ################## input RemoveUserBanInput { """ userID is the ID of the User that should have their account un-banned. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RemoveUserBanPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # removeUserSuspension ################## input RemoveUserSuspensionInput { """ userID is the ID of the User that should have their active suspensions removed. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RemoveUserSuspensionPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # premodUser ################## input PremodUserInput { """ userID is the ID of the User that should be premodded. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type PremodUserPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # removePremod ################## input RemovePremodUserInput { """ userID is the ID of the User that should be premodded. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RemovePremodUserPayload { """ user is the possibly modified User. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # ignoreUser ################## input IgnoreUserInput { """ userID is the ID of the User that should be ignored. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type IgnoreUserPayload { """ user is the User that we just ignored. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## # removeUserIgnore ################## input RemoveUserIgnoreInput { """ userID is the ID of the User that should have the ignore removed. """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RemoveUserIgnorePayload { """ user is the User that we removed the ignore from. """ user: User! """ clientMutationId is required for Relay support. """ clientMutationId: String! } ######################### # requestCommentsDownload ######################### input RequestCommentsDownloadInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RequestCommentsDownloadPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! } ######################### # requestUserCommentsDownload ######################### input RequestUserCommentsDownloadInput { """ userID specifies user to download comments for """ userID: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RequestUserCommentsDownloadPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ archiveURL is the archive url """ archiveURL: String! } ######################### # enableFeatureFlag ######################### input EnableFeatureFlagInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ flag is the feature flag to create. """ flag: FEATURE_FLAG! } type EnableFeatureFlagPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ flags is the current set of flags enabled. """ flags: [FEATURE_FLAG!]! } ######################### ## rotateSSOSigningSecret ######################### input RotateSSOSigningSecretInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ inactiveIn is the number of seconds that the current active SigningSecret should be kept active (allow signed tokens signed with this secret) before rejecting them. """ inactiveIn: Int! } type RotateSSOSigningSecretPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ settings is the Settings that the SSO secret was regenerated on. """ settings: Settings } ######################### ## updateSSOProfileID ######################### input UpdateSSOProfileIDInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ userID is the ID of the user whose SSOProfile ID is being updated. """ userID: ID! """ ssoProfileID is the new ID to set for the user's SSOProfile ID. """ ssoProfileID: String! } type UpdateSSOProfileIDPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ user is the User whose SSOProfile ID is being updated. """ user: User! } ######################### ## deactivateSSOSigningSecret ######################### input DeactivateSSOSigningSecretInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ kid is the ID of the SigningSecret being deactivated. """ kid: ID! } type DeactivateSSOSigningSecretPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ settings is the Settings that the SSO secret was regenerated on. """ settings: Settings } ######################### ## deleteSSOSigningSecret ######################### input DeleteSSOSigningSecretInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ kid is the ID of the SigningSecret being deleted. """ kid: ID! } type DeleteSSOSigningSecretPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ settings is the Settings that the SSO secret was regenerated on. """ settings: Settings } ######################### # disableFeatureFlag ######################### input DisableFeatureFlagInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ flag is the feature flag to delete. """ flag: FEATURE_FLAG! } type DisableFeatureFlagPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ flags is the current set of flags enabled. """ flags: [FEATURE_FLAG!]! } ######################### # addStoryExpert ######################### input AddStoryExpertInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ storyID is the story to add the expert to. """ storyID: ID! """ userID is the user to add as an expert to the story. """ userID: ID! } type AddStoryExpertPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ story is the resultant story the expert was added to. """ story: Story! } ######################### # removeStoryExpert ######################### input RemoveStoryExpertInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ storyID is the story to remove the expert from. """ storyID: ID! """ userID is the user to remove as an expert from the story. """ userID: ID! } type RemoveStoryExpertPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ story is the resultant story the expert was removed from. """ story: Story! } ######################### ## updateStoryMode ######################### input UpdateStoryModeInput { """ storyID is the story id to enable Q&A on. """ storyID: ID! """ mode is the mode to set the story to. """ mode: STORY_MODE! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type UpdateStoryModePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ story is the resultant story that Q&A was enabled on. """ story: Story! } ######################### ## createFlairBadge ######################### input CreateFlairBadgeInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ name is the name of the flair badge to be created """ name: String! """ url is the url of the flair badge to be created """ url: String! } type CreateFlairBadgePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ settings is the Settings that the flair badge configuration was created on. """ settings: Settings! } ######################### ## deleteFlairBadge ######################### input DeleteFlairBadgeInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ name is the name of the flair badge to be deleted """ name: String! } type DeleteFlairBadgePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ settings is the Settings that the flair badge configuration was deleted on. """ settings: Settings! } ################## ## createEmailDomain ################## input CreateEmailDomain { """ domain is the email domain that was configured """ domain: String! """ newUserModeration is how new users on this domain should be moderated """ newUserModeration: NEW_USER_MODERATION! } input CreateEmailDomainInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ domain is the email domain that was configured """ domain: String! """ newUserModeration is how new users on this domain should be moderated """ newUserModeration: NEW_USER_MODERATION! } type CreateEmailDomainPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ settings is the Settings that the email domain configuration was created on. """ settings: Settings! } ################## ## updateEmailDomain ################## input UpdateEmailDomainInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the identifier for the email domain that was configured """ id: String! """ domain is the email domain that was configured """ domain: String! """ newUserModeration is how new users on this domain should be moderated """ newUserModeration: NEW_USER_MODERATION! } type UpdateEmailDomainPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ settings is the Settings that the email domain configuration was updated on. """ settings: Settings! } ################## ## deleteEmailDomain ################## input DeleteEmailDomainInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the identifier for the email domain that is to be deleted """ id: String! } type DeleteEmailDomainPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ settings is the Settings from which the email domain configuration was deleted. """ settings: Settings! } ################## ## createSite ################## input CreateSite { """ name is the name of the Site. """ name: String! """ allowedOrigins are the allowed origins for embeds. """ allowedOrigins: [String!]! } input CreateSiteInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ site is the input for the Site to create. """ site: CreateSite! } type CreateSitePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ site is the Site that was newly created. """ site: Site! } ################## ## updateSite ################## input UpdateSite { """ name is the name of the Site. """ name: String """ url is the Site URL, seen in email communications. """ url: String """ contactEmail is the contact email for the Site, seen in email communications. """ contactEmail: String """ allowedOrigins are the allowed origins for embeds. """ allowedOrigins: [String!] } input UpdateSiteInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the ID of the Site to update. """ id: ID! """ site is the updates for the Site. """ site: UpdateSite! } type UpdateSitePayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ site is the newly updated Site. """ site: Site! } input TestSMTPInput { clientMutationId: String! } type TestSMTPPayload { clientMutationId: String! } input ReviewCommentFlagInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ id is the id of the Flag being reviewed. """ id: ID! } type ReviewCommentFlagPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ flag is the flag that was reviewed by the review action. """ flag: Flag! } input ArchiveStoriesInput { clientMutationId: String! storyIDs: [ID!]! } type ArchiveStoriesPayload { clientMutationId: String! stories: [Story!]! } input UnarchiveStoriesInput { clientMutationId: String! storyIDs: [ID!]! } type UnarchiveStoriesPayload { clientMutationId: String! stories: [Story!]! } input MarkCommentsAsSeenInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ storyID is the story of the comment this is for. """ storyID: ID! """ commentID is the comment to be marked as seen. """ commentIDs: [ID!]! """ orderBy is the current sort of comments in the stream. """ orderBy: COMMENT_SORT """ updateSeen is whether to update the comment(s) as seen. """ updateSeen: Boolean """ markAllAsSeen marks all comments as seen. """ markAllAsSeen: Boolean } type MarkCommentsAsSeenPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ comment is the comment that has been marked as seen. """ comments: [Comment!]! } input RefreshStoryCountsInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ storyID is the story we want to update counts for. """ storyID: String! """ tags if true will update the tag counts for the story. """ tags: Boolean! } type RefreshStoryCountsPayload { """ clientMutationId is required for Relay support. """ clientMutationId: String! """ story is the story that was updated. """ story: Story } ################## ## cacheStory ################## input CacheStoryInput { """ id is the identifier of the Story whose comment and user data will be scheduled for caching in Redis. """ id: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type CacheStoryPayload { """ story is the Story that was scheduled for caching in Redis. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ########################## ## invalidateCachedStory ########################## input InvalidateCachedStoryInput { """ id is the identifier of the Story whose data cache will be invalidated in Redis. """ id: ID! """ clientMutationId is required for Relay support. """ clientMutationId: String! } type InvalidateCachedStoryPayload { """ story is the Story whose data cache was invalidated in Redis. """ story: Story """ clientMutationId is required for Relay support. """ clientMutationId: String! } ################## ## Redis ################## input FlushRedisInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! } type FlushRedisPayload { clientMutationId: String! } input RefreshDisposableEmailDomainsInput { """ clientMutationId is required for Relay support. """ clientMutationId: String! } type RefreshDisposableEmailDomainsPayload { clientMutationId: String! } ################## ## Mutation ################## type Mutation { """ createComment will create a Comment as the current logged in User. """ createComment(input: CreateCommentInput!): CreateCommentPayload! @auth @rate(seconds: 3, key: "createComment") """ createCommentReply will create a Comment as the current logged in User that is in reply to another Comment. """ createCommentReply( input: CreateCommentReplyInput! ): CreateCommentReplyPayload! @auth @rate(seconds: 3, key: "createComment") """ editComment will allow the author of a comment to change the body within the time allotment. """ editComment(input: EditCommentInput!): EditCommentPayload! @auth """ updateSettings will update the Settings for the given Tenant. """ updateSettings(input: UpdateSettingsInput!): UpdateSettingsPayload! @auth(roles: [ADMIN]) """ rotateSSOSigningSecret can be used to rotate a given active SigningSecret. """ rotateSSOSigningSecret( input: RotateSSOSigningSecretInput! ): RotateSSOSigningSecretPayload! @auth(roles: [ADMIN]) """ deactivateSSOSigningSecret will deactivate a given deactivated SigningSecret. """ deactivateSSOSigningSecret( input: DeactivateSSOSigningSecretInput! ): DeactivateSSOSigningSecretPayload! @auth(roles: [ADMIN]) """ deleteSSOSigningSecret will delete a given inactive SigningSecret. """ deleteSSOSigningSecret( input: DeleteSSOSigningSecretInput! ): DeleteSSOSigningSecretPayload! @auth(roles: [ADMIN]) updateSSOProfileID( input: UpdateSSOProfileIDInput! ): UpdateSSOProfileIDPayload! @auth(roles: [ADMIN]) """ createCommentReaction will create a Reaction authored by the current logged in User on a Comment. """ createCommentReaction( input: CreateCommentReactionInput! ): CreateCommentReactionPayload @auth @rate(max: 2, seconds: 1) """ removeCommentReaction will remove a Reaction authored by the current logged in User on a Comment if it exists. """ removeCommentReaction( input: RemoveCommentReactionInput! ): RemoveCommentReactionPayload @auth @rate(max: 2, seconds: 1) """ createCommentDontAgree will create a DontAgree authored by the current logged in User on a Comment. """ createCommentDontAgree( input: CreateCommentDontAgreeInput! ): CreateCommentDontAgreePayload @auth @rate(seconds: 3) """ removeCommentDontAgree will remove a DontAgree authored by the current logged in User on a Comment if it exists. """ removeCommentDontAgree( input: RemoveCommentDontAgreeInput! ): RemoveCommentDontAgreePayload @auth @rate(seconds: 3) """ createCommentFlag will create a Flag authored by the current logged in User on a given Comment. """ createCommentFlag(input: CreateCommentFlagInput!): CreateCommentFlagPayload! @auth @rate(max: 2, seconds: 3) """ featureComment will mark a given Comment as featured. """ featureComment(input: FeatureCommentInput!): FeatureCommentPayload! @auth(roles: [ADMIN, MODERATOR]) """ unfeatureComment will remove the featured tag from a Comment that is featured. """ unfeatureComment(input: UnfeatureCommentInput!): UnfeatureCommentPayload! @auth(roles: [ADMIN, MODERATOR]) """ createStory will create the provided Story. """ createStory(input: CreateStoryInput!): CreateStoryPayload! @auth(roles: [ADMIN]) """ updateStory will update the given Story. """ updateStory(input: UpdateStoryInput!): UpdateStoryPayload! @auth(roles: [ADMIN]) """ updateStory will update the given Story's settings. """ updateStorySettings( input: UpdateStorySettingsInput! ): UpdateStorySettingsPayload! @auth(roles: [ADMIN, MODERATOR]) """ closeStory will close the given story for commenting. """ closeStory(input: CloseStoryInput!): CloseStoryPayload! @auth(roles: [ADMIN, MODERATOR]) """ openStory will open the given story for commenting. """ openStory(input: OpenStoryInput!): OpenStoryPayload! @auth(roles: [ADMIN, MODERATOR]) """ mergeStories will merge two stories together, merging their comment streams. This operation is irreversible. """ mergeStories(input: MergeStoriesInput!): MergeStoriesPayload! @auth(roles: [ADMIN]) """ removeStory will remove the given Story. """ removeStory(input: RemoveStoryInput!): RemoveStoryPayload! @auth(roles: [ADMIN]) """ scrapeStory will scrape the given Story and update the scraped metadata. """ scrapeStory(input: ScrapeStoryInput!): ScrapeStoryPayload! @auth(roles: [ADMIN, MODERATOR]) """ approveComment will mark the Comment as APPROVED. """ approveComment(input: ApproveCommentInput!): ApproveCommentPayload! @auth(roles: [MODERATOR, ADMIN]) """ rejectComment will mark the Comment as REJECTED. """ rejectComment(input: RejectCommentInput!): RejectCommentPayload! @auth(roles: [MODERATOR, ADMIN]) """ inviteUsers will send emails to the users with a new account at the designated role. """ inviteUsers(input: InviteUsersInput!): InviteUsersPayload! @auth(roles: [ADMIN]) """ setUsername will set the username on the current User if they have not set one before. This mutation will fail if the username is already set. """ setUsername(input: SetUsernameInput!): SetUsernamePayload! @auth( permit: [ MISSING_NAME MISSING_EMAIL SUSPENDED BANNED PENDING_DELETION WARNED ] ) """ updateBio will update the users bio. """ updateBio(input: UpdateBioInput!): UpdateBioPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ updateUsername will update the users username. """ updateUsername(input: UpdateUsernameInput!): UpdateUsernamePayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) @rate(seconds: 10) """ setEmail will set the email address on the current User if they have not set one already. This mutation will fail if the email address is already set. """ setEmail(input: SetEmailInput!): SetEmailPayload! @auth( permit: [ MISSING_NAME MISSING_EMAIL SUSPENDED BANNED PENDING_DELETION WARNED ] ) """ setPassword will set the password on the current User if they have not set one already. This mutation will fail if the password is already set. """ setPassword(input: SetPasswordInput!): SetPasswordPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ updatePassword allows the current logged in User to change their password if they already have one associated with them. """ updatePassword(input: UpdatePasswordInput!): UpdatePasswordPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) @rate(seconds: 10) """ requestAccountDeletion allows the current logged in User to request to delete their account. """ requestAccountDeletion( input: RequestAccountDeletionInput! ): RequestAccountDeletionPayload! @auth(permit: [SUSPENDED, BANNED, WARNED]) @rate(seconds: 10) """ scheduleAccountDeletion allows an admin to schedule an account deletion for a target user """ scheduleAccountDeletion( input: ScheduleAccountDeletionInput! ): ScheduleAccountDeletionPayload! @auth(roles: [ADMIN]) """ cancelScheduledAccountDeletion allows an admin to cancel a scheduled account deletion for a target user """ cancelScheduledAccountDeletion( input: CancelScheduledAccountDeletionInput! ): CancelScheduledAccountDeletionPayload! @auth(roles: [ADMIN]) """ deleteUserAccount will delete the target user now. """ deleteUserAccount(input: DeleteUserAccountInput!): DeleteUserAccountPayload! @auth(roles: [ADMIN]) """ cancelAccountDeletion allows the current logged in User to cancel the request to delete their account """ cancelAccountDeletion( input: CancelAccountDeletionInput! ): CancelAccountDeletionPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ createToken allows an administrator to create a Token based on the current logged in User. """ createToken(input: CreateTokenInput!): CreateTokenPayload! @auth(roles: [ADMIN]) """ deactivateToken will deactivate the current logged in User's Token based on the input. """ deactivateToken(input: DeactivateTokenInput!): DeactivateTokenPayload! @auth(roles: [ADMIN]) """ updateUserUsername allows administrators to update a given User's username to the one provided. """ updateUserUsername( input: UpdateUserUsernameInput! ): UpdateUserUsernamePayload! @auth(roles: [ADMIN]) """ updateEmail will update the current users email address. """ updateEmail(input: UpdateEmailInput!): UpdateEmailPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) @rate(seconds: 10) """ updateEmailNotificationSettings can be used to update the email notification settings for the current logged in user. """ updateEmailNotificationSettings( input: UpdateEmailNotificationSettingsInput! ): UpdateEmailNotificationSettingsPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ updateInPageNotificationSettings can be used to update the in-page notification settings for the current logged in user. """ updateInPageNotificationSettings( input: UpdateInPageNotificationSettingsInput! ): UpdateInPageNotificationSettingsPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ updateUserMediaSettings can be used to update the media preferences for the current logged in user. """ updateUserMediaSettings( input: UpdateUserMediaSettingsInput! ): UpdateUserMediaSettingsPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ updateUserEmail allows administrators to update a given User's email address to the one provided. """ updateUserEmail(input: UpdateUserEmailInput!): UpdateUserEmailPayload! @auth(roles: [ADMIN]) """ updateUserAvatar allows administrators to update a given User's avatar to the one provided. """ updateUserAvatar(input: UpdateUserAvatarInput!): UpdateUserAvatarPayload! @auth(roles: [ADMIN]) """ updateUserRole will update a given User's role. """ updateUserRole(input: UpdateUserRoleInput!): UpdateUserRolePayload! @auth(roles: [ADMIN, MODERATOR]) """ promoteModerator will allow the viewer to add one or many scopes that applies to the viewer. If the target user was not already a site moderator, their role is set to site moderator. """ promoteModerator(input: PromoteModeratorInput!): PromoteModeratorPayload! @auth(roles: [MODERATOR]) """ demoteModerator will allow the viewer to remove one or many scopes that applies to the viewer and the target user. If the target user does not have any remaining scopes, they are set to commenter. """ demoteModerator(input: DemoteModeratorInput!): DemoteModeratorPayload! @auth(roles: [MODERATOR]) """ promoteMember will allow the viewer to add one or many scopes that applies to the viewer. """ promoteMember(input: PromoteMemberInput!): PromoteModeratorPayload! @auth(roles: [MODERATOR]) """ demoteMember will allow the viewer to remove one or many scopes that applies to the viewer and the target user. If the target user does not have any remaining scopes, they are set to commenter. """ demoteMember(input: DemoteMemberInput!): DemoteModeratorPayload! @auth(roles: [MODERATOR]) """ updateUserModerationScopes will update the moderation scopes for a given user. This is used to limit the scopes for which a given moderator can moderate if they also have the moderator role. """ updateUserModerationScopes( input: UpdateUserModerationScopesInput! ): UpdateUserModerationScopesPayload! @auth(roles: [ADMIN, MODERATOR]) """ updateUserMembershipScopes will update the membership scopes for a given user. This is used to limit the sites on which a user is a member given that they also have the member role. """ updateUserMembershipScopes( input: UpdateUserMembershipScopesInput! ): UpdateUserMembershipScopesPayload! @auth(roles: [ADMIN, MODERATOR]) """ banUser will ban a specific User from interacting with Comments. """ banUser(input: BanUserInput!): BanUserPayload! @auth(roles: [ADMIN, MODERATOR]) """ updateUserBan will ban a specified user from specified sites (if not already banned from them) and unban a user from specified sites (if currently banned from them) """ updateUserBan(input: UpdateUserBanInput!): UpdateUserBanPayload! @auth(roles: [ADMIN, MODERATOR], unscoped: false) """ removeUserBan will remove an active ban from a User if they have one """ removeUserBan(input: RemoveUserBanInput!): RemoveUserBanPayload! @auth(roles: [ADMIN, MODERATOR], unscoped: true) """ suspendUser will suspend a specific User from interacting with Comments. """ suspendUser(input: SuspendUserInput!): SuspendUserPayload! @auth(roles: [ADMIN, MODERATOR]) """ warnUser will warn a user and prevent them from commenting until they acknowledge """ warnUser(input: WarnUserInput!): WarnUserPayload! @auth(roles: [ADMIN, MODERATOR]) """ removeUserWarning will remove a user warning """ removeUserWarning(input: RemoveUserWarningInput!): RemoveUserWarningPayload! @auth(roles: [ADMIN, MODERATOR]) """ acknowledgeWarning will remove a warning """ acknowledgeWarning( input: AcknowledgeWarningInput! ): AcknowledgeWarningPayload @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ sendModMessage will send a user a moderation message that they need to acknowledge """ sendModMessage(input: SendModMessageInput!): SendModMessagePayload! @auth(roles: [ADMIN, MODERATOR]) """ acknowledgeModMessage will set moderation messages to inactive """ acknowledgeModMessage( input: AcknowledgeModMessageInput! ): AcknowledgeModMessagePayload @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ removeUserSuspension will remove an active suspension from a User if they have one. """ removeUserSuspension( input: RemoveUserSuspensionInput! ): RemoveUserSuspensionPayload! @auth(roles: [ADMIN, MODERATOR]) """ ignoreUser will mark the given User as ignored by the current logged in User. """ ignoreUser(input: IgnoreUserInput!): IgnoreUserPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ removeUserIgnore will remove the given User from the ignored user list from the current logged in User. """ removeUserIgnore(input: RemoveUserIgnoreInput!): RemoveUserIgnorePayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ requestCommentsDownload allows a user to request to download their comments. """ requestCommentsDownload( input: RequestCommentsDownloadInput! ): RequestCommentsDownloadPayload! @auth(permit: [SUSPENDED, BANNED, PENDING_DELETION, WARNED]) """ requestUserCommentsDownload allows a user to request to download their comments. """ requestUserCommentsDownload( input: RequestUserCommentsDownloadInput! ): RequestUserCommentsDownloadPayload! @auth(roles: [ADMIN]) """ premodUser sets a user to mandatory premod """ premodUser(input: PremodUserInput!): PremodUserPayload! @auth(roles: [ADMIN, MODERATOR]) """ removeUserPremod removes a user from mandatory premod """ removeUserPremod(input: RemovePremodUserInput!): RemovePremodUserPayload! @auth(roles: [ADMIN, MODERATOR]) """ createModeratorNote creates a note on a user account. """ createModeratorNote( input: CreateModeratorNoteInput! ): CreateModeratorNotePayload! @auth(roles: [ADMIN, MODERATOR]) """ deleteModeratorNote deletes a note on a user account. """ deleteModeratorNote( input: DeleteModeratorNoteInput! ): DeleteModeratorNotePayload! @auth(roles: [ADMIN, MODERATOR]) """ enableFeatureFlag will enable a given FEATURE_FLAG. """ enableFeatureFlag(input: EnableFeatureFlagInput!): EnableFeatureFlagPayload! @auth(roles: [ADMIN]) """ disableFeatureFlag will disable a given FEATURE_FLAG """ disableFeatureFlag( input: DisableFeatureFlagInput! ): DisableFeatureFlagPayload! @auth(roles: [ADMIN]) """ createAnnouncement creates a global announcement. """ createAnnouncement( input: CreateAnnouncementInput! ): CreateAnnouncementPayload! @auth(roles: [ADMIN]) """ deleteAnnouncement removes a global announcement. """ deleteAnnouncement( input: DeleteAnnouncementInput! ): DeleteAnnouncementPayload! @auth(roles: [ADMIN]) createSite(input: CreateSiteInput!): CreateSitePayload! @auth(roles: [ADMIN]) updateSite(input: UpdateSiteInput!): UpdateSitePayload! @auth(roles: [ADMIN]) """ createFlairBadge creates a custom flair badge url. """ createFlairBadge(input: CreateFlairBadgeInput!): CreateFlairBadgePayload! @auth(roles: [ADMIN]) """ deleteFlairBadge removes a custom flair badge url. """ deleteFlairBadge(input: DeleteFlairBadgeInput!): DeleteFlairBadgePayload! @auth(roles: [ADMIN]) """ createEmailDomain creates an email domain configuration. """ createEmailDomain(input: CreateEmailDomainInput!): CreateEmailDomainPayload! @auth(roles: [ADMIN, MODERATOR]) """ updateEmailDomain updates an email domain configuration. """ updateEmailDomain(input: UpdateEmailDomainInput!): UpdateEmailDomainPayload! @auth(roles: [ADMIN]) """ deleteEmailDomain deletes an email domain configuration. """ deleteEmailDomain(input: DeleteEmailDomainInput!): DeleteEmailDomainPayload! @auth(roles: [ADMIN]) """ createWebhookEndpoint will create a new WebhookEndpoint. """ createWebhookEndpoint( input: CreateWebhookEndpointInput! ): CreateWebhookEndpointPayload! @auth(roles: [ADMIN]) """ updateWebhookEndpoint will update a WebhookEndpoint. """ updateWebhookEndpoint( input: UpdateWebhookEndpointInput! ): UpdateWebhookEndpointPayload! @auth(roles: [ADMIN]) """ enableWebhookEndpoint will enable a WebhookEndpoint to receive new events. """ enableWebhookEndpoint( input: EnableWebhookEndpointInput! ): EnableWebhookEndpointPayload! @auth(roles: [ADMIN]) """ disableWebhookEndpoint will disable a WebhookEndpoint from receiving new events. """ disableWebhookEndpoint( input: DisableWebhookEndpointInput! ): DisableWebhookEndpointPayload! @auth(roles: [ADMIN]) """ deleteWebhookEndpoint will delete a WebhookEndpoint. """ deleteWebhookEndpoint( input: DeleteWebhookEndpointInput! ): DeleteWebhookEndpointPayload! @auth(roles: [ADMIN]) """ rotateWebhookEndpointSigningSecret will roll the current active secret to a new key. """ rotateWebhookEndpointSigningSecret( input: RotateWebhookEndpointSigningSecretInput! ): RotateWebhookEndpointSigningSecretPayload! @auth(roles: [ADMIN]) """ createExternalModerationPhase will create a new ExternalModerationPhase. """ createExternalModerationPhase( input: CreateExternalModerationPhaseInput! ): CreateExternalModerationPhasePayload! @auth(roles: [ADMIN]) """ updateExternalModerationPhase will update a ExternalModerationPhase. """ updateExternalModerationPhase( input: UpdateExternalModerationPhaseInput! ): UpdateExternalModerationPhasePayload! @auth(roles: [ADMIN]) """ enableExternalModerationPhase will enable a ExternalModerationPhase to receive new comments. """ enableExternalModerationPhase( input: EnableExternalModerationPhaseInput! ): EnableExternalModerationPhasePayload! @auth(roles: [ADMIN]) """ disableExternalModerationPhase will disable a ExternalModerationPhase from receiving new comments. """ disableExternalModerationPhase( input: DisableExternalModerationPhaseInput! ): DisableExternalModerationPhasePayload! @auth(roles: [ADMIN]) """ deleteExternalModerationPhase will delete a ExternalModerationPhase. """ deleteExternalModerationPhase( input: DeleteExternalModerationPhaseInput! ): DeleteExternalModerationPhasePayload! @auth(roles: [ADMIN]) """ rotateExternalModerationPhaseSigningSecret will roll the current active secret to a new key. """ rotateExternalModerationPhaseSigningSecret( input: RotateExternalModerationPhaseSigningSecretInput! ): RotateExternalModerationPhaseSigningSecretPayload! @auth(roles: [ADMIN]) """ updateStoryMode will set the story mode. """ updateStoryMode(input: UpdateStoryModeInput!): UpdateStoryModePayload! @auth(roles: [ADMIN, MODERATOR]) """ addStoryExpert adds an expert to a story. """ addStoryExpert(input: AddStoryExpertInput!): AddStoryExpertPayload! @auth(roles: [ADMIN, MODERATOR]) """ removeStoryExpert removes an expert from a story. """ removeStoryExpert(input: RemoveStoryExpertInput!): RemoveStoryExpertPayload! @auth(roles: [ADMIN, MODERATOR]) """ testSMTP sends a test email. """ testSMTP(input: TestSMTPInput!): TestSMTPPayload! @auth(roles: [ADMIN]) @rate(seconds: 10) """ reviewCommentFlag marks comment flag as reviewed """ reviewCommentFlag(input: ReviewCommentFlagInput!): ReviewCommentFlagPayload! @auth(roles: [ADMIN, MODERATOR]) archiveStories(input: ArchiveStoriesInput!): ArchiveStoriesPayload! @auth(roles: [ADMIN]) unarchiveStories(input: UnarchiveStoriesInput!): UnarchiveStoriesPayload! @auth(roles: [ADMIN]) """ markCommentsAsSeen will set the seen state to true for the commentIDs provided. Seen state is stored per user, per story. It will do nothing if the request is not issued with a valid logged in user token. """ markCommentsAsSeen( input: MarkCommentsAsSeenInput! ): MarkCommentsAsSeenPayload! """ refreshStoryCounts will recompute the cached counts for a story based on which flags are set to recompute in the operation input. """ refreshStoryCounts( input: RefreshStoryCountsInput! ): RefreshStoryCountsPayload! @auth(roles: [ADMIN]) """ cacheStory will cache the given Story and its comments into redis for fast retrieval avoiding Mongo resources to load the story data. """ cacheStory(input: CacheStoryInput!): CacheStoryPayload! @auth(roles: [ADMIN, MODERATOR]) """ invalidateCachedStory will invalidate any cached data for a story whose stream may be cached in redis. """ invalidateCachedStory( input: InvalidateCachedStoryInput! ): InvalidateCachedStoryPayload! @auth(roles: [ADMIN, MODERATOR]) """ flushRedis flushes the redis instance. """ flushRedis(input: FlushRedisInput!): FlushRedisPayload! @auth(roles: [ADMIN]) """ refreshDisposableEmailDomains will refresh disposable email domains in Redis """ refreshDisposableEmailDomains( input: RefreshDisposableEmailDomainsInput! ): RefreshDisposableEmailDomainsPayload! @auth(roles: [ADMIN]) """ createDSAReport creates a DSAReport for the provided comment """ createDSAReport(input: CreateDSAReportInput!): CreateDSAReportPayload! """ addDSAReportNote adds a note to the history for a DSAReport """ addDSAReportNote(input: AddDSAReportNoteInput!): AddDSAReportNotePayload! """ addDSAReportShare adds that the report was downloaded and shared to the history for a DSAReport """ addDSAReportShare(input: AddDSAReportShareInput!): AddDSAReportSharePayload! """ deleteDSAReportNote deletes a note from the history for a DSAReport """ deleteDSAReportNote( input: DeleteDSAReportNoteInput! ): DeleteDSAReportNotePayload! """ changeDSAReportStatus changes the status of a DSAReport and adds the status change to the history for a DSAReport """ changeDSAReportStatus( input: ChangeDSAReportStatusInput! ): ChangeDSAReportStatusPayload! """ makeDSAReportDecision makes a legality decision for a DSAReport and adds the decision to the history for a DSAReport """ makeDSAReportDecision( input: MakeDSAReportDecisionInput! ): MakeDSAReportDecisionPayload! } ################## ## Subscriptions ################## """ CommentStatusUpdatedPayload is returned when a Comment has it's status updated after it was created. """ type CommentStatusUpdatedPayload { """ newStatus is the new status assigned to the Comment. This status may not match the status provided by `comment.status` due to race conditions in the data loaders. """ newStatus: COMMENT_STATUS! """ oldStatus is the old status that was previously assigned to the Comment. """ oldStatus: COMMENT_STATUS! """ moderator is the User that updated the Comment's status. If null, then the system assigned the new Comment status (for example, when a comment is edited by the author, and now contains a banned word). """ moderator: User """ comment is the updated Comment after the status has been updated. """ comment: Comment! } """ MODERATION_QUEUE references the specific ModerationQueue that a given Comment can be associated with. """ enum MODERATION_QUEUE { """ UNMODERATED refers to the ModerationQueue for all Comments that have not been moderated yet. """ UNMODERATED """ REPORTED refers to the ModerationQueue for all Comments that have been published, have not been moderated by a human yet, and have been reported by a User via a flag. """ REPORTED """ PENDING refers to the ModerationQueue for all Comments that were held back by the system and require moderation in order to be published. """ PENDING } """ CommentEnteredModerationQueuePayload is returned when a Comment enters a specific ModerationQueue. """ type CommentEnteredModerationQueuePayload { """ queue refers to the specific ModerationQueue that a given Comment entered. """ queue: MODERATION_QUEUE! """ comment is the Comment that entered the ModerationQueue. """ comment: Comment! } """ CommentLeftModerationQueuePayload is returned when a Comment leaves a specific ModerationQueue. """ type CommentLeftModerationQueuePayload { """ queue refers to the specific ModerationQueue that a given Comment left. """ queue: MODERATION_QUEUE! """ comment is the Comment that left the ModerationQueue. """ comment: Comment! } """ CommentCreatedPayload is returned when a new top level Comment is created on a Story. """ type CommentCreatedPayload { """ comment is the new top level Comment that was created on the Story. """ comment: Comment! } """ CommentEnteredPayload is returned when a Comment is released on a Story. """ type CommentEnteredPayload { """ comment is the new Comment that was released on the Story. """ comment: Comment! } """ CommentReplyCreatedPayload is returned when a Comment is created as a reply to another Comment where the selected ancestor Comment is in the ancestor chain. """ type CommentReplyCreatedPayload { """ comment is the new reply Comment that was created. """ comment: Comment! } """ CommentFeaturedPayload is returned when a Comment is featured. """ type CommentFeaturedPayload { """ comment is the Comment that was featured. """ comment: Comment! } """ CommentReleasedPayload is returned when a new top level Comment is approved from premod stream """ type CommentReleasedPayload { """ comment is the new top level Comment that was approved on the Story. """ comment: Comment! } """ CommentEditedPayload is returned when a Comment is edited. """ type CommentEditedPayload { """ comment is the Comment that was edited. """ comment: Comment! } type Subscription { """ commentEnteredModerationQueue returns when a Comment enters a ModerationQueue. Note that a Comment may enter multiple moderation queues. """ commentEnteredModerationQueue( storyID: ID siteID: ID section: SectionFilter orderBy: COMMENT_SORT queue: MODERATION_QUEUE ): CommentEnteredModerationQueuePayload! @auth(roles: [MODERATOR, ADMIN]) """ commentLeftModerationQueue returns when a Comment leaves a ModerationQueue. Note that a Comment may leave multiple moderation queues. """ commentLeftModerationQueue( storyID: ID siteID: ID section: SectionFilter orderBy: COMMENT_SORT queue: MODERATION_QUEUE ): CommentLeftModerationQueuePayload! @auth(roles: [MODERATOR, ADMIN]) """ commentStatusUpdated returns when a Comment has it's status changed after being created. """ commentStatusUpdated(id: ID): CommentStatusUpdatedPayload! @auth(roles: [MODERATOR, ADMIN]) """ commentEntered returns when a Comment is created or released anywhere in the Story. """ commentEntered(storyID: ID!, ancestorID: ID): CommentEnteredPayload! """ commentCreated returns when a Comment is created on the top level of a Story that is visible. """ commentCreated(storyID: ID!): CommentCreatedPayload! @deprecated(reason: "Use commentEntered instead") """ commentReleased returns when a Comment on a premoderated stream is approved """ commentReleased(storyID: ID!): CommentReleasedPayload! @deprecated(reason: "Use commentEntered instead") """ commentReplyCreated returns when a Comment is posted in the ancestor chain of comments. """ commentReplyCreated(ancestorID: ID!): CommentReplyCreatedPayload! @deprecated(reason: "Use commentEntered instead") """ commentFeatured returns when a Comment is featured. """ commentFeatured(storyID: ID!): CommentFeaturedPayload! @auth(roles: [MODERATOR, ADMIN]) """ commentEdited returns when a Comment is edited. """ commentEdited(storyID: ID!): CommentEditedPayload! }