feat: team invitation mutations
This commit is contained in:
@@ -0,0 +1,12 @@
|
|||||||
|
mutation AcceptTeamInvitation($inviteID: ID!) {
|
||||||
|
acceptTeamInvitation(inviteID: $inviteID) {
|
||||||
|
membershipID
|
||||||
|
role
|
||||||
|
user {
|
||||||
|
uid
|
||||||
|
displayName
|
||||||
|
photoURL
|
||||||
|
email
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
mutation CreateTeamInvitation($inviteeEmail: String!, $inviteeRole: TeamMemberRole!, $teamID: ID!) {
|
||||||
|
createTeamInvitation(inviteeRole: $inviteeRole, inviteeEmail: $inviteeEmail, teamID: $teamID) {
|
||||||
|
id
|
||||||
|
teamID
|
||||||
|
creatorUid
|
||||||
|
inviteeEmail
|
||||||
|
inviteeRole
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
mutation RevokeTeamInvitation($inviteID: ID!) {
|
||||||
|
revokeTeamInvitation(inviteID: $inviteID)
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
import { runMutation } from "../GQLClient";
|
||||||
|
import { AcceptTeamInvitationDocument, AcceptTeamInvitationMutation, AcceptTeamInvitationMutationVariables, CreateTeamInvitationDocument, CreateTeamInvitationMutation, CreateTeamInvitationMutationVariables, RevokeTeamInvitationDocument, RevokeTeamInvitationMutation, RevokeTeamInvitationMutationVariables, TeamMemberRole } from "../graphql";
|
||||||
|
import { Email } from "../types/Email";
|
||||||
|
import { pipe } from "fp-ts/function";
|
||||||
|
import * as TE from "fp-ts/TaskEither";
|
||||||
|
|
||||||
|
type CreateTeamInvitationErrors
|
||||||
|
= "invalid/email" | "team/invalid_id" | "team/member_not_found" | "team_invite/already_member" | "team_invite/member_has_invite"
|
||||||
|
|
||||||
|
type RevokeTeamInvitationErrors
|
||||||
|
= "team/not_required_role" | "team_invite/no_invite_found"
|
||||||
|
|
||||||
|
type AcceptTeamInvitationErrors
|
||||||
|
= "team_invite/no_invite_found" | "team_invitee/not_invitee" | "team_invite/already_member" | "team_invite/email_do_not_match"
|
||||||
|
|
||||||
|
export const createTeamInvitation = (inviteeEmail: Email, inviteeRole: TeamMemberRole, teamID: string) =>
|
||||||
|
pipe(
|
||||||
|
runMutation<
|
||||||
|
CreateTeamInvitationMutation,
|
||||||
|
CreateTeamInvitationMutationVariables,
|
||||||
|
CreateTeamInvitationErrors
|
||||||
|
>(
|
||||||
|
CreateTeamInvitationDocument,
|
||||||
|
{
|
||||||
|
inviteeEmail,
|
||||||
|
inviteeRole,
|
||||||
|
teamID
|
||||||
|
}
|
||||||
|
),
|
||||||
|
TE.map((x) => x.createTeamInvitation)
|
||||||
|
)
|
||||||
|
|
||||||
|
export const revokeTeamInvitation = (inviteID: string) =>
|
||||||
|
runMutation<
|
||||||
|
RevokeTeamInvitationMutation,
|
||||||
|
RevokeTeamInvitationMutationVariables,
|
||||||
|
RevokeTeamInvitationErrors
|
||||||
|
>(
|
||||||
|
RevokeTeamInvitationDocument,
|
||||||
|
{
|
||||||
|
inviteID
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
export const acceptTeamInvitation = (inviteID: string) =>
|
||||||
|
runMutation<
|
||||||
|
AcceptTeamInvitationMutation,
|
||||||
|
AcceptTeamInvitationMutationVariables,
|
||||||
|
AcceptTeamInvitationErrors
|
||||||
|
>(
|
||||||
|
AcceptTeamInvitationDocument,
|
||||||
|
{
|
||||||
|
inviteID
|
||||||
|
}
|
||||||
|
)
|
||||||
15
packages/hoppscotch-app/helpers/backend/types/Email.ts
Normal file
15
packages/hoppscotch-app/helpers/backend/types/Email.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import * as t from "io-ts"
|
||||||
|
|
||||||
|
const emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
|
||||||
|
|
||||||
|
interface EmailBrand {
|
||||||
|
readonly Email: unique symbol
|
||||||
|
}
|
||||||
|
|
||||||
|
export const EmailCodec = t.brand(
|
||||||
|
t.string,
|
||||||
|
(x): x is t.Branded<string, EmailBrand> => emailRegex.test(x),
|
||||||
|
"Email"
|
||||||
|
)
|
||||||
|
|
||||||
|
export type Email = t.TypeOf<typeof EmailCodec>
|
||||||
Reference in New Issue
Block a user