Skip to main content

max / makenotwork

Add SyncKitClient::list_members Lists a group's members (id, role, joined-at) via GET /groups/{id}/members, so an admin UI can show who to remove. Part of Groups p4 M4. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-23 22:49 UTC
Commit: c2ae59e3dc828a95a2dad3ead1e7c253c4c175ef
Parent: 856ad37
2 files changed, +27 insertions, -0 deletions
@@ -147,6 +147,19 @@ impl SyncKitClient {
147 147 Ok(())
148 148 }
149 149
150 + /// List a group's members (id, role, joined-at). Admin only (the server gates
151 + /// it); use to show who can be removed.
152 + #[instrument(skip(self))]
153 + pub async fn list_members(&self, group_id: GroupId) -> Result<Vec<GroupMember>> {
154 + let token = self.require_token()?;
155 + let url = self.endpoints.group_members(group_id);
156 + self.retry_request_json(Idempotency::ReadOnly, || {
157 + let req = self.http.get(&url).bearer_auth(&token);
158 + async move { check_response(req.send().await?).await }
159 + })
160 + .await
161 + }
162 +
150 163 /// Remove a member from a group by user id. Admin only. The server membership
151 164 /// ACL revokes the member's group read/write access immediately.
152 165 ///
@@ -264,6 +264,20 @@ pub struct SyncGroup {
264 264 pub created_at: DateTime<Utc>,
265 265 }
266 266
267 + /// A member of a group, as returned by
268 + /// [`SyncKitClient::list_members`](crate::SyncKitClient::list_members). Grants are
269 + /// not included — each member fetches only their own.
270 + #[derive(Debug, Clone, Deserialize)]
271 + #[non_exhaustive]
272 + pub struct GroupMember {
273 + /// The member's account id.
274 + pub user_id: UserId,
275 + /// `"admin"` or `"member"`.
276 + pub role: String,
277 + /// When they were added.
278 + pub added_at: DateTime<Utc>,
279 + }
280 +
267 281 /// The caller's sealed Group Content Key grant, as returned by
268 282 /// [`SyncKitClient::group_grant`](crate::SyncKitClient::group_grant). Opened with
269 283 /// the member's identity private key to recover the GCK.