From ca87b9289dc8b1fa676bd1740b5f34a2ba33bcd2 Mon Sep 17 00:00:00 2001 From: os-zhuang Date: Fri, 26 Jun 2026 00:58:38 +0800 Subject: [PATCH] chore(client): remove dead projects.* env-member SDK methods (ADR-0024 D9) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The four projects.{listMembers,addMember,updateMemberRole,removeMember} methods called GET/POST/PATCH/DELETE /cloud/environments/:id/members, which were deleted in cloud#533 (retiring sys_environment_member); they returned 404. Org membership/invites now flow through the better-auth organization plugin (organization.inviteMember/listMembers/…); objectui already uses organization.* and no in-repo callers remained. The membership field on projects.get() is unchanged — cloud#533 still returns it on the single-env GET (re-sourced to the caller's org sys_member role), so cli environments/show.ts still works. Co-Authored-By: Claude Opus 4.8 --- .../client-remove-env-member-methods.md | 15 +++++ packages/client/src/index.ts | 58 ------------------- 2 files changed, 15 insertions(+), 58 deletions(-) create mode 100644 .changeset/client-remove-env-member-methods.md diff --git a/.changeset/client-remove-env-member-methods.md b/.changeset/client-remove-env-member-methods.md new file mode 100644 index 0000000000..e6808bc15e --- /dev/null +++ b/.changeset/client-remove-env-member-methods.md @@ -0,0 +1,15 @@ +--- +"@objectstack/client": patch +--- + +chore(client): remove dead `projects.*` env-member SDK methods (cloud#533 / ADR-0024 D9) + +Removes `projects.listMembers` / `addMember` / `updateMemberRole` / `removeMember`, +which called `GET/POST/PATCH/DELETE /api/v1/cloud/environments/:id/members`. Those +control-plane endpoints were deleted in cloud#533 (retiring `sys_environment_member`), +so the methods returned 404. Org membership/invites now flow through the better-auth +`organization` plugin (`organization.inviteMember` / `listMembers` / …); objectui +already uses `organization.*` and no in-repo callers remained. + +The `membership` field on the `projects.get()` response is unchanged — cloud#533 still +returns it on the single-env GET (re-sourced to the caller's org `sys_member` role). diff --git a/packages/client/src/index.ts b/packages/client/src/index.ts index 82806855db..18830952ed 100644 --- a/packages/client/src/index.ts +++ b/packages/client/src/index.ts @@ -879,64 +879,6 @@ export class ObjectStackClient { return this.unwrapResponse<{ project: any }>(res); }, - /** - * List members of a project (per-project RBAC). - */ - listMembers: async (id: string) => { - const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members`); - return this.unwrapResponse<{ members: any[] }>(res); - }, - - /** - * Invite a member to a project. Caller must be `owner` or `admin`. - * Pass either `email` (resolved against the user table) or `user_id`. - * Returns `{ member, alreadyMember }` — `alreadyMember=true` means the - * row already existed; the call is idempotent. - */ - addMember: async ( - id: string, - payload: { email?: string; user_id?: string; role?: 'owner' | 'admin' | 'member' | 'viewer' }, - ) => { - const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members`, { - method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify(payload), - }); - return this.unwrapResponse<{ member: any; alreadyMember: boolean }>(res); - }, - - /** - * Update a member's role. Caller must be `owner` or `admin`. Demoting - * the last `owner` returns 409. - */ - updateMemberRole: async ( - id: string, - memberId: string, - role: 'owner' | 'admin' | 'member' | 'viewer', - ) => { - const res = await this.fetch( - `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`, - { - method: 'PATCH', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ role }), - }, - ); - return this.unwrapResponse<{ member: any }>(res); - }, - - /** - * Remove a member. Owners/admins may remove anyone; non-privileged - * users may only remove themselves. Removing the last `owner` returns 409. - */ - removeMember: async (id: string, memberId: string) => { - const res = await this.fetch( - `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`, - { method: 'DELETE' }, - ); - return this.unwrapResponse<{ removed: boolean; memberId: string }>(res); - }, - /** * List ObjectQL drivers registered on the server. Useful for populating a * driver selector when provisioning a new project (memory / turso /