better-auth 1.5.4 → 1.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/index.d.mts +25 -1
- package/dist/adapters/index.mjs +9 -1
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/api/index.d.mts +36 -10
- package/dist/api/index.mjs +19 -4
- package/dist/api/index.mjs.map +1 -1
- package/dist/api/middlewares/origin-check.mjs +17 -8
- package/dist/api/middlewares/origin-check.mjs.map +1 -1
- package/dist/api/routes/account.d.mts +1 -1
- package/dist/api/routes/email-verification.d.mts +0 -1
- package/dist/api/routes/password.d.mts +1 -0
- package/dist/api/routes/password.mjs +2 -1
- package/dist/api/routes/password.mjs.map +1 -1
- package/dist/api/routes/session.d.mts +0 -1
- package/dist/api/routes/sign-in.d.mts +16 -2
- package/dist/api/routes/sign-in.mjs +10 -2
- package/dist/api/routes/sign-in.mjs.map +1 -1
- package/dist/api/routes/sign-up.d.mts +0 -1
- package/dist/api/routes/sign-up.mjs +3 -2
- package/dist/api/routes/sign-up.mjs.map +1 -1
- package/dist/api/routes/update-session.d.mts +0 -1
- package/dist/api/routes/update-user.d.mts +0 -1
- package/dist/api/to-auth-endpoints.mjs +49 -12
- package/dist/api/to-auth-endpoints.mjs.map +1 -1
- package/dist/auth/full.d.mts +0 -1
- package/dist/auth/minimal.d.mts +0 -1
- package/dist/client/index.d.mts +3 -4
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/path-to-object.d.mts +9 -2
- package/dist/client/query.mjs +3 -2
- package/dist/client/query.mjs.map +1 -1
- package/dist/client/session-refresh.d.mts +11 -3
- package/dist/client/session-refresh.mjs +13 -8
- package/dist/client/session-refresh.mjs.map +1 -1
- package/dist/client/types.d.mts +0 -1
- package/dist/context/create-context.mjs +4 -1
- package/dist/context/create-context.mjs.map +1 -1
- package/dist/context/helpers.mjs +10 -4
- package/dist/context/helpers.mjs.map +1 -1
- package/dist/cookies/index.d.mts +0 -1
- package/dist/cookies/session-store.d.mts +0 -2
- package/dist/db/get-migration.mjs +3 -2
- package/dist/db/get-migration.mjs.map +1 -1
- package/dist/db/index.d.mts +2 -2
- package/dist/db/internal-adapter.d.mts +2 -1
- package/dist/db/internal-adapter.mjs +1 -1
- package/dist/db/internal-adapter.mjs.map +1 -1
- package/dist/db/schema.d.mts +0 -1
- package/dist/db/with-hooks.d.mts +6 -2
- package/dist/db/with-hooks.mjs +72 -31
- package/dist/db/with-hooks.mjs.map +1 -1
- package/dist/index.d.mts +0 -2
- package/dist/integrations/node.d.mts +0 -1
- package/dist/oauth2/link-account.d.mts +0 -1
- package/dist/plugins/admin/access/statement.d.mts +0 -2
- package/dist/plugins/admin/admin.d.mts +0 -1
- package/dist/plugins/admin/client.d.mts +0 -2
- package/dist/plugins/admin/types.d.mts +0 -2
- package/dist/plugins/anonymous/types.d.mts +0 -1
- package/dist/plugins/email-otp/index.mjs +2 -1
- package/dist/plugins/email-otp/index.mjs.map +1 -1
- package/dist/plugins/email-otp/otp-token.mjs +31 -2
- package/dist/plugins/email-otp/otp-token.mjs.map +1 -1
- package/dist/plugins/email-otp/routes.mjs +60 -59
- package/dist/plugins/email-otp/routes.mjs.map +1 -1
- package/dist/plugins/email-otp/types.d.mts +12 -0
- package/dist/plugins/email-otp/utils.mjs +4 -1
- package/dist/plugins/email-otp/utils.mjs.map +1 -1
- package/dist/plugins/generic-oauth/client.d.mts +0 -1
- package/dist/plugins/generic-oauth/index.d.mts +0 -1
- package/dist/plugins/index.d.mts +0 -3
- package/dist/plugins/jwt/types.d.mts +0 -1
- package/dist/plugins/magic-link/index.d.mts +2 -0
- package/dist/plugins/magic-link/index.mjs +5 -3
- package/dist/plugins/magic-link/index.mjs.map +1 -1
- package/dist/plugins/mcp/index.d.mts +0 -1
- package/dist/plugins/oidc-provider/authorize.mjs +13 -4
- package/dist/plugins/oidc-provider/authorize.mjs.map +1 -1
- package/dist/plugins/oidc-provider/error.mjs +12 -2
- package/dist/plugins/oidc-provider/error.mjs.map +1 -1
- package/dist/plugins/oidc-provider/index.d.mts +0 -1
- package/dist/plugins/oidc-provider/types.d.mts +0 -1
- package/dist/plugins/one-time-token/index.d.mts +0 -1
- package/dist/plugins/organization/access/statement.d.mts +0 -2
- package/dist/plugins/organization/adapter.d.mts +0 -2
- package/dist/plugins/organization/adapter.mjs +2 -2
- package/dist/plugins/organization/adapter.mjs.map +1 -1
- package/dist/plugins/organization/client.d.mts +0 -5
- package/dist/plugins/organization/organization.d.mts +0 -2
- package/dist/plugins/organization/permission.d.mts +0 -1
- package/dist/plugins/organization/routes/crud-access-control.d.mts +0 -2
- package/dist/plugins/organization/routes/crud-invites.d.mts +0 -3
- package/dist/plugins/organization/routes/crud-invites.mjs +1 -1
- package/dist/plugins/organization/routes/crud-invites.mjs.map +1 -1
- package/dist/plugins/organization/routes/crud-members.d.mts +0 -3
- package/dist/plugins/organization/routes/crud-members.mjs +1 -1
- package/dist/plugins/organization/routes/crud-members.mjs.map +1 -1
- package/dist/plugins/organization/routes/crud-org.d.mts +0 -3
- package/dist/plugins/organization/routes/crud-team.d.mts +2 -3
- package/dist/plugins/organization/routes/crud-team.mjs +18 -14
- package/dist/plugins/organization/routes/crud-team.mjs.map +1 -1
- package/dist/plugins/organization/schema.d.mts +0 -1
- package/dist/plugins/organization/types.d.mts +0 -2
- package/dist/plugins/phone-number/types.d.mts +0 -1
- package/dist/plugins/siwe/index.d.mts +0 -1
- package/dist/plugins/test-utils/types.d.mts +0 -2
- package/dist/plugins/two-factor/client.d.mts +7 -0
- package/dist/plugins/two-factor/client.mjs +5 -1
- package/dist/plugins/two-factor/client.mjs.map +1 -1
- package/dist/plugins/two-factor/index.mjs +7 -1
- package/dist/plugins/two-factor/index.mjs.map +1 -1
- package/dist/plugins/two-factor/otp/index.d.mts +2 -2
- package/dist/plugins/two-factor/otp/index.mjs.map +1 -1
- package/dist/plugins/two-factor/types.d.mts +7 -1
- package/dist/test-utils/test-instance.d.mts +108 -21
- package/dist/types/index.d.mts +0 -1
- package/package.json +13 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-members.mjs","names":[],"sources":["../../../../src/plugins/organization/routes/crud-members.ts"],"sourcesContent":["import type { LiteralString } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport { whereOperators } from \"@better-auth/core/db/adapter\";\nimport { APIError, BASE_ERROR_CODES } from \"@better-auth/core/error\";\nimport * as z from \"zod\";\nimport { getSessionFromCtx, sessionMiddleware } from \"../../../api\";\nimport type { InferAdditionalFieldsFromPluginOptions } from \"../../../db\";\nimport { toZodSchema } from \"../../../db/to-zod\";\nimport { getOrgAdapter } from \"../adapter\";\nimport { orgMiddleware, orgSessionMiddleware } from \"../call\";\nimport { ORGANIZATION_ERROR_CODES } from \"../error-codes\";\nimport { hasPermission } from \"../has-permission\";\nimport { parseRoles } from \"../organization\";\nimport type {\n\tInferMember,\n\tInferOrganizationRolesFromOption,\n\tMember,\n} from \"../schema\";\nimport type { OrganizationOptions } from \"../types\";\n\nconst baseMemberSchema = z.object({\n\tuserId: z.coerce.string().meta({\n\t\tdescription:\n\t\t\t'The user Id which represents the user to be added as a member. If `null` is provided, then it\\'s expected to provide session headers. Eg: \"user-id\"',\n\t}),\n\trole: z.union([z.string(), z.array(z.string())]).meta({\n\t\tdescription:\n\t\t\t'The role(s) to assign to the new member. Eg: [\"admin\", \"sale\"]',\n\t}),\n\torganizationId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription:\n\t\t\t\t'An optional organization ID to pass. If not provided, will default to the user\\'s active organization. Eg: \"org-id\"',\n\t\t})\n\t\t.optional(),\n\tteamId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription: 'An optional team ID to add the member to. Eg: \"team-id\"',\n\t\t})\n\t\t.optional(),\n});\n\nexport const addMember = <O extends OrganizationOptions>(option: O) => {\n\tconst additionalFieldsSchema = toZodSchema({\n\t\tfields: option?.schema?.member?.additionalFields || {},\n\t\tisClientSide: true,\n\t});\n\treturn createAuthEndpoint(\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: z.object({\n\t\t\t\t...baseMemberSchema.shape,\n\t\t\t\t...additionalFieldsSchema.shape,\n\t\t\t}),\n\t\t\tuse: [orgMiddleware],\n\t\t\tmetadata: {\n\t\t\t\t$Infer: {\n\t\t\t\t\tbody: {} as {\n\t\t\t\t\t\tuserId: string;\n\t\t\t\t\t\trole:\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>[];\n\t\t\t\t\t\torganizationId?: string | undefined;\n\t\t\t\t\t} & (O extends { teams: { enabled: true } }\n\t\t\t\t\t\t? { teamId?: string | undefined }\n\t\t\t\t\t\t: {}) &\n\t\t\t\t\t\tInferAdditionalFieldsFromPluginOptions<\"member\", O>,\n\t\t\t\t},\n\t\t\t\topenapi: {\n\t\t\t\t\toperationId: \"addOrganizationMember\",\n\t\t\t\t\tdescription: \"Add a member to an organization\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.body.userId\n\t\t\t\t? await getSessionFromCtx<{\n\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\tactiveOrganizationId?: string | undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t}>(ctx).catch((e) => null)\n\t\t\t\t: null;\n\t\t\tconst orgId =\n\t\t\t\tctx.body.organizationId || session?.session.activeOrganizationId;\n\t\t\tif (!orgId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst teamId =\n\t\t\t\t\"teamId\" in ctx.body ? (ctx.body.teamId as string) : undefined;\n\t\t\tif (teamId && !ctx.context.orgOptions.teams?.enabled) {\n\t\t\t\tctx.context.logger.error(\"Teams are not enabled\");\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"Teams are not enabled\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, option);\n\n\t\t\tconst user = await ctx.context.internalAdapter.findUserById(\n\t\t\t\tctx.body.userId,\n\t\t\t);\n\n\t\t\tif (!user) {\n\t\t\t\tthrow APIError.from(\"BAD_REQUEST\", BASE_ERROR_CODES.USER_NOT_FOUND);\n\t\t\t}\n\n\t\t\tconst alreadyMember = await adapter.findMemberByEmail({\n\t\t\t\temail: user.email,\n\t\t\t\torganizationId: orgId,\n\t\t\t});\n\n\t\t\tif (alreadyMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.USER_IS_ALREADY_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (teamId) {\n\t\t\t\tconst team = await adapter.findTeamById({\n\t\t\t\t\tteamId,\n\t\t\t\t\torganizationId: orgId,\n\t\t\t\t});\n\t\t\t\tif (!team || team.organizationId !== orgId) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst membershipLimit = ctx.context.orgOptions?.membershipLimit || 100;\n\t\t\tconst count = await adapter.countMembers({ organizationId: orgId });\n\n\t\t\tconst organization = await adapter.findOrganizationById(orgId);\n\t\t\tif (!organization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst limit =\n\t\t\t\ttypeof membershipLimit === \"number\"\n\t\t\t\t\t? membershipLimit\n\t\t\t\t\t: await membershipLimit(user, organization);\n\n\t\t\tif (count >= limit) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_MEMBERSHIP_LIMIT_REACHED,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst {\n\t\t\t\trole: _,\n\t\t\t\tuserId: __,\n\t\t\t\torganizationId: ___,\n\t\t\t\t...additionalFields\n\t\t\t} = ctx.body;\n\n\t\t\tlet memberData = {\n\t\t\t\torganizationId: orgId,\n\t\t\t\tuserId: user.id,\n\t\t\t\trole: parseRoles(ctx.body.role),\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t...(additionalFields ? additionalFields : {}),\n\t\t\t};\n\n\t\t\t// Run beforeAddMember hook\n\t\t\tif (option?.organizationHooks?.beforeAddMember) {\n\t\t\t\tconst response = await option?.organizationHooks.beforeAddMember({\n\t\t\t\t\tmember: {\n\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\torganizationId: orgId,\n\t\t\t\t\t\trole: parseRoles(ctx.body.role as string | string[]),\n\t\t\t\t\t\t...additionalFields,\n\t\t\t\t\t},\n\t\t\t\t\tuser,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t\tif (response && typeof response === \"object\" && \"data\" in response) {\n\t\t\t\t\tmemberData = {\n\t\t\t\t\t\t...memberData,\n\t\t\t\t\t\t...response.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst createdMember = await adapter.createMember(memberData);\n\n\t\t\tif (teamId) {\n\t\t\t\tawait adapter.findOrCreateTeamMember({\n\t\t\t\t\tuserId: user.id,\n\t\t\t\t\tteamId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Run afterAddMember hook\n\t\t\tif (option?.organizationHooks?.afterAddMember) {\n\t\t\t\tawait option?.organizationHooks.afterAddMember({\n\t\t\t\t\tmember: createdMember,\n\t\t\t\t\tuser,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.json(createdMember);\n\t\t},\n\t);\n};\n\nconst removeMemberBodySchema = z.object({\n\tmemberIdOrEmail: z.string().meta({\n\t\tdescription: \"The ID or email of the member to remove\",\n\t}),\n\t/**\n\t * If not provided, the active organization will be used\n\t */\n\torganizationId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription:\n\t\t\t\t'The ID of the organization to remove the member from. If not provided, the active organization will be used. Eg: \"org-id\"',\n\t\t})\n\t\t.optional(),\n});\n\nexport const removeMember = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/remove-member\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: removeMemberBodySchema,\n\t\t\trequireHeaders: true,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t\tmetadata: {\n\t\t\t\topenapi: {\n\t\t\t\t\tdescription: \"Remove a member from an organization\",\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tmember: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\trequired: [\"id\", \"userId\", \"organizationId\", \"role\"],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"member\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tconst organizationId =\n\t\t\t\tctx.body.organizationId || session.session.activeOrganizationId;\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlet toBeRemovedMember: InferMember<O> | null = null;\n\t\t\tif (ctx.body.memberIdOrEmail.includes(\"@\")) {\n\t\t\t\ttoBeRemovedMember = await adapter.findMemberByEmail({\n\t\t\t\t\temail: ctx.body.memberIdOrEmail,\n\t\t\t\t\torganizationId: organizationId,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst result = await adapter.findMemberById(ctx.body.memberIdOrEmail);\n\t\t\t\tif (!result) toBeRemovedMember = null;\n\t\t\t\telse {\n\t\t\t\t\tconst { user: _user, ...member } = result;\n\t\t\t\t\ttoBeRemovedMember = member as unknown as InferMember<O>;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!toBeRemovedMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst roles = toBeRemovedMember.role.split(\",\");\n\t\t\tconst creatorRole = ctx.context.orgOptions?.creatorRole || \"owner\";\n\t\t\tconst isOwner = roles.includes(creatorRole);\n\t\t\tif (isOwner) {\n\t\t\t\tif (member.role !== creatorRole) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst { members } = await adapter.listMembers({\n\t\t\t\t\torganizationId: organizationId,\n\t\t\t\t});\n\t\t\t\tconst owners = members.filter((member) => {\n\t\t\t\t\tconst roles = member.role.split(\",\");\n\t\t\t\t\treturn roles.includes(creatorRole);\n\t\t\t\t});\n\t\t\t\tif (owners.length <= 1) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst canDeleteMember = await hasPermission(\n\t\t\t\t{\n\t\t\t\t\trole: member.role,\n\t\t\t\t\toptions: ctx.context.orgOptions,\n\t\t\t\t\tpermissions: {\n\t\t\t\t\t\tmember: [\"delete\"],\n\t\t\t\t\t},\n\t\t\t\t\torganizationId,\n\t\t\t\t},\n\t\t\t\tctx,\n\t\t\t);\n\n\t\t\tif (!canDeleteMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (toBeRemovedMember?.organizationId !== organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst organization = await adapter.findOrganizationById(organizationId);\n\t\t\tif (!organization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst userBeingRemoved = await ctx.context.internalAdapter.findUserById(\n\t\t\t\ttoBeRemovedMember.userId,\n\t\t\t);\n\t\t\tif (!userBeingRemoved) {\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Run beforeRemoveMember hook\n\t\t\tif (options?.organizationHooks?.beforeRemoveMember) {\n\t\t\t\tawait options?.organizationHooks.beforeRemoveMember({\n\t\t\t\t\tmember: toBeRemovedMember,\n\t\t\t\t\tuser: userBeingRemoved,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait adapter.deleteMember({\n\t\t\t\tmemberId: toBeRemovedMember.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t\tuserId: toBeRemovedMember.userId,\n\t\t\t});\n\t\t\tif (\n\t\t\t\tsession.user.id === toBeRemovedMember.userId &&\n\t\t\t\tsession.session.activeOrganizationId ===\n\t\t\t\t\ttoBeRemovedMember.organizationId\n\t\t\t) {\n\t\t\t\tawait adapter.setActiveOrganization(session.session.token, null, ctx);\n\t\t\t}\n\n\t\t\t// Run afterRemoveMember hook\n\t\t\tif (options?.organizationHooks?.afterRemoveMember) {\n\t\t\t\tawait options?.organizationHooks.afterRemoveMember({\n\t\t\t\t\tmember: toBeRemovedMember,\n\t\t\t\t\tuser: userBeingRemoved,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.json({\n\t\t\t\tmember: toBeRemovedMember,\n\t\t\t});\n\t\t},\n\t);\n\nconst updateMemberRoleBodySchema = z.object({\n\trole: z.union([z.string(), z.array(z.string())]).meta({\n\t\tdescription:\n\t\t\t'The new role to be applied. This can be a string or array of strings representing the roles. Eg: [\"admin\", \"sale\"]',\n\t}),\n\tmemberId: z.string().meta({\n\t\tdescription: 'The member id to apply the role update to. Eg: \"member-id\"',\n\t}),\n\torganizationId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription:\n\t\t\t\t'An optional organization ID which the member is a part of to apply the role update. If not provided, you must provide session headers to get the active organization. Eg: \"organization-id\"',\n\t\t})\n\t\t.optional(),\n});\n\nexport const updateMemberRole = <O extends OrganizationOptions>(option: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/update-member-role\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: updateMemberRoleBodySchema,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t\trequireHeaders: true,\n\t\t\tmetadata: {\n\t\t\t\t$Infer: {\n\t\t\t\t\tbody: {} as {\n\t\t\t\t\t\trole:\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>[]\n\t\t\t\t\t\t\t| LiteralString\n\t\t\t\t\t\t\t| LiteralString[];\n\t\t\t\t\t\tmemberId: string;\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * If not provided, the active organization will be used\n\t\t\t\t\t\t */\n\t\t\t\t\t\torganizationId?: string | undefined;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\topenapi: {\n\t\t\t\t\toperationId: \"updateOrganizationMemberRole\",\n\t\t\t\t\tdescription: \"Update the role of a member in an organization\",\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tmember: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\trequired: [\"id\", \"userId\", \"organizationId\", \"role\"],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"member\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\n\t\t\tif (!ctx.body.role) {\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\");\n\t\t\t}\n\n\t\t\tconst organizationId =\n\t\t\t\tctx.body.organizationId || session.session.activeOrganizationId;\n\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\t\tconst roleToSet: string[] = Array.isArray(ctx.body.role)\n\t\t\t\t? ctx.body.role\n\t\t\t\t: ctx.body.role\n\t\t\t\t\t? [ctx.body.role]\n\t\t\t\t\t: [];\n\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst toBeUpdatedMember =\n\t\t\t\tmember.id !== ctx.body.memberId\n\t\t\t\t\t? await adapter.findMemberById(ctx.body.memberId)\n\t\t\t\t\t: member;\n\n\t\t\tif (!toBeUpdatedMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst memberBelongsToOrganization =\n\t\t\t\ttoBeUpdatedMember.organizationId === organizationId;\n\n\t\t\tif (!memberBelongsToOrganization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst creatorRole = ctx.context.orgOptions?.creatorRole || \"owner\";\n\n\t\t\tconst updatingMemberRoles = member.role.split(\",\");\n\t\t\tconst toBeUpdatedMemberRoles = toBeUpdatedMember.role.split(\",\");\n\n\t\t\tconst isUpdatingCreator = toBeUpdatedMemberRoles.includes(creatorRole);\n\t\t\tconst updaterIsCreator = updatingMemberRoles.includes(creatorRole);\n\n\t\t\tconst isSettingCreatorRole = roleToSet.includes(creatorRole);\n\n\t\t\tconst memberIsUpdatingThemselves = member.id === toBeUpdatedMember.id;\n\n\t\t\tif (\n\t\t\t\t(isUpdatingCreator && !updaterIsCreator) ||\n\t\t\t\t(isSettingCreatorRole && !updaterIsCreator)\n\t\t\t) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (updaterIsCreator && memberIsUpdatingThemselves) {\n\t\t\t\tconst members = await ctx.context.adapter.findMany<Member>({\n\t\t\t\t\tmodel: \"member\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\t\tvalue: organizationId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst owners = members.filter((member: Member) => {\n\t\t\t\t\tconst roles = member.role.split(\",\");\n\t\t\t\t\treturn roles.includes(creatorRole);\n\t\t\t\t});\n\t\t\t\tif (owners.length <= 1 && !isSettingCreatorRole) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_WITHOUT_AN_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst canUpdateMember = await hasPermission(\n\t\t\t\t{\n\t\t\t\t\trole: member.role,\n\t\t\t\t\toptions: ctx.context.orgOptions,\n\t\t\t\t\tpermissions: {\n\t\t\t\t\t\tmember: [\"update\"],\n\t\t\t\t\t},\n\t\t\t\t\tallowCreatorAllPermissions: true,\n\t\t\t\t\torganizationId,\n\t\t\t\t},\n\t\t\t\tctx,\n\t\t\t);\n\n\t\t\tif (!canUpdateMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst organization = await adapter.findOrganizationById(organizationId);\n\t\t\tif (!organization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst userBeingUpdated = await ctx.context.internalAdapter.findUserById(\n\t\t\t\ttoBeUpdatedMember.userId,\n\t\t\t);\n\t\t\tif (!userBeingUpdated) {\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst previousRole = toBeUpdatedMember.role;\n\t\t\tconst newRole = parseRoles(ctx.body.role as string | string[]);\n\n\t\t\t// Run beforeUpdateMemberRole hook\n\t\t\tif (option?.organizationHooks?.beforeUpdateMemberRole) {\n\t\t\t\tconst response = await option?.organizationHooks.beforeUpdateMemberRole(\n\t\t\t\t\t{\n\t\t\t\t\t\tmember: toBeUpdatedMember,\n\t\t\t\t\t\tnewRole,\n\t\t\t\t\t\tuser: userBeingUpdated,\n\t\t\t\t\t\torganization,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (response && typeof response === \"object\" && \"data\" in response) {\n\t\t\t\t\t// Allow the hook to modify the role\n\t\t\t\t\tconst updatedMember = await adapter.updateMember(\n\t\t\t\t\t\tctx.body.memberId,\n\t\t\t\t\t\tresponse.data.role || newRole,\n\t\t\t\t\t);\n\t\t\t\t\tif (!updatedMember) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Run afterUpdateMemberRole hook\n\t\t\t\t\tif (option?.organizationHooks?.afterUpdateMemberRole) {\n\t\t\t\t\t\tawait option?.organizationHooks.afterUpdateMemberRole({\n\t\t\t\t\t\t\tmember: updatedMember,\n\t\t\t\t\t\t\tpreviousRole,\n\t\t\t\t\t\t\tuser: userBeingUpdated,\n\t\t\t\t\t\t\torganization,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.json(updatedMember);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst updatedMember = await adapter.updateMember(\n\t\t\t\tctx.body.memberId,\n\t\t\t\tnewRole,\n\t\t\t);\n\t\t\tif (!updatedMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Run afterUpdateMemberRole hook\n\t\t\tif (option?.organizationHooks?.afterUpdateMemberRole) {\n\t\t\t\tawait option?.organizationHooks.afterUpdateMemberRole({\n\t\t\t\t\tmember: updatedMember,\n\t\t\t\t\tpreviousRole,\n\t\t\t\t\tuser: userBeingUpdated,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.json(updatedMember);\n\t\t},\n\t);\n\nexport const getActiveMember = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/get-active-member\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t\trequireHeaders: true,\n\t\t\tmetadata: {\n\t\t\t\topenapi: {\n\t\t\t\t\tdescription: \"Get the member details of the active organization\",\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"id\", \"userId\", \"organizationId\", \"role\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tconst organizationId = session.session.activeOrganizationId;\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn ctx.json(member);\n\t\t},\n\t);\n\nconst leaveOrganizationBodySchema = z.object({\n\torganizationId: z.string().meta({\n\t\tdescription:\n\t\t\t'The organization Id for the member to leave. Eg: \"organization-id\"',\n\t}),\n});\n\nexport const leaveOrganization = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/leave\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: leaveOrganizationBodySchema,\n\t\t\trequireHeaders: true,\n\t\t\tuse: [sessionMiddleware, orgMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: ctx.body.organizationId,\n\t\t\t});\n\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst creatorRole = ctx.context.orgOptions?.creatorRole || \"owner\";\n\t\t\tconst isOwnerLeaving = member.role.split(\",\").includes(creatorRole);\n\t\t\tif (isOwnerLeaving) {\n\t\t\t\tconst members = await ctx.context.adapter.findMany<Member>({\n\t\t\t\t\tmodel: \"member\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\t\tvalue: ctx.body.organizationId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst owners = members.filter((member) =>\n\t\t\t\t\tmember.role.split(\",\").includes(creatorRole),\n\t\t\t\t);\n\t\t\t\tif (owners.length <= 1) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait adapter.deleteMember({\n\t\t\t\tmemberId: member.id,\n\t\t\t\torganizationId: ctx.body.organizationId,\n\t\t\t\tuserId: session.user.id,\n\t\t\t});\n\t\t\tif (session.session.activeOrganizationId === ctx.body.organizationId) {\n\t\t\t\tawait adapter.setActiveOrganization(session.session.token, null, ctx);\n\t\t\t}\n\t\t\treturn ctx.json(member);\n\t\t},\n\t);\n\nexport const listMembers = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/list-members\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tquery: z\n\t\t\t\t.object({\n\t\t\t\t\tlimit: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The number of users to return\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.or(z.number())\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\toffset: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The offset to start from\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.or(z.number())\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tsortBy: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The field to sort by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tsortDirection: z\n\t\t\t\t\t\t.enum([\"asc\", \"desc\"])\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The direction to sort by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tfilterField: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The field to filter by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tfilterValue: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The value to filter by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.or(z.number())\n\t\t\t\t\t\t.or(z.boolean())\n\t\t\t\t\t\t.or(z.array(z.string()))\n\t\t\t\t\t\t.or(z.array(z.number()))\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tfilterOperator: z\n\t\t\t\t\t\t.enum(whereOperators)\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The operator to use for the filter\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\torganizationId: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t'The organization ID to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-id\"',\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\torganizationSlug: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t'The organization slug to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-slug\"',\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\trequireHeaders: true,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tlet organizationId =\n\t\t\t\tctx.query?.organizationId || session.session.activeOrganizationId;\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tif (ctx.query?.organizationSlug) {\n\t\t\t\tconst organization = await adapter.findOrganizationBySlug(\n\t\t\t\t\tctx.query?.organizationSlug,\n\t\t\t\t);\n\t\t\t\tif (!organization) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\torganizationId = organization.id;\n\t\t\t}\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst isMember = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId,\n\t\t\t});\n\t\t\tif (!isMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst { members, total } = await adapter.listMembers({\n\t\t\t\torganizationId,\n\t\t\t\tlimit: ctx.query?.limit ? Number(ctx.query.limit) : undefined,\n\t\t\t\toffset: ctx.query?.offset ? Number(ctx.query.offset) : undefined,\n\t\t\t\tsortBy: ctx.query?.sortBy,\n\t\t\t\tsortOrder: ctx.query?.sortDirection,\n\t\t\t\tfilter: ctx.query?.filterField\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tfield: ctx.query?.filterField,\n\t\t\t\t\t\t\toperator: ctx.query.filterOperator,\n\t\t\t\t\t\t\tvalue: ctx.query.filterValue,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\treturn ctx.json({\n\t\t\t\tmembers,\n\t\t\t\ttotal,\n\t\t\t});\n\t\t},\n\t);\n\nconst getActiveMemberRoleQuerySchema = z\n\t.object({\n\t\tuserId: z\n\t\t\t.string()\n\t\t\t.meta({\n\t\t\t\tdescription:\n\t\t\t\t\t\"The user ID to get the role for. If not provided, will default to the current user's\",\n\t\t\t})\n\t\t\t.optional(),\n\t\torganizationId: z\n\t\t\t.string()\n\t\t\t.meta({\n\t\t\t\tdescription:\n\t\t\t\t\t'The organization ID to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-id\"',\n\t\t\t})\n\t\t\t.optional(),\n\t\torganizationSlug: z\n\t\t\t.string()\n\t\t\t.meta({\n\t\t\t\tdescription:\n\t\t\t\t\t'The organization slug to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-slug\"',\n\t\t\t})\n\t\t\t.optional(),\n\t})\n\t.optional();\n\nexport const getActiveMemberRole = <O extends OrganizationOptions>(\n\toptions: O,\n) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/get-active-member-role\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tquery: getActiveMemberRoleQuerySchema,\n\t\t\trequireHeaders: true,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tlet organizationId =\n\t\t\t\tctx.query?.organizationId || session.session.activeOrganizationId;\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tif (ctx.query?.organizationSlug) {\n\t\t\t\tconst organization = await adapter.findOrganizationBySlug(\n\t\t\t\t\tctx.query?.organizationSlug,\n\t\t\t\t);\n\t\t\t\tif (!organization) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\torganizationId = organization.id;\n\t\t\t}\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst isMember = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId,\n\t\t\t});\n\t\t\tif (!isMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!ctx.query?.userId) {\n\t\t\t\treturn ctx.json({\n\t\t\t\t\trole: isMember.role,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst userIdToGetRole = ctx.query?.userId;\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: userIdToGetRole,\n\t\t\t\torganizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn ctx.json({\n\t\t\t\trole: member?.role,\n\t\t\t});\n\t\t},\n\t);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"crud-members.mjs","names":[],"sources":["../../../../src/plugins/organization/routes/crud-members.ts"],"sourcesContent":["import type { LiteralString } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport { whereOperators } from \"@better-auth/core/db/adapter\";\nimport { APIError, BASE_ERROR_CODES } from \"@better-auth/core/error\";\nimport * as z from \"zod\";\nimport { getSessionFromCtx, sessionMiddleware } from \"../../../api\";\nimport type { InferAdditionalFieldsFromPluginOptions } from \"../../../db\";\nimport { toZodSchema } from \"../../../db/to-zod\";\nimport { getOrgAdapter } from \"../adapter\";\nimport { orgMiddleware, orgSessionMiddleware } from \"../call\";\nimport { ORGANIZATION_ERROR_CODES } from \"../error-codes\";\nimport { hasPermission } from \"../has-permission\";\nimport { parseRoles } from \"../organization\";\nimport type {\n\tInferMember,\n\tInferOrganizationRolesFromOption,\n\tMember,\n} from \"../schema\";\nimport type { OrganizationOptions } from \"../types\";\n\nconst baseMemberSchema = z.object({\n\tuserId: z.coerce.string().meta({\n\t\tdescription:\n\t\t\t'The user Id which represents the user to be added as a member. If `null` is provided, then it\\'s expected to provide session headers. Eg: \"user-id\"',\n\t}),\n\trole: z.union([z.string(), z.array(z.string())]).meta({\n\t\tdescription:\n\t\t\t'The role(s) to assign to the new member. Eg: [\"admin\", \"sale\"]',\n\t}),\n\torganizationId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription:\n\t\t\t\t'An optional organization ID to pass. If not provided, will default to the user\\'s active organization. Eg: \"org-id\"',\n\t\t})\n\t\t.optional(),\n\tteamId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription: 'An optional team ID to add the member to. Eg: \"team-id\"',\n\t\t})\n\t\t.optional(),\n});\n\nexport const addMember = <O extends OrganizationOptions>(option: O) => {\n\tconst additionalFieldsSchema = toZodSchema({\n\t\tfields: option?.schema?.member?.additionalFields || {},\n\t\tisClientSide: true,\n\t});\n\treturn createAuthEndpoint(\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: z.object({\n\t\t\t\t...baseMemberSchema.shape,\n\t\t\t\t...additionalFieldsSchema.shape,\n\t\t\t}),\n\t\t\tuse: [orgMiddleware],\n\t\t\tmetadata: {\n\t\t\t\t$Infer: {\n\t\t\t\t\tbody: {} as {\n\t\t\t\t\t\tuserId: string;\n\t\t\t\t\t\trole:\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>[];\n\t\t\t\t\t\torganizationId?: string | undefined;\n\t\t\t\t\t} & (O extends { teams: { enabled: true } }\n\t\t\t\t\t\t? { teamId?: string | undefined }\n\t\t\t\t\t\t: {}) &\n\t\t\t\t\t\tInferAdditionalFieldsFromPluginOptions<\"member\", O>,\n\t\t\t\t},\n\t\t\t\topenapi: {\n\t\t\t\t\toperationId: \"addOrganizationMember\",\n\t\t\t\t\tdescription: \"Add a member to an organization\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.body.userId\n\t\t\t\t? await getSessionFromCtx<{\n\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\tactiveOrganizationId?: string | undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t}>(ctx).catch((e) => null)\n\t\t\t\t: null;\n\t\t\tconst orgId =\n\t\t\t\tctx.body.organizationId || session?.session.activeOrganizationId;\n\t\t\tif (!orgId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst teamId =\n\t\t\t\t\"teamId\" in ctx.body ? (ctx.body.teamId as string) : undefined;\n\t\t\tif (teamId && !ctx.context.orgOptions.teams?.enabled) {\n\t\t\t\tctx.context.logger.error(\"Teams are not enabled\");\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"Teams are not enabled\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, option);\n\n\t\t\tconst user = await ctx.context.internalAdapter.findUserById(\n\t\t\t\tctx.body.userId,\n\t\t\t);\n\n\t\t\tif (!user) {\n\t\t\t\tthrow APIError.from(\"BAD_REQUEST\", BASE_ERROR_CODES.USER_NOT_FOUND);\n\t\t\t}\n\n\t\t\tconst alreadyMember = await adapter.findMemberByEmail({\n\t\t\t\temail: user.email,\n\t\t\t\torganizationId: orgId,\n\t\t\t});\n\n\t\t\tif (alreadyMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.USER_IS_ALREADY_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (teamId) {\n\t\t\t\tconst team = await adapter.findTeamById({\n\t\t\t\t\tteamId,\n\t\t\t\t\torganizationId: orgId,\n\t\t\t\t});\n\t\t\t\tif (!team || team.organizationId !== orgId) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst membershipLimit = ctx.context.orgOptions?.membershipLimit || 100;\n\t\t\tconst count = await adapter.countMembers({ organizationId: orgId });\n\n\t\t\tconst organization = await adapter.findOrganizationById(orgId);\n\t\t\tif (!organization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst limit =\n\t\t\t\ttypeof membershipLimit === \"number\"\n\t\t\t\t\t? membershipLimit\n\t\t\t\t\t: await membershipLimit(user, organization);\n\n\t\t\tif (count >= limit) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_MEMBERSHIP_LIMIT_REACHED,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst {\n\t\t\t\trole: _,\n\t\t\t\tuserId: __,\n\t\t\t\torganizationId: ___,\n\t\t\t\t...additionalFields\n\t\t\t} = ctx.body;\n\n\t\t\tlet memberData = {\n\t\t\t\torganizationId: orgId,\n\t\t\t\tuserId: user.id,\n\t\t\t\trole: parseRoles(ctx.body.role),\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t...(additionalFields ? additionalFields : {}),\n\t\t\t};\n\n\t\t\t// Run beforeAddMember hook\n\t\t\tif (option?.organizationHooks?.beforeAddMember) {\n\t\t\t\tconst response = await option?.organizationHooks.beforeAddMember({\n\t\t\t\t\tmember: {\n\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\torganizationId: orgId,\n\t\t\t\t\t\trole: parseRoles(ctx.body.role as string | string[]),\n\t\t\t\t\t\t...additionalFields,\n\t\t\t\t\t},\n\t\t\t\t\tuser,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t\tif (response && typeof response === \"object\" && \"data\" in response) {\n\t\t\t\t\tmemberData = {\n\t\t\t\t\t\t...memberData,\n\t\t\t\t\t\t...response.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst createdMember = await adapter.createMember(memberData);\n\n\t\t\tif (teamId) {\n\t\t\t\tawait adapter.findOrCreateTeamMember({\n\t\t\t\t\tuserId: user.id,\n\t\t\t\t\tteamId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Run afterAddMember hook\n\t\t\tif (option?.organizationHooks?.afterAddMember) {\n\t\t\t\tawait option?.organizationHooks.afterAddMember({\n\t\t\t\t\tmember: createdMember,\n\t\t\t\t\tuser,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.json(createdMember);\n\t\t},\n\t);\n};\n\nconst removeMemberBodySchema = z.object({\n\tmemberIdOrEmail: z.string().meta({\n\t\tdescription: \"The ID or email of the member to remove\",\n\t}),\n\t/**\n\t * If not provided, the active organization will be used\n\t */\n\torganizationId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription:\n\t\t\t\t'The ID of the organization to remove the member from. If not provided, the active organization will be used. Eg: \"org-id\"',\n\t\t})\n\t\t.optional(),\n});\n\nexport const removeMember = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/remove-member\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: removeMemberBodySchema,\n\t\t\trequireHeaders: true,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t\tmetadata: {\n\t\t\t\topenapi: {\n\t\t\t\t\tdescription: \"Remove a member from an organization\",\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tmember: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\trequired: [\"id\", \"userId\", \"organizationId\", \"role\"],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"member\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tconst organizationId =\n\t\t\t\tctx.body.organizationId || session.session.activeOrganizationId;\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlet toBeRemovedMember: InferMember<O> | null = null;\n\t\t\tif (ctx.body.memberIdOrEmail.includes(\"@\")) {\n\t\t\t\ttoBeRemovedMember = await adapter.findMemberByEmail({\n\t\t\t\t\temail: ctx.body.memberIdOrEmail,\n\t\t\t\t\torganizationId: organizationId,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst result = await adapter.findMemberById(ctx.body.memberIdOrEmail);\n\t\t\t\tif (!result) toBeRemovedMember = null;\n\t\t\t\telse {\n\t\t\t\t\tconst { user: _user, ...member } = result;\n\t\t\t\t\ttoBeRemovedMember = member as unknown as InferMember<O>;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!toBeRemovedMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst roles = toBeRemovedMember.role.split(\",\");\n\t\t\tconst creatorRole = ctx.context.orgOptions?.creatorRole || \"owner\";\n\t\t\tconst isOwner = roles.includes(creatorRole);\n\t\t\tif (isOwner) {\n\t\t\t\tif (\n\t\t\t\t\t!member.role\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((r) => r.trim())\n\t\t\t\t\t\t.includes(creatorRole)\n\t\t\t\t) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst { members } = await adapter.listMembers({\n\t\t\t\t\torganizationId: organizationId,\n\t\t\t\t});\n\t\t\t\tconst owners = members.filter((member) => {\n\t\t\t\t\tconst roles = member.role.split(\",\");\n\t\t\t\t\treturn roles.includes(creatorRole);\n\t\t\t\t});\n\t\t\t\tif (owners.length <= 1) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst canDeleteMember = await hasPermission(\n\t\t\t\t{\n\t\t\t\t\trole: member.role,\n\t\t\t\t\toptions: ctx.context.orgOptions,\n\t\t\t\t\tpermissions: {\n\t\t\t\t\t\tmember: [\"delete\"],\n\t\t\t\t\t},\n\t\t\t\t\torganizationId,\n\t\t\t\t},\n\t\t\t\tctx,\n\t\t\t);\n\n\t\t\tif (!canDeleteMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (toBeRemovedMember?.organizationId !== organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst organization = await adapter.findOrganizationById(organizationId);\n\t\t\tif (!organization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst userBeingRemoved = await ctx.context.internalAdapter.findUserById(\n\t\t\t\ttoBeRemovedMember.userId,\n\t\t\t);\n\t\t\tif (!userBeingRemoved) {\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Run beforeRemoveMember hook\n\t\t\tif (options?.organizationHooks?.beforeRemoveMember) {\n\t\t\t\tawait options?.organizationHooks.beforeRemoveMember({\n\t\t\t\t\tmember: toBeRemovedMember,\n\t\t\t\t\tuser: userBeingRemoved,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait adapter.deleteMember({\n\t\t\t\tmemberId: toBeRemovedMember.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t\tuserId: toBeRemovedMember.userId,\n\t\t\t});\n\t\t\tif (\n\t\t\t\tsession.user.id === toBeRemovedMember.userId &&\n\t\t\t\tsession.session.activeOrganizationId ===\n\t\t\t\t\ttoBeRemovedMember.organizationId\n\t\t\t) {\n\t\t\t\tawait adapter.setActiveOrganization(session.session.token, null, ctx);\n\t\t\t}\n\n\t\t\t// Run afterRemoveMember hook\n\t\t\tif (options?.organizationHooks?.afterRemoveMember) {\n\t\t\t\tawait options?.organizationHooks.afterRemoveMember({\n\t\t\t\t\tmember: toBeRemovedMember,\n\t\t\t\t\tuser: userBeingRemoved,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.json({\n\t\t\t\tmember: toBeRemovedMember,\n\t\t\t});\n\t\t},\n\t);\n\nconst updateMemberRoleBodySchema = z.object({\n\trole: z.union([z.string(), z.array(z.string())]).meta({\n\t\tdescription:\n\t\t\t'The new role to be applied. This can be a string or array of strings representing the roles. Eg: [\"admin\", \"sale\"]',\n\t}),\n\tmemberId: z.string().meta({\n\t\tdescription: 'The member id to apply the role update to. Eg: \"member-id\"',\n\t}),\n\torganizationId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription:\n\t\t\t\t'An optional organization ID which the member is a part of to apply the role update. If not provided, you must provide session headers to get the active organization. Eg: \"organization-id\"',\n\t\t})\n\t\t.optional(),\n});\n\nexport const updateMemberRole = <O extends OrganizationOptions>(option: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/update-member-role\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: updateMemberRoleBodySchema,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t\trequireHeaders: true,\n\t\t\tmetadata: {\n\t\t\t\t$Infer: {\n\t\t\t\t\tbody: {} as {\n\t\t\t\t\t\trole:\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>[]\n\t\t\t\t\t\t\t| LiteralString\n\t\t\t\t\t\t\t| LiteralString[];\n\t\t\t\t\t\tmemberId: string;\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * If not provided, the active organization will be used\n\t\t\t\t\t\t */\n\t\t\t\t\t\torganizationId?: string | undefined;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\topenapi: {\n\t\t\t\t\toperationId: \"updateOrganizationMemberRole\",\n\t\t\t\t\tdescription: \"Update the role of a member in an organization\",\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tmember: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\trequired: [\"id\", \"userId\", \"organizationId\", \"role\"],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"member\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\n\t\t\tif (!ctx.body.role) {\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\");\n\t\t\t}\n\n\t\t\tconst organizationId =\n\t\t\t\tctx.body.organizationId || session.session.activeOrganizationId;\n\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\t\tconst roleToSet: string[] = Array.isArray(ctx.body.role)\n\t\t\t\t? ctx.body.role\n\t\t\t\t: ctx.body.role\n\t\t\t\t\t? [ctx.body.role]\n\t\t\t\t\t: [];\n\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst toBeUpdatedMember =\n\t\t\t\tmember.id !== ctx.body.memberId\n\t\t\t\t\t? await adapter.findMemberById(ctx.body.memberId)\n\t\t\t\t\t: member;\n\n\t\t\tif (!toBeUpdatedMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst memberBelongsToOrganization =\n\t\t\t\ttoBeUpdatedMember.organizationId === organizationId;\n\n\t\t\tif (!memberBelongsToOrganization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst creatorRole = ctx.context.orgOptions?.creatorRole || \"owner\";\n\n\t\t\tconst updatingMemberRoles = member.role.split(\",\");\n\t\t\tconst toBeUpdatedMemberRoles = toBeUpdatedMember.role.split(\",\");\n\n\t\t\tconst isUpdatingCreator = toBeUpdatedMemberRoles.includes(creatorRole);\n\t\t\tconst updaterIsCreator = updatingMemberRoles.includes(creatorRole);\n\n\t\t\tconst isSettingCreatorRole = roleToSet.includes(creatorRole);\n\n\t\t\tconst memberIsUpdatingThemselves = member.id === toBeUpdatedMember.id;\n\n\t\t\tif (\n\t\t\t\t(isUpdatingCreator && !updaterIsCreator) ||\n\t\t\t\t(isSettingCreatorRole && !updaterIsCreator)\n\t\t\t) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (updaterIsCreator && memberIsUpdatingThemselves) {\n\t\t\t\tconst members = await ctx.context.adapter.findMany<Member>({\n\t\t\t\t\tmodel: \"member\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\t\tvalue: organizationId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst owners = members.filter((member: Member) => {\n\t\t\t\t\tconst roles = member.role.split(\",\");\n\t\t\t\t\treturn roles.includes(creatorRole);\n\t\t\t\t});\n\t\t\t\tif (owners.length <= 1 && !isSettingCreatorRole) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_WITHOUT_AN_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst canUpdateMember = await hasPermission(\n\t\t\t\t{\n\t\t\t\t\trole: member.role,\n\t\t\t\t\toptions: ctx.context.orgOptions,\n\t\t\t\t\tpermissions: {\n\t\t\t\t\t\tmember: [\"update\"],\n\t\t\t\t\t},\n\t\t\t\t\tallowCreatorAllPermissions: true,\n\t\t\t\t\torganizationId,\n\t\t\t\t},\n\t\t\t\tctx,\n\t\t\t);\n\n\t\t\tif (!canUpdateMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst organization = await adapter.findOrganizationById(organizationId);\n\t\t\tif (!organization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst userBeingUpdated = await ctx.context.internalAdapter.findUserById(\n\t\t\t\ttoBeUpdatedMember.userId,\n\t\t\t);\n\t\t\tif (!userBeingUpdated) {\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst previousRole = toBeUpdatedMember.role;\n\t\t\tconst newRole = parseRoles(ctx.body.role as string | string[]);\n\n\t\t\t// Run beforeUpdateMemberRole hook\n\t\t\tif (option?.organizationHooks?.beforeUpdateMemberRole) {\n\t\t\t\tconst response = await option?.organizationHooks.beforeUpdateMemberRole(\n\t\t\t\t\t{\n\t\t\t\t\t\tmember: toBeUpdatedMember,\n\t\t\t\t\t\tnewRole,\n\t\t\t\t\t\tuser: userBeingUpdated,\n\t\t\t\t\t\torganization,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (response && typeof response === \"object\" && \"data\" in response) {\n\t\t\t\t\t// Allow the hook to modify the role\n\t\t\t\t\tconst updatedMember = await adapter.updateMember(\n\t\t\t\t\t\tctx.body.memberId,\n\t\t\t\t\t\tresponse.data.role || newRole,\n\t\t\t\t\t);\n\t\t\t\t\tif (!updatedMember) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Run afterUpdateMemberRole hook\n\t\t\t\t\tif (option?.organizationHooks?.afterUpdateMemberRole) {\n\t\t\t\t\t\tawait option?.organizationHooks.afterUpdateMemberRole({\n\t\t\t\t\t\t\tmember: updatedMember,\n\t\t\t\t\t\t\tpreviousRole,\n\t\t\t\t\t\t\tuser: userBeingUpdated,\n\t\t\t\t\t\t\torganization,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.json(updatedMember);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst updatedMember = await adapter.updateMember(\n\t\t\t\tctx.body.memberId,\n\t\t\t\tnewRole,\n\t\t\t);\n\t\t\tif (!updatedMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Run afterUpdateMemberRole hook\n\t\t\tif (option?.organizationHooks?.afterUpdateMemberRole) {\n\t\t\t\tawait option?.organizationHooks.afterUpdateMemberRole({\n\t\t\t\t\tmember: updatedMember,\n\t\t\t\t\tpreviousRole,\n\t\t\t\t\tuser: userBeingUpdated,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.json(updatedMember);\n\t\t},\n\t);\n\nexport const getActiveMember = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/get-active-member\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t\trequireHeaders: true,\n\t\t\tmetadata: {\n\t\t\t\topenapi: {\n\t\t\t\t\tdescription: \"Get the member details of the active organization\",\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"id\", \"userId\", \"organizationId\", \"role\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tconst organizationId = session.session.activeOrganizationId;\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn ctx.json(member);\n\t\t},\n\t);\n\nconst leaveOrganizationBodySchema = z.object({\n\torganizationId: z.string().meta({\n\t\tdescription:\n\t\t\t'The organization Id for the member to leave. Eg: \"organization-id\"',\n\t}),\n});\n\nexport const leaveOrganization = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/leave\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: leaveOrganizationBodySchema,\n\t\t\trequireHeaders: true,\n\t\t\tuse: [sessionMiddleware, orgMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: ctx.body.organizationId,\n\t\t\t});\n\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst creatorRole = ctx.context.orgOptions?.creatorRole || \"owner\";\n\t\t\tconst isOwnerLeaving = member.role.split(\",\").includes(creatorRole);\n\t\t\tif (isOwnerLeaving) {\n\t\t\t\tconst members = await ctx.context.adapter.findMany<Member>({\n\t\t\t\t\tmodel: \"member\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\t\tvalue: ctx.body.organizationId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst owners = members.filter((member) =>\n\t\t\t\t\tmember.role.split(\",\").includes(creatorRole),\n\t\t\t\t);\n\t\t\t\tif (owners.length <= 1) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait adapter.deleteMember({\n\t\t\t\tmemberId: member.id,\n\t\t\t\torganizationId: ctx.body.organizationId,\n\t\t\t\tuserId: session.user.id,\n\t\t\t});\n\t\t\tif (session.session.activeOrganizationId === ctx.body.organizationId) {\n\t\t\t\tawait adapter.setActiveOrganization(session.session.token, null, ctx);\n\t\t\t}\n\t\t\treturn ctx.json(member);\n\t\t},\n\t);\n\nexport const listMembers = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/list-members\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tquery: z\n\t\t\t\t.object({\n\t\t\t\t\tlimit: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The number of users to return\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.or(z.number())\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\toffset: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The offset to start from\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.or(z.number())\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tsortBy: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The field to sort by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tsortDirection: z\n\t\t\t\t\t\t.enum([\"asc\", \"desc\"])\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The direction to sort by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tfilterField: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The field to filter by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tfilterValue: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The value to filter by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.or(z.number())\n\t\t\t\t\t\t.or(z.boolean())\n\t\t\t\t\t\t.or(z.array(z.string()))\n\t\t\t\t\t\t.or(z.array(z.number()))\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tfilterOperator: z\n\t\t\t\t\t\t.enum(whereOperators)\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The operator to use for the filter\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\torganizationId: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t'The organization ID to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-id\"',\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\torganizationSlug: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t'The organization slug to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-slug\"',\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\trequireHeaders: true,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tlet organizationId =\n\t\t\t\tctx.query?.organizationId || session.session.activeOrganizationId;\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tif (ctx.query?.organizationSlug) {\n\t\t\t\tconst organization = await adapter.findOrganizationBySlug(\n\t\t\t\t\tctx.query?.organizationSlug,\n\t\t\t\t);\n\t\t\t\tif (!organization) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\torganizationId = organization.id;\n\t\t\t}\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst isMember = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId,\n\t\t\t});\n\t\t\tif (!isMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst { members, total } = await adapter.listMembers({\n\t\t\t\torganizationId,\n\t\t\t\tlimit: ctx.query?.limit ? Number(ctx.query.limit) : undefined,\n\t\t\t\toffset: ctx.query?.offset ? Number(ctx.query.offset) : undefined,\n\t\t\t\tsortBy: ctx.query?.sortBy,\n\t\t\t\tsortOrder: ctx.query?.sortDirection,\n\t\t\t\tfilter: ctx.query?.filterField\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tfield: ctx.query?.filterField,\n\t\t\t\t\t\t\toperator: ctx.query.filterOperator,\n\t\t\t\t\t\t\tvalue: ctx.query.filterValue,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\treturn ctx.json({\n\t\t\t\tmembers,\n\t\t\t\ttotal,\n\t\t\t});\n\t\t},\n\t);\n\nconst getActiveMemberRoleQuerySchema = z\n\t.object({\n\t\tuserId: z\n\t\t\t.string()\n\t\t\t.meta({\n\t\t\t\tdescription:\n\t\t\t\t\t\"The user ID to get the role for. If not provided, will default to the current user's\",\n\t\t\t})\n\t\t\t.optional(),\n\t\torganizationId: z\n\t\t\t.string()\n\t\t\t.meta({\n\t\t\t\tdescription:\n\t\t\t\t\t'The organization ID to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-id\"',\n\t\t\t})\n\t\t\t.optional(),\n\t\torganizationSlug: z\n\t\t\t.string()\n\t\t\t.meta({\n\t\t\t\tdescription:\n\t\t\t\t\t'The organization slug to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-slug\"',\n\t\t\t})\n\t\t\t.optional(),\n\t})\n\t.optional();\n\nexport const getActiveMemberRole = <O extends OrganizationOptions>(\n\toptions: O,\n) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/get-active-member-role\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tquery: getActiveMemberRoleQuerySchema,\n\t\t\trequireHeaders: true,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tlet organizationId =\n\t\t\t\tctx.query?.organizationId || session.session.activeOrganizationId;\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tif (ctx.query?.organizationSlug) {\n\t\t\t\tconst organization = await adapter.findOrganizationBySlug(\n\t\t\t\t\tctx.query?.organizationSlug,\n\t\t\t\t);\n\t\t\t\tif (!organization) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\torganizationId = organization.id;\n\t\t\t}\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst isMember = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId,\n\t\t\t});\n\t\t\tif (!isMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!ctx.query?.userId) {\n\t\t\t\treturn ctx.json({\n\t\t\t\t\trole: isMember.role,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst userIdToGetRole = ctx.query?.userId;\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: userIdToGetRole,\n\t\t\t\torganizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn ctx.json({\n\t\t\t\trole: member?.role,\n\t\t\t});\n\t\t},\n\t);\n"],"mappings":"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"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { FieldAttributeToObject, InferAdditionalFieldsFromPluginOptions, RemoveFieldsWithReturnedFalse } from "../../../db/field.mjs";
|
|
2
2
|
import { Role } from "../../access/types.mjs";
|
|
3
|
-
import "../../../db/index.mjs";
|
|
4
3
|
import { OrganizationOptions } from "../types.mjs";
|
|
5
4
|
import { InferInvitation, InferMember, InferTeam } from "../schema.mjs";
|
|
6
|
-
import "../../index.mjs";
|
|
7
5
|
import { defaultRoles } from "../access/statement.mjs";
|
|
8
|
-
import "../access/index.mjs";
|
|
9
6
|
import * as _better_auth_core0 from "@better-auth/core";
|
|
10
7
|
import * as _better_auth_core_db0 from "@better-auth/core/db";
|
|
11
8
|
import * as better_call0 from "better-call";
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { FieldAttributeToObject, InferAdditionalFieldsFromPluginOptions } from "../../../db/field.mjs";
|
|
2
2
|
import { PrettifyDeep } from "../../../types/helper.mjs";
|
|
3
3
|
import { Role } from "../../access/types.mjs";
|
|
4
|
-
import "../../../db/index.mjs";
|
|
5
4
|
import { OrganizationOptions } from "../types.mjs";
|
|
6
5
|
import { teamSchema } from "../schema.mjs";
|
|
7
|
-
import "../../index.mjs";
|
|
8
6
|
import { defaultRoles } from "../access/statement.mjs";
|
|
9
|
-
import "../access/index.mjs";
|
|
10
7
|
import * as _better_auth_core0 from "@better-auth/core";
|
|
11
8
|
import * as _better_auth_core_db0 from "@better-auth/core/db";
|
|
12
9
|
import * as better_call0 from "better-call";
|
|
@@ -827,6 +824,7 @@ declare const addTeamMember: <O extends OrganizationOptions>(options: O) => bett
|
|
|
827
824
|
body: z.ZodObject<{
|
|
828
825
|
teamId: z.ZodString;
|
|
829
826
|
userId: z.ZodCoercedString<unknown>;
|
|
827
|
+
organizationId: z.ZodOptional<z.ZodString>;
|
|
830
828
|
}, z.core.$strip>;
|
|
831
829
|
metadata: {
|
|
832
830
|
openapi: {
|
|
@@ -957,6 +955,7 @@ declare const removeTeamMember: <O extends OrganizationOptions>(options: O) => b
|
|
|
957
955
|
body: z.ZodObject<{
|
|
958
956
|
teamId: z.ZodString;
|
|
959
957
|
userId: z.ZodCoercedString<unknown>;
|
|
958
|
+
organizationId: z.ZodOptional<z.ZodString>;
|
|
960
959
|
}, z.core.$strip>;
|
|
961
960
|
metadata: {
|
|
962
961
|
openapi: {
|
|
@@ -501,7 +501,8 @@ const listTeamMembers = (options) => createAuthEndpoint("/organization/list-team
|
|
|
501
501
|
});
|
|
502
502
|
const addTeamMemberBodySchema = z.object({
|
|
503
503
|
teamId: z.string().meta({ description: "The team the user should be a member of." }),
|
|
504
|
-
userId: z.coerce.string().meta({ description: "The user Id which represents the user to be added as a member." })
|
|
504
|
+
userId: z.coerce.string().meta({ description: "The user Id which represents the user to be added as a member." }),
|
|
505
|
+
organizationId: z.string().meta({ description: "The organization ID which the team falls under. If not provided, it will default to the user's active organization." }).optional()
|
|
505
506
|
});
|
|
506
507
|
const addTeamMember = (options) => createAuthEndpoint("/organization/add-team-member", {
|
|
507
508
|
method: "POST",
|
|
@@ -546,28 +547,29 @@ const addTeamMember = (options) => createAuthEndpoint("/organization/add-team-me
|
|
|
546
547
|
}, async (ctx) => {
|
|
547
548
|
const session = ctx.context.session;
|
|
548
549
|
const adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);
|
|
549
|
-
|
|
550
|
+
const organizationId = ctx.body.organizationId || session.session.activeOrganizationId;
|
|
551
|
+
if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
|
|
550
552
|
const currentMember = await adapter.findMemberByOrgId({
|
|
551
553
|
userId: session.user.id,
|
|
552
|
-
organizationId
|
|
554
|
+
organizationId
|
|
553
555
|
});
|
|
554
556
|
if (!currentMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION);
|
|
555
557
|
if (!await hasPermission({
|
|
556
558
|
role: currentMember.role,
|
|
557
559
|
options: ctx.context.orgOptions,
|
|
558
560
|
permissions: { member: ["update"] },
|
|
559
|
-
organizationId
|
|
561
|
+
organizationId
|
|
560
562
|
}, ctx)) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_TEAM_MEMBER);
|
|
561
563
|
if (!await adapter.findMemberByOrgId({
|
|
562
564
|
userId: ctx.body.userId,
|
|
563
|
-
organizationId
|
|
565
|
+
organizationId
|
|
564
566
|
})) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION);
|
|
565
567
|
const team = await adapter.findTeamById({
|
|
566
568
|
teamId: ctx.body.teamId,
|
|
567
|
-
organizationId
|
|
569
|
+
organizationId
|
|
568
570
|
});
|
|
569
571
|
if (!team) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND);
|
|
570
|
-
const organization = await adapter.findOrganizationById(
|
|
572
|
+
const organization = await adapter.findOrganizationById(organizationId);
|
|
571
573
|
if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
|
|
572
574
|
const userBeingAdded = await ctx.context.internalAdapter.findUserById(ctx.body.userId);
|
|
573
575
|
if (!userBeingAdded) throw APIError.fromStatus("BAD_REQUEST", { message: "User not found" });
|
|
@@ -597,7 +599,8 @@ const addTeamMember = (options) => createAuthEndpoint("/organization/add-team-me
|
|
|
597
599
|
});
|
|
598
600
|
const removeTeamMemberBodySchema = z.object({
|
|
599
601
|
teamId: z.string().meta({ description: "The team the user should be removed from." }),
|
|
600
|
-
userId: z.coerce.string().meta({ description: "The user which should be removed from the team." })
|
|
602
|
+
userId: z.coerce.string().meta({ description: "The user which should be removed from the team." }),
|
|
603
|
+
organizationId: z.string().meta({ description: "The organization ID which the team falls under. If not provided, it will default to the user's active organization." }).optional()
|
|
601
604
|
});
|
|
602
605
|
const removeTeamMember = (options) => createAuthEndpoint("/organization/remove-team-member", {
|
|
603
606
|
method: "POST",
|
|
@@ -622,28 +625,29 @@ const removeTeamMember = (options) => createAuthEndpoint("/organization/remove-t
|
|
|
622
625
|
}, async (ctx) => {
|
|
623
626
|
const session = ctx.context.session;
|
|
624
627
|
const adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);
|
|
625
|
-
|
|
628
|
+
const organizationId = ctx.body.organizationId || session.session.activeOrganizationId;
|
|
629
|
+
if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
|
|
626
630
|
const currentMember = await adapter.findMemberByOrgId({
|
|
627
631
|
userId: session.user.id,
|
|
628
|
-
organizationId
|
|
632
|
+
organizationId
|
|
629
633
|
});
|
|
630
634
|
if (!currentMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION);
|
|
631
635
|
if (!await hasPermission({
|
|
632
636
|
role: currentMember.role,
|
|
633
637
|
options: ctx.context.orgOptions,
|
|
634
638
|
permissions: { member: ["delete"] },
|
|
635
|
-
organizationId
|
|
639
|
+
organizationId
|
|
636
640
|
}, ctx)) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_REMOVE_A_TEAM_MEMBER);
|
|
637
641
|
if (!await adapter.findMemberByOrgId({
|
|
638
642
|
userId: ctx.body.userId,
|
|
639
|
-
organizationId
|
|
643
|
+
organizationId
|
|
640
644
|
})) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION);
|
|
641
645
|
const team = await adapter.findTeamById({
|
|
642
646
|
teamId: ctx.body.teamId,
|
|
643
|
-
organizationId
|
|
647
|
+
organizationId
|
|
644
648
|
});
|
|
645
649
|
if (!team) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND);
|
|
646
|
-
const organization = await adapter.findOrganizationById(
|
|
650
|
+
const organization = await adapter.findOrganizationById(organizationId);
|
|
647
651
|
if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
|
|
648
652
|
const userBeingRemoved = await ctx.context.internalAdapter.findUserById(ctx.body.userId);
|
|
649
653
|
if (!userBeingRemoved) throw APIError.fromStatus("BAD_REQUEST", { message: "User not found" });
|