feat: team invitation mutations

This commit is contained in:
Andrew Bastin
2021-10-15 20:55:52 +05:30
committed by liyasthomas
parent a12315d81a
commit d9d7261bc5
5 changed files with 94 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
mutation AcceptTeamInvitation($inviteID: ID!) {
acceptTeamInvitation(inviteID: $inviteID) {
membershipID
role
user {
uid
displayName
photoURL
email
}
}
}

View File

@@ -0,0 +1,9 @@
mutation CreateTeamInvitation($inviteeEmail: String!, $inviteeRole: TeamMemberRole!, $teamID: ID!) {
createTeamInvitation(inviteeRole: $inviteeRole, inviteeEmail: $inviteeEmail, teamID: $teamID) {
id
teamID
creatorUid
inviteeEmail
inviteeRole
}
}

View File

@@ -0,0 +1,3 @@
mutation RevokeTeamInvitation($inviteID: ID!) {
revokeTeamInvitation(inviteID: $inviteID)
}

View File

@@ -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
}
)

View 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>