mirror of https://github.com/zulip/zulip.git
d9740045a5
We eliminate some redundant checks. We also consistently provide a `subscribers` field in our stream data with `[]`, even if our users can't access subscribers. We therefore bump the API version and tweak the docs. (See further down for a detailed justification of the change.) Even though it is sometimes fine to have redundant code that is defensive in nature, some upcoming changes are gonna move subscriber-related logic out of build_stream_dict_for_sub for certain codepaths as part of our effort to streamline the payload for subscribers within page_params. So we can't rely on the code that I removed here inside of build_stream_dict_for_sub. Anyway, it makes more sense to do these checks explicitly in the validate function. The code in build_stream_dict_for_sub was almost effectively a noop, since the validation function was already preventing us from getting subscriber info. The only difference it made was sometimes converting `[]` to `None`, and then subsequently omitting the subscribers field. Neither ZT nor the webapp make any distinction between `[]` or <missing key> for the `subscribers` data in `page_params`. The webapp has had this code for a long time (and now equivalent code elsewhere in this PR): if (!Object.prototype.hasOwnProperty.call(sub, "subscribers")) { sub.subscribers = new LazySet([]); } The webapp calculates access based on booleans, anyway: sub.can_access_subscribers = page_params.is_admin || sub.subscribed || (!page_params.is_guest && !sub.invite_only); And ZT would choke if `subscribers` were missing, except that it never gets to the relevant code due to other checks: def get_other_subscribers_in_stream(<snip>): assert stream_id is not None or stream_name is not None if stream_id: assert self.is_user_subscribed_to_stream(stream_id) return [sub for sub in self.stream_dict[stream_id]['subscribers'] if sub != self.user_id] else: return [sub for _, stream in self.stream_dict.items() for sub in stream['subscribers'] if stream['name'] == stream_name if sub != self.user_id] You could make a semantic argument that we should prefer <missing key> to `[]` when subscribers aren't even available, but we have precedent from the way that `bulk_get_subscriber_user_ids` has traditionally populated its result: result: Dict[int, List[int]] = {stream["id"]: [] for stream in stream_dicts} If we changed `stream_dicts` to `target_stream_dicts` we would faciliate a move toward `None`, but it would just cause headaches for other server code as well as the frontends (which, to reiterate, already prefer the empty array for convenience). |
||
---|---|---|
.. | ||
analytics | ||
confirmation | ||
corporate | ||
tests | ||
two_factor | ||
zerver | ||
zilencer | ||
.gitignore | ||
404.html | ||
500.html |