api: Improve encoding of stream/topic max field lengths.

Previously, you had to request the `stream` event type in order to get
the stream-level parameters; this was a bad design in part because the
`subscription` event type has similar data and is preferred by most
clients.

So we move these to the `realm` object.  We also add the maximum topic
length, as an adjacent parameter.

While changing this, we also fix these to better match the names of
similar API parameters.
This commit is contained in:
Tim Abbott 2021-04-10 08:50:58 -07:00
parent 1b5a16bd1f
commit 4a3ad0da06
6 changed files with 53 additions and 23 deletions

View File

@ -627,8 +627,8 @@ export function setup_page(callback) {
const template_data = { const template_data = {
can_create_streams: page_params.can_create_streams, can_create_streams: page_params.can_create_streams,
hide_all_streams: !should_list_all_streams(), hide_all_streams: !should_list_all_streams(),
max_name_length: page_params.stream_name_max_length, max_name_length: page_params.max_stream_name_length,
max_description_length: page_params.stream_description_max_length, max_description_length: page_params.max_stream_description_length,
is_owner: page_params.is_owner, is_owner: page_params.is_owner,
stream_privacy_policy_values: stream_data.stream_privacy_policy_values, stream_privacy_policy_values: stream_data.stream_privacy_policy_values,
stream_post_policy_values: stream_data.stream_post_policy_values, stream_post_policy_values: stream_data.stream_post_policy_values,

View File

@ -10,6 +10,13 @@ below features are supported.
## Changes in Zulip 4.0 ## Changes in Zulip 4.0
**Feature level 53**
* [`POST /register`](/api/register-queue): Added `max_topic_length`
and renamed `max_stream_name_length` and
`max_stream_description_length` to allow clients to transparently
support these values changing in a future server version.
**Feature level 52** **Feature level 52**
* `PATCH /realm`: Removed unnecessary JSON-encoding of string * `PATCH /realm`: Removed unnecessary JSON-encoding of string

View File

@ -30,7 +30,7 @@ DESKTOP_WARNING_VERSION = "5.2.0"
# #
# Changes should be accompanied by documentation explaining what the # Changes should be accompanied by documentation explaining what the
# new level means in templates/zerver/api/changelog.md. # new level means in templates/zerver/api/changelog.md.
API_FEATURE_LEVEL = 52 API_FEATURE_LEVEL = 53
# Bump the minor PROVISION_VERSION to indicate that folks should provision # Bump the minor PROVISION_VERSION to indicate that folks should provision
# only when going from an old version of the code to a newer version. Bump # only when going from an old version of the code to a newer version. Bump

View File

@ -49,6 +49,7 @@ from zerver.lib.user_mutes import get_user_mutes
from zerver.lib.user_status import get_user_info_dict from zerver.lib.user_status import get_user_info_dict
from zerver.lib.users import get_cross_realm_dicts, get_raw_user_data, is_administrator_role from zerver.lib.users import get_cross_realm_dicts, get_raw_user_data, is_administrator_role
from zerver.models import ( from zerver.models import (
MAX_TOPIC_NAME_LENGTH,
Client, Client,
CustomProfileField, CustomProfileField,
Message, Message,
@ -250,6 +251,10 @@ def fetch_initial_state_data(
else: else:
state["realm_signup_notifications_stream_id"] = -1 state["realm_signup_notifications_stream_id"] = -1
state["max_stream_name_length"] = Stream.MAX_NAME_LENGTH
state["max_stream_description_length"] = Stream.MAX_DESCRIPTION_LENGTH
state["max_topic_length"] = MAX_TOPIC_NAME_LENGTH
if want("realm_domains"): if want("realm_domains"):
state["realm_domains"] = get_realm_domains(realm) state["realm_domains"] = get_realm_domains(realm)
@ -415,8 +420,6 @@ def fetch_initial_state_data(
# be used when the mobile apps support logged-out # be used when the mobile apps support logged-out
# access. # access.
state["streams"] = get_web_public_streams(realm) # nocoverage state["streams"] = get_web_public_streams(realm) # nocoverage
state["stream_name_max_length"] = Stream.MAX_NAME_LENGTH
state["stream_description_max_length"] = Stream.MAX_DESCRIPTION_LENGTH
if want("default_streams"): if want("default_streams"):
if settings_user.is_guest: if settings_user.is_guest:
# Guest users and logged-out users don't have access to # Guest users and logged-out users don't have access to

View File

@ -6885,6 +6885,41 @@ paths:
**Deprecated**: This field may be removed in future versions as it no **Deprecated**: This field may be removed in future versions as it no
longer has a clear purpose. Clients wishing to fetch the latest messages longer has a clear purpose. Clients wishing to fetch the latest messages
should pass `anchor="latest"` to `GET /messages`. should pass `anchor="latest"` to `GET /messages`.
max_stream_name_length:
type: integer
description: |
Present if `realm` is present in `fetch_event_types`.
The maximum allowed length for a stream name. Clients should use
these properties rather than hardcoding field sizes, as they may
change in a future Zulip release.
**Changes**: New in Zulip 4.0 (feature level 53). Previously,
this required `stream` in `fetch_event_types`, was called
`stream_name_max_length`, and always had value 60.
max_stream_description_length:
type: integer
description: |
Present if `realm` is present in `fetch_event_types`.
The maximum allowed length for a stream description. Clients should use
these properties rather than hardcoding field sizes, as they may
change in a future Zulip release.
**Changes**: New in Zulip 4.0 (feature level 53). Previously,
this required `stream` in `fetch_event_types`, was called
`stream_description_max_length`, and always had value 1024.
max_topic_length:
type: integer
description: |
Present if `realm` is present in `fetch_event_types`.
The maximum allowed length for a topic. Clients should use
these properties rather than hardcoding field sizes, as they may
change in a future Zulip release.
**Changes**: New in Zulip 4.0 (feature level 53). Previously,
this always had value 60.
muted_topics: muted_topics:
type: array type: array
description: | description: |
@ -7303,22 +7338,6 @@ paths:
For organization administrators, this will include all private streams For organization administrators, this will include all private streams
in the organization. in the organization.
stream_name_max_length:
type: integer
description: |
Present if `stream` is present in `fetch_event_types`.
The maximum allowed length for a stream name. Clients should use
these properties rather than hardcoding field sizes, as they may
change in a future Zulip release.
stream_description_max_length:
type: integer
description: |
Present if `stream` is present in `fetch_event_types`.
The maximum allowed length for a stream description. Clients should use
these properties rather than hardcoding field sizes, as they may
change in a future Zulip release.
realm_default_streams: realm_default_streams:
type: array type: array
items: items:

View File

@ -106,6 +106,9 @@ class HomeTest(ZulipTestCase):
"max_icon_file_size", "max_icon_file_size",
"max_logo_file_size", "max_logo_file_size",
"max_message_id", "max_message_id",
"max_stream_description_length",
"max_stream_name_length",
"max_topic_length",
"message_content_in_email_notifications", "message_content_in_email_notifications",
"muted_topics", "muted_topics",
"muted_users", "muted_users",
@ -206,8 +209,6 @@ class HomeTest(ZulipTestCase):
"starred_message_counts", "starred_message_counts",
"starred_messages", "starred_messages",
"stop_words", "stop_words",
"stream_description_max_length",
"stream_name_max_length",
"subscriptions", "subscriptions",
"test_suite", "test_suite",
"timezone", "timezone",