Files
hoppscotch/packages/hoppscotch-app/helpers/backend/mutations/Team.ts

183 lines
3.7 KiB
TypeScript

import gql from "graphql-tag"
import { pipe } from "fp-ts/function"
import * as TE from "fp-ts/TaskEither"
import { runMutation } from "../GQLClient"
import { TeamName } from "../types/TeamName"
import { TeamMemberRole } from "../types/TeamMemberRole"
type DeleteTeamErrors =
| "team/not_required_role"
| "team/invalid_id"
| "team/member_not_found"
| "ea/not_invite_or_admin"
type ExitTeamErrors =
| "team/invalid_id"
| "team/member_not_found"
| "ea/not_invite_or_admin"
type CreateTeamErrors = "team/name_invalid" | "ea/not_invite_or_admin"
type RenameTeamErrors =
| "ea/not_invite_or_admin"
| "team/invalid_id"
| "team/not_required_role"
type UpdateTeamMemberRoleErrors =
| "ea/not_invite_or_admin"
| "team/invalid_id"
| "team/not_required_role"
type RemoveTeamMemberErrors =
| "ea/not_invite_or_admin"
| "team/invalid_id"
| "team/not_required_role"
export const createTeam = (name: TeamName) =>
pipe(
runMutation<
{
createTeam: {
id: string
name: string
members: Array<{ membershipID: string }>
myRole: TeamMemberRole
ownersCount: number
editorsCount: number
viewersCount: number
}
},
CreateTeamErrors
>(
gql`
mutation CreateTeam($name: String!) {
createTeam(name: $name) {
id
name
members {
membershipID
}
myRole
ownersCount
editorsCount
viewersCount
}
}
`,
{
name,
}
),
TE.map(({ createTeam }) => createTeam)
)
export const deleteTeam = (teamID: string) =>
runMutation<void, DeleteTeamErrors>(
gql`
mutation DeleteTeam($teamID: ID!) {
deleteTeam(teamID: $teamID)
}
`,
{
teamID,
},
{
additionalTypenames: ["Team"],
}
)
export const leaveTeam = (teamID: string) =>
runMutation<void, ExitTeamErrors>(
gql`
mutation ExitTeam($teamID: ID!) {
leaveTeam(teamID: $teamID)
}
`,
{
teamID,
},
{
additionalTypenames: ["Team"],
}
)
export const renameTeam = (teamID: string, newName: TeamName) =>
pipe(
runMutation<
{
renameTeam: {
id: string
name: TeamName
}
},
RenameTeamErrors
>(
gql`
mutation RenameTeam($newName: String!, $teamID: ID!) {
renameTeam(newName: $newName, teamID: $teamID) {
id
name
}
}
`,
{
newName,
teamID,
}
),
TE.map(({ renameTeam }) => renameTeam)
)
export const updateTeamMemberRole = (
userUid: string,
teamID: string,
newRole: TeamMemberRole
) =>
pipe(
runMutation<
{
updateTeamMemberRole: {
membershipID: string
role: TeamMemberRole
}
},
UpdateTeamMemberRoleErrors
>(
gql`
mutation UpdateTeamMemberRole(
$newRole: TeamMemberRole!,
$userUid: ID!,
teamID: ID!
) {
updateTeamMemberRole(
newRole: $newRole
userUid: $userUid
teamID: $teamID
) {
membershipID
role
}
}
`,
{
newRole,
userUid,
teamID,
}
),
TE.map(({ updateTeamMemberRole }) => updateTeamMemberRole)
)
export const removeTeamMember = (userUid: string, teamID: string) =>
runMutation<void, RemoveTeamMemberErrors>(
gql`
mutation RemoveTeamMember($userUid: ID!, $teamID: ID!) {
removeTeamMember(userUid: $userUid, teamID: $teamID)
}
`,
{
userUid,
teamID,
}
)