From fe991ec3e6360df1a9e29d9508e88cc7786e46de Mon Sep 17 00:00:00 2001 From: Sivert Date: Wed, 23 Sep 2026 09:17:56 +0200 Subject: [PATCH 1/2] Document the folder permission socket events (GRYT-1349) server#207 (GRYT-1306) gave folders a permission scope and added server:folders:scope:get, server:folders:scope:set and server:channels:scope:follow, plus client#638 made channels follow a folder by default. None of it was on the socket reference, which listed only the per-channel scope events. Adds the three events, the server:folders:scope reply, and a short paragraph on how a channel keeps its scope when it leaves a folder or the folder is deleted. Co-Authored-By: Claude Sonnet 5 --- content/docs/build/server-api.mdx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/content/docs/build/server-api.mdx b/content/docs/build/server-api.mdx index 5b79ad9..698b75f 100644 --- a/content/docs/build/server-api.mdx +++ b/content/docs/build/server-api.mdx @@ -329,14 +329,23 @@ here sit on top of the thread events above. ### Administration +A channel inside a folder follows the folder's permission scope for as long as +it has none of its own — set one with `server:channels:scope:set` and it +sticks, even Everyone. Pull the channel out of the folder, or delete the +folder, and it keeps whatever scope it was reading at that moment as its own +rather than falling back to Everyone. + | Event | Direction | Notes | |-------|-----------|-------| | `server:settings:get`, `server:settings:update` | client → server | The database-backed settings | | `server:settings` | server → client | | | `server:channels:list`, `:upsert`, `:delete`, `:reorder` | client → server | | | `server:channels` | server → client | | -| `server:channels:scope:get`, `server:channels:scope:set` | client → server | Who can use a channel: Everyone, a template or its own rules | -| `server:channels:scope` | server → client | | +| `server:channels:scope:get`, `server:channels:scope:set` | client → server | Needs `manage_channels`. Who can use a channel: Everyone, a template or its own rules | +| `server:channels:scope:follow` | client → server | Needs `manage_channels`. Drops the channel's own rules and goes back to following its folder | +| `server:channels:scope` | server → client | Answer to all three above. Carries `followsFolder` and, when it's following one, the folder's id and name | +| `server:folders:scope:get`, `server:folders:scope:set` | client → server | Needs `manage_channels`. Same, for a folder — applies to every channel inside it that has no rules of its own | +| `server:folders:scope` | server → client | Answer to both above. Carries `channelCount`, how many channels are following the folder | | `server:permissions:templates:list`, `server:permissions:template:save`, `server:permissions:template:delete` | client → server | Named sets of channel permissions that several channels can share | | `server:permissions:templates` | server → client | | | `server:sidebar:list`, `:item:upsert`, `:item:delete`, `:reorder` | client → server | | From 5ee2b73fba3bfdc31c556fbf2059388a1f27d1ee Mon Sep 17 00:00:00 2001 From: Sivert Date: Wed, 23 Sep 2026 09:19:17 +0200 Subject: [PATCH 2/2] Note that server:sidebar filters hidden channels and empty folders (GRYT-1349) Vikunja's task description for this one flagged it alongside the folder scope events: a member without manage_channels never sees a channel's row if they can't read it, or a folder left with none of its channels showing. Co-Authored-By: Claude Sonnet 5 --- content/docs/build/server-api.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/build/server-api.mdx b/content/docs/build/server-api.mdx index 698b75f..79e014c 100644 --- a/content/docs/build/server-api.mdx +++ b/content/docs/build/server-api.mdx @@ -349,7 +349,7 @@ rather than falling back to Everyone. | `server:permissions:templates:list`, `server:permissions:template:save`, `server:permissions:template:delete` | client → server | Named sets of channel permissions that several channels can share | | `server:permissions:templates` | server → client | | | `server:sidebar:list`, `:item:upsert`, `:item:delete`, `:reorder` | client → server | | -| `server:sidebar` | server → client | | +| `server:sidebar` | server → client | Leaves out any channel the caller can't see, and a folder left with none of its channels in it — unless the caller holds `manage_channels`, which shows everything | | `server:roles:list`, `server:roles:set` | client → server | | | `server:roles`, `server:role:updated` | server → client | | | `server:invites:create`, `:list`, `:revoke` | client → server | |