feat(server): add invitation status to getInviteInfo response (#11158)

close CLOUD-182
This commit is contained in:
fengmk2
2025-03-25 06:51:26 +00:00
parent 9bad6fa12d
commit 4d15c32242
10 changed files with 144 additions and 15 deletions
@@ -20,6 +20,7 @@ import { WorkspaceRole } from '../../permission';
import { WorkspaceBlobStorage } from '../../storage';
export type InviteInfo = {
isLink: boolean;
workspaceId: string;
inviterUserId?: string;
inviteeUserId?: string;
@@ -45,7 +46,10 @@ export class WorkspaceService {
`workspace:inviteLinkId:${inviteId}`
);
if (typeof invite?.workspaceId === 'string') {
return invite;
return {
...invite,
isLink: true,
};
}
const workspaceUser = await this.models.workspaceUser.getById(inviteId);
@@ -55,6 +59,7 @@ export class WorkspaceService {
}
return {
isLink: false,
workspaceId: workspaceUser.workspaceId,
inviteeUserId: workspaceUser.userId,
};
@@ -514,8 +514,8 @@ export class WorkspaceResolver {
async getInviteInfo(
@CurrentUser() user: UserType | undefined,
@Args('inviteId') inviteId: string
) {
const { workspaceId, inviteeUserId } =
): Promise<InvitationType> {
const { workspaceId, inviteeUserId, isLink } =
await this.workspaceService.getInviteInfo(inviteId);
const workspace = await this.workspaceService.getWorkspaceInfo(workspaceId);
const owner = await this.models.workspaceUser.getOwner(workspaceId);
@@ -523,8 +523,21 @@ export class WorkspaceResolver {
const inviteeId = inviteeUserId || user?.id;
if (!inviteeId) throw new UserNotFound();
const invitee = await this.models.user.getWorkspaceUser(inviteeId);
if (!invitee) throw new UserNotFound();
return { workspace, user: owner, invitee };
let status: WorkspaceMemberStatus | undefined;
if (isLink) {
const invitation = await this.models.workspaceUser.get(
workspaceId,
inviteeId
);
status = invitation?.status;
} else {
const invitation = await this.models.workspaceUser.getById(inviteId);
status = invitation?.status;
}
return { workspace, user: owner, invitee, status };
}
@Mutation(() => Boolean)
@@ -12,7 +12,7 @@ import { WorkspaceMemberStatus } from '@prisma/client';
import { SafeIntResolver } from 'graphql-scalars';
import { DocRole, WorkspaceRole } from '../permission';
import { UserType } from '../user/types';
import { UserType, WorkspaceUserType } from '../user/types';
registerEnumType(WorkspaceRole, {
name: 'WorkspaceRole',
@@ -120,9 +120,14 @@ export class InvitationType {
@Field({ description: 'Workspace information' })
workspace!: InvitationWorkspaceType;
@Field({ description: 'User information' })
user!: UserType;
user!: WorkspaceUserType;
@Field({ description: 'Invitee information' })
invitee!: UserType;
invitee!: WorkspaceUserType;
@Field(() => WorkspaceMemberStatus, {
description: 'Invitation status in workspace',
nullable: true,
})
status?: WorkspaceMemberStatus;
}
@InputType()