discourse/spec/requests/api/schemas/json/site_response.json

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

834 lines
18 KiB
JSON
Raw Normal View History

{
"additionalProperties": false,
"properties": {
"default_archetype": {
"type": "string"
},
"notification_types": {
"type": "object",
"additionalProperties": false,
"properties": {
"mentioned": {
"type": "integer"
},
"replied": {
"type": "integer"
},
"quoted": {
"type": "integer"
},
"edited": {
"type": "integer"
},
"liked": {
"type": "integer"
},
"private_message": {
"type": "integer"
},
"invited_to_private_message": {
"type": "integer"
},
"invitee_accepted": {
"type": "integer"
},
"posted": {
"type": "integer"
},
"watching_category_or_tag": {
"type": "integer"
},
"new_features": {
"type": "integer"
},
"admin_problems": {
"type": "integer"
},
"moved_post": {
"type": "integer"
},
"linked": {
"type": "integer"
},
"granted_badge": {
"type": "integer"
},
"invited_to_topic": {
"type": "integer"
},
"custom": {
"type": "integer"
},
"group_mentioned": {
"type": "integer"
},
"group_message_summary": {
"type": "integer"
},
"watching_first_post": {
"type": "integer"
},
"topic_reminder": {
"type": "integer"
},
"liked_consolidated": {
"type": "integer"
},
"post_approved": {
"type": "integer"
},
"code_review_commit_approved": {
"type": "integer"
},
"membership_request_accepted": {
"type": "integer"
},
"membership_request_consolidated": {
"type": "integer"
},
"bookmark_reminder": {
"type": "integer"
},
"reaction": {
"type": "integer"
},
"votes_released": {
"type": "integer"
},
"event_reminder": {
"type": "integer"
},
"event_invitation": {
"type": "integer"
},
"chat_mention": {
"type": "integer"
},
"chat_message": {
"type": "integer"
},
"chat_invitation": {
"type": "integer"
},
"chat_group_mention": {
"type": "integer"
},
"chat_quoted": {
"type": "integer"
},
"assigned": {
"type": "integer"
},
"question_answer_user_commented": {
"type": "integer"
},
"following": {
"type": "integer"
},
"following_created_topic": {
"type": "integer"
},
"following_replied": {
"type": "integer"
},
"circles_activity": {
"type": "integer"
}
},
"required": [
"mentioned",
"replied",
"quoted",
"edited",
"liked",
"private_message",
"invited_to_private_message",
"invitee_accepted",
"posted",
"watching_category_or_tag",
"moved_post",
"linked",
"granted_badge",
"invited_to_topic",
"custom",
"group_mentioned",
"group_message_summary",
"watching_first_post",
"topic_reminder",
"liked_consolidated",
"post_approved",
"code_review_commit_approved",
"membership_request_accepted",
"membership_request_consolidated",
"bookmark_reminder",
"reaction",
"votes_released",
"event_reminder",
"event_invitation",
"chat_mention",
"chat_message",
"chat_invitation",
"chat_group_mention"
]
},
"post_types": {
"type": "object",
"additionalProperties": false,
"properties": {
"regular": {
"type": "integer"
},
"moderator_action": {
"type": "integer"
},
"small_action": {
"type": "integer"
},
"whisper": {
"type": "integer"
}
},
"required": [
"regular",
"moderator_action",
"small_action",
"whisper"
]
},
"trust_levels": {
"type": "object",
"additionalProperties": false,
"properties": {
"newuser": {
"type": "integer"
},
"basic": {
"type": "integer"
},
"member": {
"type": "integer"
},
"regular": {
"type": "integer"
},
"leader": {
"type": "integer"
}
},
"required": [
"newuser",
"basic",
"member",
"regular",
"leader"
]
},
"user_tips": {
"type": "object",
"additionalProperties": false,
"properties": {
"first_notification": {
"type": "integer"
},
"topic_timeline": {
"type": "integer"
},
"post_menu": {
"type": "integer"
},
"topic_notification_levels": {
"type": "integer"
},
"suggested_topics": {
"type": "integer"
}
},
"required": [
"first_notification",
"topic_timeline",
"post_menu",
"topic_notification_levels",
"suggested_topics"
]
},
"groups": {
"type": "array",
"items":
{
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"flair_url": {
"type": [
"string",
"null"
]
},
"flair_bg_color": {
"type": [
"string",
"null"
]
},
"flair_color": {
"type": [
"string",
"null"
]
}
},
"required": [
"id",
"name",
"flair_url",
"flair_bg_color",
"flair_color"
]
}
},
"filters": {
"type": "array",
"items": {
}
},
"periods": {
"type": "array",
"items": {
}
},
"top_menu_items": {
"type": "array",
"items": {
}
},
"anonymous_top_menu_items": {
"type": "array",
"items": {
}
},
"uncategorized_category_id": {
"type": "integer"
},
"user_field_max_length": {
"type": "integer"
},
"post_action_types": {
"type": "array",
"items":
{
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": ["integer", "null"]
},
"name_key": {
"type": ["string", "null"]
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"short_description": {
"type": "string"
},
"is_flag": {
"type": "boolean"
},
"is_custom_flag": {
"type": "boolean"
}
},
"required": [
"id",
"name_key",
"name",
"description",
"short_description",
"is_flag",
"is_custom_flag"
]
}
},
"topic_flag_types": {
"type": "array",
"items":
{
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": ["integer", "null"]
},
"name_key": {
"type": ["string", "null"]
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"short_description": {
"type": "string"
},
"is_flag": {
"type": "boolean"
},
"is_custom_flag": {
"type": "boolean"
}
},
"required": [
"id",
"name_key",
"name",
"description",
"short_description",
"is_flag",
"is_custom_flag"
]
}
},
"can_create_tag": {
"type": "boolean"
},
"can_tag_topics": {
"type": "boolean"
},
"can_tag_pms": {
"type": "boolean"
},
"tags_filter_regexp": {
"type": "string"
},
"top_tags": {
"type": "array",
"items": {
}
},
"wizard_required": {
"type": "boolean"
},
"can_associate_groups": {
"type": "boolean"
},
"topic_featured_link_allowed_category_ids": {
"type": "array",
"items": {
}
},
"user_themes": {
"type": "array",
"items":
{
"type": "object",
"additionalProperties": false,
"properties": {
"theme_id": {
"type": "integer"
},
"name": {
"type": "string"
},
"default": {
"type": "boolean"
},
"color_scheme_id": {
"type": [
"integer",
"null"
]
}
},
"required": [
"theme_id",
"name",
"default",
"color_scheme_id"
]
}
},
"user_color_schemes": {
"type": "array",
"items":
{
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"is_dark": {
"type": "boolean"
}
},
"required": [
"id",
"name",
"is_dark"
]
}
},
"default_dark_color_scheme": {
"type": [
"object",
"null"
]
},
"censored_regexp": {
FEATURE: Add support for case-sensitive Watched Words (#17445) * FEATURE: Add case-sensitivity flag to watched_words Currently, all watched words are matched case-insensitively. This flag allows a watched word to be flagged for case-sensitive matching. To allow allow for backwards compatibility the flag is set to false by default. * FEATURE: Support case-sensitive creation of Watched Words via API Extend admin creation and upload of Watched Words to support case sensitive flag. This lays the ground work for supporting case-insensitive matching of Watched Words. Support for an extra column has also been introduced for the Watched Words upload CSV file. The new column structure is as follows: word,replacement,case_sentive * FEATURE: Enable case-sensitive matching of Watched Words WordWatcher's word_matcher_regexp now returns a list of regular expressions instead of one case-insensitive regular expression. With the ability to flag a Watched Word as case-sensitive, an action can have words of both sensitivities.This makes the use of the global Regexp::IGNORECASE flag added to all words problematic. To get around platform limitations around the use of subexpression level switches/flags, a list of regular expressions is returned instead, one for each case sensitivity. Word matching has also been updated to use this list of regular expressions instead of one. * FEATURE: Use case-sensitive regular expressions for Watched Words Update Watched Words regular expressions matching and processing to handle the extra metadata which comes along with the introduction of case-sensitive Watched Words. This allows case-sensitive Watched Words to matched as such. * DEV: Simplify type casting of case-sensitive flag from uploads Use builtin semantics instead of a custom method for converting string case flags in uploaded Watched Words to boolean. * UX: Add case-sensitivity details to Admin Watched Words UI Update Watched Word form to include a toggle for case-sensitivity. This also adds support for, case-sensitive testing and matching of Watched Word in the admin UI. * DEV: Code improvements from review feedback - Extract watched word regex creation out to a utility function - Make JS array presence check more explicit and readable * DEV: Extract Watched Word regex creation to utility function Clean-up work from review feedback. Reduce code duplication. * DEV: Rename word_matcher_regexp to word_matcher_regexp_list Since a list is returned now instead of a single regular expression, change `word_matcher_regexp` to `word_matcher_regexp_list` to better communicate this change. * DEV: Incorporate WordWatcher updates from upstream Resolve conflicts and ensure apply_to_text does not remove non-word characters in matches that aren't at the beginning of the line.
2022-08-02 04:06:03 -04:00
"type": "array",
"items": {
"type": "object"
}
},
"custom_emoji_translation": {
"type": "object",
"additionalProperties": false,
"properties": {
}
},
"watched_words_replace": {
"type": [
"string",
"null"
]
},
"watched_words_link": {
"type": [
"string",
"null"
]
},
"markdown_additional_options" : {
"type": "object"
},
FEATURE: Generic hashtag autocomplete lookup and markdown cooking (#18937) This commit fleshes out and adds functionality for the new `#hashtag` search and lookup system, still hidden behind the `enable_experimental_hashtag_autocomplete` feature flag. **Serverside** We have two plugin API registration methods that are used to define data sources (`register_hashtag_data_source`) and hashtag result type priorities depending on the context (`register_hashtag_type_in_context`). Reading the comments in plugin.rb should make it clear what these are doing. Reading the `HashtagAutocompleteService` in full will likely help a lot as well. Each data source is responsible for providing its own **lookup** and **search** method that returns hashtag results based on the arguments provided. For example, the category hashtag data source has to take into account parent categories and how they relate, and each data source has to define their own icon to use for the hashtag, and so on. The `Site` serializer has two new attributes that source data from `HashtagAutocompleteService`. There is `hashtag_icons` that is just a simple array of all the different icons that can be used for allowlisting in our markdown pipeline, and there is `hashtag_context_configurations` that is used to store the type priority orders for each registered context. When sending emails, we cannot render the SVG icons for hashtags, so we need to change the HTML hashtags to the normal `#hashtag` text. **Markdown** The `hashtag-autocomplete.js` file is where I have added the new `hashtag-autocomplete` markdown rule, and like all of our rules this is used to cook the raw text on both the clientside and on the serverside using MiniRacer. Only on the server side do we actually reach out to the database with the `hashtagLookup` function, on the clientside we just render a plainer version of the hashtag HTML. Only in the composer preview do we do further lookups based on this. This rule is the first one (that I can find) that uses the `currentUser` based on a passed in `user_id` for guardian checks in markdown rendering code. This is the `last_editor_id` for both the post and chat message. In some cases we need to cook without a user present, so the `Discourse.system_user` is used in this case. **Chat Channels** This also contains the changes required for chat so that chat channels can be used as a data source for hashtag searches and lookups. This data source will only be used when `enable_experimental_hashtag_autocomplete` is `true`, so we don't have to worry about channel results suddenly turning up. ------ **Known Rough Edges** - Onebox excerpts will not render the icon svg/use tags, I plan to address that in a follow up PR - Selecting a hashtag + pressing the Quote button will result in weird behaviour, I plan to address that in a follow up PR - Mixed hashtag contexts for hashtags without a type suffix will not work correctly, e.g. #ux which is both a category and a channel slug will resolve to a category when used inside a post or within a [chat] transcript in that post. Users can get around this manually by adding the correct suffix, for example ::channel. We may get to this at some point in future - Icons will not show for the hashtags in emails since SVG support is so terrible in email (this is not likely to be resolved, but still noting for posterity) - Additional refinements and review fixes wil
2022-11-20 17:37:06 -05:00
"hashtag_configurations" : {
"type": "object"
},
"hashtag_icons" : {
"type": "object"
FEATURE: Generic hashtag autocomplete lookup and markdown cooking (#18937) This commit fleshes out and adds functionality for the new `#hashtag` search and lookup system, still hidden behind the `enable_experimental_hashtag_autocomplete` feature flag. **Serverside** We have two plugin API registration methods that are used to define data sources (`register_hashtag_data_source`) and hashtag result type priorities depending on the context (`register_hashtag_type_in_context`). Reading the comments in plugin.rb should make it clear what these are doing. Reading the `HashtagAutocompleteService` in full will likely help a lot as well. Each data source is responsible for providing its own **lookup** and **search** method that returns hashtag results based on the arguments provided. For example, the category hashtag data source has to take into account parent categories and how they relate, and each data source has to define their own icon to use for the hashtag, and so on. The `Site` serializer has two new attributes that source data from `HashtagAutocompleteService`. There is `hashtag_icons` that is just a simple array of all the different icons that can be used for allowlisting in our markdown pipeline, and there is `hashtag_context_configurations` that is used to store the type priority orders for each registered context. When sending emails, we cannot render the SVG icons for hashtags, so we need to change the HTML hashtags to the normal `#hashtag` text. **Markdown** The `hashtag-autocomplete.js` file is where I have added the new `hashtag-autocomplete` markdown rule, and like all of our rules this is used to cook the raw text on both the clientside and on the serverside using MiniRacer. Only on the server side do we actually reach out to the database with the `hashtagLookup` function, on the clientside we just render a plainer version of the hashtag HTML. Only in the composer preview do we do further lookups based on this. This rule is the first one (that I can find) that uses the `currentUser` based on a passed in `user_id` for guardian checks in markdown rendering code. This is the `last_editor_id` for both the post and chat message. In some cases we need to cook without a user present, so the `Discourse.system_user` is used in this case. **Chat Channels** This also contains the changes required for chat so that chat channels can be used as a data source for hashtag searches and lookups. This data source will only be used when `enable_experimental_hashtag_autocomplete` is `true`, so we don't have to worry about channel results suddenly turning up. ------ **Known Rough Edges** - Onebox excerpts will not render the icon svg/use tags, I plan to address that in a follow up PR - Selecting a hashtag + pressing the Quote button will result in weird behaviour, I plan to address that in a follow up PR - Mixed hashtag contexts for hashtags without a type suffix will not work correctly, e.g. #ux which is both a category and a channel slug will resolve to a category when used inside a post or within a [chat] transcript in that post. Users can get around this manually by adding the correct suffix, for example ::channel. We may get to this at some point in future - Icons will not show for the hashtags in emails since SVG support is so terrible in email (this is not likely to be resolved, but still noting for posterity) - Additional refinements and review fixes wil
2022-11-20 17:37:06 -05:00
},
"displayed_about_plugin_stat_groups" : {
"type": "array"
},
"categories": {
"type": "array",
"items":
{
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"color": {
"type": "string"
},
"text_color": {
"type": "string"
},
"slug": {
"type": "string"
},
"topic_count": {
"type": "integer"
},
"post_count": {
"type": "integer"
},
"position": {
"type": "integer"
},
"description": {
"type": [
"string",
"null"
]
},
"description_text": {
"type": [
"string",
"null"
]
},
"description_excerpt": {
"type": [
"string",
"null"
]
},
"topic_url": {
"type": "string"
},
"read_restricted": {
"type": "boolean"
},
"permission": {
"type": "integer"
},
"notification_level": {
"type": "integer"
},
"topic_template": {
"type": [
"string",
"null"
]
},
"has_children": {
"type": "boolean"
},
"sort_order": {
"type": [
"string",
"null"
]
},
"sort_ascending": {
"type": [
"string",
"null"
]
},
"show_subcategory_list": {
"type": "boolean"
},
"num_featured_topics": {
"type": "integer"
},
"default_view": {
"type": [
"string",
"null"
]
},
"subcategory_list_style": {
"type": "string"
},
"default_top_period": {
"type": "string"
},
"default_list_filter": {
"type": "string"
},
"minimum_required_tags": {
"type": "integer"
},
"navigate_to_first_post_after_read": {
"type": "boolean"
},
"allowed_tags": {
"type": "array",
"items": {
}
},
"allowed_tag_groups": {
"type": "array",
"items": {
}
},
"allow_global_tags": {
"type": "boolean"
},
"required_tag_groups": {
"type": "array",
"items":
{
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string"
},
"min_count": {
"type": "integer"
}
},
"required": [
"name",
"min_count"
]
}
},
"read_only_banner": {
"type": [
"string",
"null"
]
},
"uploaded_logo": {
"type": [
"string",
"null"
]
},
"uploaded_logo_dark": {
"type": [
"string",
"null"
]
},
"uploaded_background": {
"type": [
"string",
"null"
]
},
"can_edit": {
"type": "boolean"
},
"custom_fields": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"parent_category_id": {
"type": "integer"
},
"form_template_ids": {
"type": "array",
"items": []
}
},
"required": [
"id",
"name",
"color",
"text_color",
"slug",
"topic_count",
"post_count",
"position",
"topic_url",
"read_restricted",
"permission",
"notification_level",
"topic_template",
"has_children",
"sort_order",
"sort_ascending",
"show_subcategory_list",
"num_featured_topics",
"default_view",
"subcategory_list_style",
"default_top_period",
"default_list_filter",
"minimum_required_tags",
"navigate_to_first_post_after_read",
"allowed_tags",
"allowed_tag_groups",
"allow_global_tags",
"required_tag_groups",
"read_only_banner",
"uploaded_logo",
"uploaded_logo_dark",
"uploaded_background",
"can_edit"
]
}
},
"archetypes": {
"type": "array",
"items":
{
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"options": {
"type": "array",
"items": {
}
}
},
"required": [
"id",
"name",
"options"
]
}
},
"user_fields": {
"type": "array",
"items": {
}
},
"auth_providers": {
"type": "array",
"items": {
}
},
"whispers_allowed_groups_names" : {
"type": "array"
},
"denied_emojis" : {
"type": "array"
}
},
"required": [
"default_archetype",
"notification_types",
"post_types",
"trust_levels",
"groups",
"filters",
"periods",
"top_menu_items",
"anonymous_top_menu_items",
"uncategorized_category_id",
"user_field_max_length",
"post_action_types",
"topic_flag_types",
"can_create_tag",
"can_tag_topics",
"can_tag_pms",
"tags_filter_regexp",
"top_tags",
"topic_featured_link_allowed_category_ids",
"user_themes",
"user_color_schemes",
"default_dark_color_scheme",
"censored_regexp",
"custom_emoji_translation",
"watched_words_replace",
"watched_words_link",
"categories",
"archetypes",
"user_fields",
"auth_providers"
]
}