ソースを参照

feat: team invitation mutations

Andrew Bastin 4 年 前
コミット
d9d7261bc5

+ 12 - 0
packages/hoppscotch-app/helpers/backend/gql/mutations/AcceptTeamInvitation.graphql

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

+ 9 - 0
packages/hoppscotch-app/helpers/backend/gql/mutations/CreateTeamInvitation.graphql

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

+ 3 - 0
packages/hoppscotch-app/helpers/backend/gql/mutations/RevokeTeamInvitation.graphql

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

+ 55 - 0
packages/hoppscotch-app/helpers/backend/mutations/TeamInvitation.ts

@@ -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 - 0
packages/hoppscotch-app/helpers/backend/types/Email.ts

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