diff --git a/packages/integrations/gei-users/package.json b/packages/integrations/gei-users/package.json index 1ad7ca1..692af4d 100644 --- a/packages/integrations/gei-users/package.json +++ b/packages/integrations/gei-users/package.json @@ -1,13 +1,13 @@ { "name": "gei-users", - "version": "0.8.0", + "version": "0.8.1", "description": "Automatically generated by graphql-editor-cli", "main": "lib/index.js", "scripts": { "start": "gecli dev", "build": "tsc", "watch": "tsc --watch", - "update": "gecli codegen models && gecli schema && gecli codegen typings", + "update": "gecli codegen models && gecli schema pull && gecli codegen typings", "integrate": "gecli gei integrate", "integrate:env": "dotenv -e .env gecli gei integrate" }, diff --git a/packages/integrations/gei-users/schema.graphql b/packages/integrations/gei-users/schema.graphql index 7780596..c80d79b 100644 --- a/packages/integrations/gei-users/schema.graphql +++ b/packages/integrations/gei-users/schema.graphql @@ -1,479 +1,427 @@ +type Query { + login: LoginQuery! + """ + Check if the user is logged in from headers and return it + """ + isUser: User + mustBeUser: User + mustBeTeamMember(teamId: String!): UserMember! + team(teamId: String!): Team + showTeamInvitations(sentFromMyTeam: Boolean, status: InvitationTeamStatus): [InvitationTeamToken!]! + showInviteTokens: [InviteToken!]! + getGoogleOAuthLink(setup: GetOAuthInput!): String! + getMicrosoftOAuthLink(setup: GetOAuthInput!): String! + getGithubOAuthLink(setup: GetOAuthInput!): String! + getAppleOAuthLink(setup: GetOAuthInput!): String! + requestForForgotPassword(username: String!): Boolean! +} + +enum MustBeTeamMemberError { + USER_IS_NOT_A_TEAM_MEMBER + TEAM_DOES_NOT_EXIST +} + +type UserMember { + user: UserAuthType! + team: TeamAuthType! +} + +input GetOAuthInput { + scopes: [String!] + state: String + redirectUri: String +} + +type Mutation { + """ + user + """ + register(user: RegisterInput!): RegisterResponse! + verifyEmail(verifyData: VerifyEmailInput!): VerifyEmailResponse! + changePasswordWhenLogged(changePasswordData: ChangePasswordWhenLoggedInput!): ChangePasswordWhenLoggedResponse! + changePasswordWithToken(token: ChangePasswordWithTokenInput!): ChangePasswordWithTokenResponse! + generateInviteToken( + """ + string format mm/dd/rrrr + """ + tokenOptions: InviteTokenInput! + ): GenerateInviteTokenResponse! + deleteInvitation(id: String!): Boolean! + removeUserFromTeam(data: RemoveUserFromTeamInput!): RemoveUserFromTeamResponse! + sendInvitationToTeam(invitation: SendTeamInvitationInput!): SendInvitationToTeamResponse! + joinToTeam(teamId: String!): JoinToTeamResponse! + joinToTeamWithInvitationToken(token: String!): JoinToTeamWithInvitationTokenResponse! + createTeam(teamName: String!): CreateTeamResponse! + squashAccounts(password: String): SquashAccountsResponse! + integrateSocialAccount(userData: SimpleUserInput!): IntegrateSocialAccountResponse! + generateOAuthToken(tokenData: GenerateOAuthTokenInput!): GenerateOAuthTokenResponse! + editUser(updatedUser: UpdateUserInput!): EditUserResponse! +} + +enum EditUserError { + USERNAME_ALREADY_TAKEN + FAILED_MONGO_UPDATE + USER_DOES_NOT_EXIST +} +type EditUserResponse { + result: Boolean + hasError: EditUserError +} + +enum VerifyEmailError { + TOKEN_CANNOT_BE_FOUND +} -type Query{ - login: LoginQuery! - """ - Check if the user is logged in from headers and return it - """ - isUser: User - mustBeUser: User - mustBeTeamMember( - teamId: String! - ): UserMember! - team( - teamId: String! - ): Team - showTeamInvitations( - sentFromMyTeam: Boolean - status: InvitationTeamStatus - ): [InvitationTeamToken!]! - showInviteTokens: [InviteToken!]! - getGoogleOAuthLink( - setup: GetOAuthInput! - ): String! - getMicrosoftOAuthLink( - setup: GetOAuthInput! - ): String! - getGithubOAuthLink( - setup: GetOAuthInput! - ): String! - getAppleOAuthLink( - setup: GetOAuthInput! - ): String! - requestForForgotPassword( - username: String! - ): Boolean! -} - -enum MustBeTeamMemberError{ - USER_IS_NOT_A_TEAM_MEMBER - TEAM_DOES_NOT_EXIST -} - -type UserMember{ - user: UserAuthType! - team: TeamAuthType! -} - -input GetOAuthInput{ - scopes: [String!] - state: String - redirectUri: String -} - -type Mutation{ - """ - user - """ - register( - user: RegisterInput! - ): RegisterResponse! - verifyEmail( - verifyData: VerifyEmailInput! - ): VerifyEmailResponse! - changePasswordWhenLogged( - changePasswordData: ChangePasswordWhenLoggedInput! - ): ChangePasswordWhenLoggedResponse! - changePasswordWithToken( - token: ChangePasswordWithTokenInput! - ): ChangePasswordWithTokenResponse! - generateInviteToken( - """ - string format mm/dd/rrrr - """ - tokenOptions: InviteTokenInput! - ): GenerateInviteTokenResponse! - deleteInvitation( - id: String! - ): Boolean! - removeUserFromTeam( - data: RemoveUserFromTeamInput! - ): RemoveUserFromTeamResponse! - sendInvitationToTeam( - invitation: SendTeamInvitationInput! - ): SendInvitationToTeamResponse! - joinToTeam( - teamId: String! - ): JoinToTeamResponse! - joinToTeamWithInvitationToken( - token: String! - ): JoinToTeamWithInvitationTokenResponse! - createTeam( - teamName: String! - ): CreateTeamResponse! - squashAccounts( - password: String - ): SquashAccountsResponse! - integrateSocialAccount( - userData: SimpleUserInput! - ): IntegrateSocialAccountResponse! - generateOAuthToken( - tokenData: GenerateOAuthTokenInput! - ): GenerateOAuthTokenResponse! - editUser( - updatedUser: UpdateUserInput! - ): EditUserResponse! -} - -enum EditUserError { - USERNAME_ALREADY_TAKEN - FAILED_MONGO_UPDATE - USER_DOES_NOT_EXIST +type VerifyEmailResponse { + result: Boolean + hasError: VerifyEmailError } -type EditUserResponse{ - result: Boolean - hasError: EditUserError +enum ChangePasswordWhenLoggedError { + CANNOT_CHANGE_PASSWORD_FOR_USER_REGISTERED_VIA_SOCIAL + OLD_PASSWORD_IS_INVALID + PASSWORD_WEAK } +type ChangePasswordWhenLoggedResponse { + result: Boolean + hasError: ChangePasswordWhenLoggedError +} + +enum ChangePasswordWithTokenError { + CANNOT_CHANGE_PASSWORD_FOR_USER_REGISTERED_VIA_SOCIAL + TOKEN_IS_INVALID + PASSWORD_IS_TOO_WEAK +} -enum VerifyEmailError{ - TOKEN_CANNOT_BE_FOUND +type ChangePasswordWithTokenResponse { + result: Boolean + hasError: ChangePasswordWithTokenError } -type VerifyEmailResponse{ - result: Boolean - hasError: VerifyEmailError +enum GenerateInviteTokenError { + YOU_ARE_NOT_THE_OWNER_OF_A_TEAM_OR_TEAM_DOES_NOT_EXIST } -enum ChangePasswordWhenLoggedError{ - CANNOT_CHANGE_PASSWORD_FOR_USER_REGISTERED_VIA_SOCIAL - OLD_PASSWORD_IS_INVALID - PASSWORD_WEAK +type GenerateInviteTokenResponse { + result: String + hasError: GenerateInviteTokenError } -type ChangePasswordWhenLoggedResponse{ - result: Boolean - hasError: ChangePasswordWhenLoggedError +enum RemoveUserFromTeamError { + YOU_ARE_NOT_THE_OWNER_OF_A_TEAM_OR_TEAM_DOES_NOT_EXIST + YOU_CANNOT_KICK_YOURSELF_FROM_THE_TEAM + USER_NOT_FOUND } -enum ChangePasswordWithTokenError{ - CANNOT_CHANGE_PASSWORD_FOR_USER_REGISTERED_VIA_SOCIAL - TOKEN_IS_INVALID - PASSWORD_IS_TOO_WEAK +type RemoveUserFromTeamResponse { + result: Boolean + hasError: GenerateInviteTokenError } -type ChangePasswordWithTokenResponse{ - result: Boolean - hasError: ChangePasswordWithTokenError +enum SendInvitationToTeamError { + USER_ALREADY_HAS_YOUR_INVITATION + YOU_CANNOT_SEND_INVITATION_TO_YOURSELF + USER_IS_NOT_OWNER_OF_THE_TEAM + CANNOT_FIND_USER + USERNAME_IS_TOO_AMBIGUOUS + USER_ALREADY_EXISTS_IN_THE_TEAM } -enum GenerateInviteTokenError{ - YOU_ARE_NOT_THE_OWNER_OF_A_TEAM_OR_TEAM_DOES_NOT_EXIST +type SendInvitationToTeamResponse { + result: Boolean + hasError: SendInvitationToTeamError } -type GenerateInviteTokenResponse{ - result: String - hasError: GenerateInviteTokenError +enum JoinToTeamError { + TEAM_INVITATION_DOES_NOT_EXIST_OR_CAPTURED + MEMBER_ALREADY_EXISTS_IN_THE_TEAM } -enum RemoveUserFromTeamError{ - YOU_ARE_NOT_THE_OWNER_OF_A_TEAM_OR_TEAM_DOES_NOT_EXIST - YOU_CANNOT_KICK_YOURSELF_FROM_THE_TEAM - USER_NOT_FOUND +type JoinToTeamResponse { + result: Boolean + hasError: JoinToTeamError } -type RemoveUserFromTeamResponse{ - result: Boolean - hasError: GenerateInviteTokenError +enum CreateTeamError { + TEAM_NOT_CREATED } -enum SendInvitationToTeamError{ - USER_ALREADY_HAS_YOUR_INVITATION - YOU_CANNOT_SEND_INVITATION_TO_YOURSELF - USER_IS_NOT_OWNER_OF_THE_TEAM - CANNOT_FIND_USER - USERNAME_IS_TOO_AMBIGUOUS +type CreateTeamResponse { + result: String + hasError: CreateTeamError } -type SendInvitationToTeamResponse{ - result: Boolean - hasError: SendInvitationToTeamError +enum SquashAccountsError { + YOU_HAVE_ONLY_ONE_ACCOUNT + YOUR_ACCOUNTS_DO_NOT_HAVE_CONFIRMED_EMAIL + INCORRECT_PASSWORD } -enum JoinToTeamError{ - TEAM_INVITATION_DOES_NOT_EXIST_OR_CAPTURED - MEMBER_ALREADY_EXISTS_IN_THE_TEAM +type SquashAccountsResponse { + result: Boolean + hasError: SquashAccountsError } -type JoinToTeamResponse{ - result: Boolean - hasError: JoinToTeamError +enum JoinToTeamWithInvitationTokenError { + INVITATION_TOKEN_NOT_FOUND + TEAM_IN_INVITATION_TOKEN_NOT_SPECIFIED + MEMBER_ALREADY_EXISTS_IN_THE_TEAM + INVITATION_TOKEN_EXPIRED } -enum CreateTeamError{ - TEAM_NOT_CREATED +type JoinToTeamWithInvitationTokenResponse { + result: Boolean + hasError: JoinToTeamWithInvitationTokenError } -type CreateTeamResponse{ - result: String - hasError: CreateTeamError +enum IntegrateSocialAccountError { + YOU_HAVE_ONLY_ONE_ACCOUNT + YOUR_ACCOUNT_DOES_NOT_HANDLE_CHANGE_PASSWORD_MODE + INCORRECT_PASSWORD + CANNOT_FIND_USER + YOUR_ACCOUNT_DOES_NOT_HAVE_CONFIRMED_EMAIL } -enum SquashAccountsError{ - YOU_HAVE_ONLY_ONE_ACCOUNT - YOUR_ACCOUNTS_DO_NOT_HAVE_CONFIRMED_EMAIL - INCORRECT_PASSWORD +type IntegrateSocialAccountResponse { + result: Boolean + hasError: IntegrateSocialAccountError } -type SquashAccountsResponse{ - result: Boolean - hasError: SquashAccountsError +enum GenerateOAuthTokenError { + TOKEN_NOT_GENERATED + CANNOT_RETRIEVE_USER_INFORMATION_FROM_APPLE } -enum JoinToTeamWithInvitationTokenError{ - INVITATION_TOKEN_NOT_FOUND - TEAM_IN_INVITATION_TOKEN_NOT_SPECIFIED - MEMBER_ALREADY_EXISTS_IN_THE_TEAM - INVITATION_TOKEN_EXPIRED +type GenerateOAuthTokenResponse { + result: String + hasError: GenerateOAuthTokenError } -type JoinToTeamWithInvitationTokenResponse{ - result: Boolean - hasError: JoinToTeamWithInvitationTokenError +input RemoveUserFromTeamInput { + userId: String! + teamId: String! } -enum IntegrateSocialAccountError{ - YOU_HAVE_ONLY_ONE_ACCOUNT - YOUR_ACCOUNT_DOES_NOT_HANDLE_CHANGE_PASSWORD_MODE - INCORRECT_PASSWORD - CANNOT_FIND_USER - YOUR_ACCOUNT_DOES_NOT_HAVE_CONFIRMED_EMAIL +input UpdateUserInput { + userId: String! + username: String + fullName: String } -type IntegrateSocialAccountResponse{ - result: Boolean - hasError: IntegrateSocialAccountError +input GenerateOAuthTokenInput { + social: SocialKind! + code: String! } -enum GenerateOAuthTokenError{ - TOKEN_NOT_GENERATED - CANNOT_RETRIEVE_USER_INFORMATION_FROM_APPLE +input SimpleUserInput { + username: String! + password: String! } -type GenerateOAuthTokenResponse{ - result: String - hasError: GenerateOAuthTokenError +input LoginInput { + username: String! + password: String! } -input RemoveUserFromTeamInput{ - userId: String! - teamId: String! +input SendTeamInvitationInput { + username: String! + teamId: String! } -input UpdateUserInput{ - userId: String! - username: String - fullName: String +input VerifyEmailInput { + token: String! } -input GenerateOAuthTokenInput{ - social: SocialKind! - code: String! +input InviteTokenInput { + expires: String + domain: String + teamId: String } -input SimpleUserInput{ - username: String! - password: String! +input ChangePasswordWithTokenInput { + username: String! + forgotToken: String! + newPassword: String! } -input LoginInput{ - username: String! - password: String! +input ChangePasswordWhenLoggedInput { + username: String! + oldPassword: String! + newPassword: String! } -input SendTeamInvitationInput{ - username: String! - teamId: String! +input RegisterInput { + username: String! + password: String! + fullName: String + invitationToken: String } -input VerifyEmailInput{ - token: String! +type InvitationTeamToken implements Node { + teamId: String! + recipient: String! + status: InvitationTeamStatus! + _id: String! + teamName: String! } -input InviteTokenInput{ - expires: String - domain: String - teamId: String +type InviteToken implements Node { + token: String! + expires: String! + domain: String! + owner: String! + teamId: String + _id: String! } -input ChangePasswordWithTokenInput{ - username: String! - forgotToken: String! - newPassword: String! +type Team implements Node { + _id: String! + name: String! + owner: String + members: [TeamMember!]! + createdAt: String } -input ChangePasswordWhenLoggedInput{ - username: String! - oldPassword: String! - newPassword: String! +type TeamAuthType implements Node { + _id: String! + name: String! + owner: String + members: [String!]! } -input RegisterInput{ - username: String! - password: String! - fullName: String - invitationToken: String +type User implements Node { + _id: String! + username: String! + teams: [Team!]! + emailConfirmed: Boolean! + createdAt: String + fullName: String + avatarUrl: String } -type InvitationTeamToken implements Node{ - teamId: String! - recipient: String! - status: InvitationTeamStatus! - _id: String! - teamName: String! +type UserAuthType { + _id: String! + username: String! + teams: [String!]! + emailConfirmed: Boolean! } -type InviteToken implements Node{ - token: String! - expires: String! - domain: String! - owner: String! - teamId: String - _id: String! +type Social implements Node { + _id: String! + socialId: String! + userId: String! + createdAt: String } -type Team implements Node{ - _id: String! - name: String! - owner: String - members: [TeamMember!]! - createdAt: String +enum InvitationTeamStatus { + Waiting + Taken } -type TeamAuthType implements Node{ - _id: String! - name: String! - owner: String - members: [String!]! +type UserAuth implements Node { + _id: String! + username: String! + password: String } -type User implements Node{ - _id: String! - username: String! - teams: [Team!]! - emailConfirmed: Boolean! - createdAt: String - fullName: String - avatarUrl: String +enum SocialKind { + Google + Github + Apple + Microsoft } -type UserAuthType{ - _id: String! - username: String! - teams: [String!]! - emailConfirmed: Boolean! +type TeamMember implements Node { + _id: String! + username: String! + fullName: String } -type Social implements Node{ - _id: String! - socialId: String! - userId: String! - createdAt: String +interface Node { + _id: String! } -enum InvitationTeamStatus{ - Waiting - Taken +type LoginQuery { + password(user: LoginInput!): LoginResponse! + provider(params: ProviderLoginInput!): ProviderLoginQuery! + """ + endpoint for refreshing accessToken based on refreshToken + """ + refreshToken(refreshToken: String!): String! } -type UserAuth implements Node{ - _id: String! - username: String! - password: String +input ProviderLoginInput { + code: String! + redirectUri: String! } -enum SocialKind{ - Google - Github - Apple - Microsoft +type ProviderLoginQuery { + apple: ProviderResponse + google: ProviderResponse + github: ProviderResponse + microsoft: ProviderResponse } -type TeamMember implements Node{ - _id: String! - username: String! - fullName: String +enum RegisterErrors { + USERNAME_EXISTS + PASSWORD_WEAK + INVITE_DOMAIN_INCORRECT + LINK_EXPIRED + USERNAME_INVALID } -interface Node{ - _id: String! +enum LoginErrors { + CONFIRM_EMAIL_BEFOR_LOGIN + INVALID_LOGIN_OR_PASSWORD + CANNOT_FIND_CONNECTED_USER + YOU_PROVIDED_OTHER_METHOD_OF_LOGIN_ON_THIS_EMAIL + UNEXPECTED_ERROR } -type LoginQuery{ - password( - user: LoginInput! - ): LoginResponse! - provider( - params: ProviderLoginInput! - ): ProviderLoginQuery! - """ - endpoint for refreshing accessToken based on refreshToken - """ - refreshToken( - refreshToken: String! - ): String! +enum ProviderErrors { + CANNOT_RETRIVE_PROFILE_FROM_GOOGLE_TRY_REFRESH_TOKEN + CANNOT_FIND_EMAIL_FOR_THIS_PROFIL + CANNOT_RETRIVE_USER_INFORMATION_FROM_APPLE + CODE_IS_NOT_EXIST_IN_ARGS + CANNOT_RETRIVE_SUB_FIELD_FROM_JWT_TOKEN + CANNOT_RETRIVE_TOKEN_FROM_MICROSOFT } -input ProviderLoginInput{ - code: String! - redirectUri: String! -} - -type ProviderLoginQuery{ - apple: ProviderResponse - google: ProviderResponse - github: ProviderResponse - microsoft: ProviderResponse -} - -enum RegisterErrors{ - USERNAME_EXISTS - PASSWORD_WEAK - INVITE_DOMAIN_INCORRECT - LINK_EXPIRED - USERNAME_INVALID -} - -enum LoginErrors{ - CONFIRM_EMAIL_BEFOR_LOGIN - INVALID_LOGIN_OR_PASSWORD - CANNOT_FIND_CONNECTED_USER - YOU_PROVIDED_OTHER_METHOD_OF_LOGIN_ON_THIS_EMAIL - UNEXPECTED_ERROR -} - -enum ProviderErrors{ - CANNOT_RETRIVE_PROFILE_FROM_GOOGLE_TRY_REFRESH_TOKEN - CANNOT_FIND_EMAIL_FOR_THIS_PROFIL - CANNOT_RETRIVE_USER_INFORMATION_FROM_APPLE - CODE_IS_NOT_EXIST_IN_ARGS - CANNOT_RETRIVE_SUB_FIELD_FROM_JWT_TOKEN - CANNOT_RETRIVE_TOKEN_FROM_MICROSOFT -} - -type RegisterResponse{ - registered: Boolean - hasError: RegisterErrors +type RegisterResponse { + registered: Boolean + hasError: RegisterErrors } -type LoginResponse{ - """ - same value as accessToken, for delete in future, - improvise, adapt, overcome, frontend! - """ - login: String - accessToken: String - refreshToken: String - hasError: LoginErrors -} - -type ProviderResponse{ - """ - same value as accessToken, for delete in future, - improvise, adapt, overcome, frontend! - """ - jwt: String - accessToken: String - refreshToken: String - providerAccessToken: String - """ - field describes whether this is first login attempt for this username - """ - register: Boolean - hasError: ProviderErrors -} -schema{ - query: Query, - mutation: Mutation -} \ No newline at end of file +type LoginResponse { + """ + same value as accessToken, for delete in future, + improvise, adapt, overcome, frontend! + """ + login: String + accessToken: String + refreshToken: String + hasError: LoginErrors +} + +type ProviderResponse { + """ + same value as accessToken, for delete in future, + improvise, adapt, overcome, frontend! + """ + jwt: String + accessToken: String + refreshToken: String + providerAccessToken: String + """ + field describes whether this is first login attempt for this username + """ + register: Boolean + hasError: ProviderErrors +} + +schema { + query: Query + mutation: Mutation +} diff --git a/packages/integrations/gei-users/src/Mutation/sendInvitationToTeam.ts b/packages/integrations/gei-users/src/Mutation/sendInvitationToTeam.ts index 997069a..46c3aa8 100644 --- a/packages/integrations/gei-users/src/Mutation/sendInvitationToTeam.ts +++ b/packages/integrations/gei-users/src/Mutation/sendInvitationToTeam.ts @@ -24,6 +24,9 @@ export const sendInvitationToTeam = async (input: FieldResolveInput) => const recipientUser = await o(UserCollection).collection.find({ username }).toArray(); if (recipientUser.length === 0) return { hasError: SendInvitationToTeamError.CANNOT_FIND_USER }; if (recipientUser.length >= 2) return { hasError: SendInvitationToTeamError.USERNAME_IS_TOO_AMBIGUOUS }; + + if (teamById.members.includes(recipientUser[0]._id)) + return { hasError: SendInvitationToTeamError.USER_ALREADY_HAS_YOUR_INVITATION }; const result = await o(TeamInvitationsCollection).createWithAutoFields('_id')({ teamId: teamById._id, teamName: teamById.name, diff --git a/packages/integrations/gei-users/src/zeus/index.ts b/packages/integrations/gei-users/src/zeus/index.ts index 7e61707..673f589 100644 --- a/packages/integrations/gei-users/src/zeus/index.ts +++ b/packages/integrations/gei-users/src/zeus/index.ts @@ -1437,6 +1437,11 @@ improvise, adapt, overcome, frontend! */ register?:boolean | `@${string}`, hasError?:boolean | `@${string}`, __typename?: boolean | `@${string}` +}>; + ["schema"]: AliasType<{ + query?:ResolverInputTypes["Query"], + mutation?:ResolverInputTypes["Mutation"], + __typename?: boolean | `@${string}` }> } @@ -1701,6 +1706,10 @@ improvise, adapt, overcome, frontend! */ /** field describes whether this is first login attempt for this username */ register?: boolean | undefined, hasError?: ModelTypes["ProviderErrors"] | undefined +}; + ["schema"]: { + query?: ModelTypes["Query"] | undefined, + mutation?: ModelTypes["Mutation"] | undefined } } @@ -2043,7 +2052,8 @@ export const enum SendInvitationToTeamError { YOU_CANNOT_SEND_INVITATION_TO_YOURSELF = "YOU_CANNOT_SEND_INVITATION_TO_YOURSELF", USER_IS_NOT_OWNER_OF_THE_TEAM = "USER_IS_NOT_OWNER_OF_THE_TEAM", CANNOT_FIND_USER = "CANNOT_FIND_USER", - USERNAME_IS_TOO_AMBIGUOUS = "USERNAME_IS_TOO_AMBIGUOUS" + USERNAME_IS_TOO_AMBIGUOUS = "USERNAME_IS_TOO_AMBIGUOUS", + USER_ALREADY_EXISTS_IN_THE_TEAM = "USER_ALREADY_EXISTS_IN_THE_TEAM" } export const enum JoinToTeamError { TEAM_INVITATION_DOES_NOT_EXIST_OR_CAPTURED = "TEAM_INVITATION_DOES_NOT_EXIST_OR_CAPTURED",