Skip to content

Bug: team_members mutations throw raw Error instead of ConvexError — all auth/permission/business rejections surface as opaque Server Errors #2002

Description

@yannickmonney

Area

services/platform/convex/team_members/mutations.tsaddMember and removeMember mutations (both client-callable via mutation()).

Steps to reproduce

  1. Attempt to add a team member as a non-admin → toast appears but console logs uncaught Convex Server Error.
  2. Attempt to add a user who is already a team member → same opaque Server Error in console.
  3. Attempt to remove the last member from a team → rejection toast + console Server Error.
  4. Any unauthenticated call to either mutation → raw Error('Unauthenticated') instead of a typed code.

Expected

All business-logic rejections (auth, RBAC, not-found, duplicate-member, last-member guard) throw ConvexError({ code: '...' }) so the client can:

  • distinguish error types without string-matching
  • handle errors without triggering an uncaught Server Error in the console

Actual

Every rejection in both mutations uses throw new Error(...). Convex surfaces plain Error as an opaque "Server Error" to the client; only ConvexError is transmitted transparently.

Evidence

services/platform/convex/team_members/mutations.ts:23throw new Error('Unauthenticated') (addMember)
services/platform/convex/team_members/mutations.ts:33throw new Error('Only admins can add team members') (addMember)
services/platform/convex/team_members/mutations.ts:41throw new Error('Team not found in this organization') (addMember)
services/platform/convex/team_members/mutations.ts:60throw new Error('User is not a member of this organization') (addMember)
services/platform/convex/team_members/mutations.ts:75throw new Error('User is already a member of this team') (addMember)
services/platform/convex/team_members/mutations.ts:119throw new Error('Unauthenticated') (removeMember)
services/platform/convex/team_members/mutations.ts:137throw new Error('Team member not found') (removeMember)
services/platform/convex/team_members/mutations.ts:142throw new Error('Only admins can remove other team members') (removeMember)
services/platform/convex/team_members/mutations.ts:152throw new Error('Team not found in this organization') (removeMember)
services/platform/convex/team_members/mutations.ts:165throw new Error('Cannot remove the last team member. Delete the team instead.') (removeMember)

Notes

The fix pattern is established in services/platform/convex/tasks/mutations.ts (imports ConvexError from 'convex/values', throws new ConvexError({ code: 'UNAUTHENTICATED' }) etc.). Apply the same to both mutations; suggested codes: UNAUTHENTICATED, RBAC_FORBIDDEN, TEAM_NOT_FOUND, USER_NOT_ORG_MEMBER, TEAM_MEMBER_ALREADY_EXISTS, TEAM_MEMBER_NOT_FOUND, TEAM_LAST_MEMBER.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions