feat(fe2): invite + list workspace invites (#2629)

* list invites table

* invites list works

* update last reminded date on resend

* fix FE

* WIP invitedialog + updated debounced utility

* invite create works

* exclude users correctly

* more adjustments

* minor cleanup

* using workspace invite server role

* test fix

* fixed multiple root eslint issues

* minor adjustments
This commit is contained in:
Kristaps Fabians Geikins
2024-08-12 11:30:01 +03:00
committed by GitHub
parent 03db1cca94
commit 4dae1569cd
69 changed files with 1903 additions and 1327 deletions
@@ -41,13 +41,15 @@ export const onProjectCreatedFactory =
const workspaceMembers = await getWorkspaceRoles({ workspaceId })
await Promise.all(
workspaceMembers.map(({ userId, role: workspaceRole }) =>
grantStreamPermissions({
workspaceMembers.map(({ userId, role: workspaceRole }) => {
if (workspaceRole === Roles.Workspace.Guest) return
return grantStreamPermissions({
streamId: projectId,
userId,
role: mapWorkspaceRoleToProjectRole(workspaceRole)
})
)
})
)
}
@@ -435,7 +435,7 @@ export = FF_WORKSPACES_MODULE_ENABLED
return collaborators
},
invitedTeam: async (parent) => {
invitedTeam: async (parent, args) => {
const getPendingTeam = getPendingWorkspaceCollaboratorsFactory({
queryAllResourceInvites: queryAllResourceInvitesFactory({
db,
@@ -444,7 +444,7 @@ export = FF_WORKSPACES_MODULE_ENABLED
getInvitationTargetUsers: getInvitationTargetUsersFactory({ getUsers })
})
return await getPendingTeam({ workspaceId: parent.id })
return await getPendingTeam({ workspaceId: parent.id, filter: args.filter })
},
projects: async (parent, args) => {
const getWorkspaceProjects = getWorkspaceProjectsFactory({ getStreams })
@@ -1,13 +1,16 @@
import { TokenResourceIdentifier } from '@/modules/core/domain/tokens/types'
import {
PendingWorkspaceCollaboratorsFilter,
TokenResourceIdentifierType,
WorkspaceInviteCreateInput
} from '@/modules/core/graph/generated/graphql'
import { mapServerRoleToValue } from '@/modules/core/helpers/graphTypes'
import { getWorkspaceRoute } from '@/modules/core/helpers/routeHelper'
import { isResourceAllowed } from '@/modules/core/helpers/token'
import { LimitedUserRecord } from '@/modules/core/helpers/types'
import { removePrivateFields } from '@/modules/core/helpers/userHelper'
import { getUser } from '@/modules/core/repositories/users'
import { ServerInviteResourceType } from '@/modules/serverinvites/domain/constants'
import {
FindInvite,
QueryAllResourceInvites,
@@ -82,7 +85,12 @@ export const createWorkspaceInviteFactory =
role:
(input.role ? mapGqlWorkspaceRoleToMainRole(input.role) : null) ||
Roles.Workspace.Member,
primary: true
primary: true,
secondaryResourceRoles: {
...(input.serverRole
? { [ServerInviteResourceType]: mapServerRoleToValue(input.serverRole) }
: {})
}
}
return await deps.createAndSendInvite(
@@ -241,7 +249,8 @@ function buildPendingWorkspaceCollaboratorModel(
title: resolveInviteTargetTitle(invite, targetUser),
role: invite.resource.role || Roles.Workspace.Member,
invitedById: invite.inviterId,
user: targetUser
user: targetUser,
updatedAt: invite.updatedAt
}
}
@@ -306,8 +315,9 @@ export const getPendingWorkspaceCollaboratorsFactory =
}) =>
async (params: {
workspaceId: string
filter?: MaybeNullOrUndefined<PendingWorkspaceCollaboratorsFilter>
}): Promise<PendingWorkspaceCollaboratorGraphQLReturn[]> => {
const { workspaceId } = params
const { workspaceId, filter } = params
// Get all pending invites
const invites = await deps.queryAllResourceInvites<
@@ -315,7 +325,8 @@ export const getPendingWorkspaceCollaboratorsFactory =
WorkspaceRoles
>({
resourceId: workspaceId,
resourceType: WorkspaceInviteResourceType
resourceType: WorkspaceInviteResourceType,
search: filter?.search || undefined
})
// Get all target users, if any
@@ -7,7 +7,7 @@ import { expect } from 'chai'
describe('Event handlers', () => {
describe('onProjectCreatedFactory creates a function, that', () => {
it('grants project roles for all workspace members', async () => {
it('grants project roles for all workspace members, except guests', async () => {
const workspaceId = cryptoRandomString({ length: 10 })
const projectId = cryptoRandomString({ length: 10 })
@@ -48,7 +48,7 @@ describe('Event handlers', () => {
project: { workspaceId, id: projectId } as StreamRecord
})
expect(projectRoles.length).to.equal(3)
expect(projectRoles.length).to.equal(2)
})
})
})