feat(server): get public user by id (#10434)

close CLOUD-160
This commit is contained in:
fengmk2
2025-03-06 15:25:06 +00:00
parent 7302c4f954
commit 289d3cd20e
13 changed files with 184 additions and 26 deletions

View File

@@ -13,4 +13,4 @@ import { UserManagementResolver, UserResolver } from './resolver';
})
export class UserModule {}
export { PublicUserType, UserType } from './types';
export { PublicUserType, UserType, WorkspaceUserType } from './types';

View File

@@ -27,6 +27,7 @@ import { validators } from '../utils/validators';
import {
DeleteAccount,
ManageUserInput,
PublicUserType,
RemoveAvatar,
UpdateUserInput,
UserOrLimitedUser,
@@ -70,6 +71,19 @@ export class UserResolver {
};
}
@Throttle('strict')
@Query(() => PublicUserType, {
name: 'publicUserById',
description: 'Get public user by id',
nullable: true,
})
@Public()
async getPublicUserById(
@Args('id', { type: () => String }) id: string
): Promise<PublicUserType | null> {
return await this.models.user.getPublicUser(id);
}
@Mutation(() => UserType, {
name: 'uploadAvatar',
description: 'Upload user avatar',

View File

@@ -7,7 +7,7 @@ import {
} from '@nestjs/graphql';
import type { User } from '@prisma/client';
import { PublicUser } from '../../models';
import { PublicUser, WorkspaceUser } from '../../models';
import { type CurrentUser } from '../auth/session';
@ObjectType()
@@ -51,6 +51,18 @@ export class PublicUserType implements PublicUser {
@Field()
name!: string;
@Field(() => String, { nullable: true })
avatarUrl!: string | null;
}
@ObjectType()
export class WorkspaceUserType implements WorkspaceUser {
@Field()
id!: string;
@Field()
name!: string;
@Field()
email!: string;

View File

@@ -32,7 +32,7 @@ export class WorkspaceEvents {
userId,
workspaceId,
}: Events['workspace.members.requestDeclined']) {
const user = await this.models.user.getPublicUser(userId);
const user = await this.models.user.getWorkspaceUser(userId);
// send decline mail
await this.workspaceService.sendReviewDeclinedEmail(
user?.email,
@@ -60,8 +60,8 @@ export class WorkspaceEvents {
to,
}: Events['workspace.owner.changed']) {
// send ownership transferred mail
const fromUser = await this.models.user.getPublicUser(from);
const toUser = await this.models.user.getPublicUser(to);
const fromUser = await this.models.user.getWorkspaceUser(from);
const toUser = await this.models.user.getWorkspaceUser(to);
if (fromUser) {
await this.workspaceService.sendOwnershipTransferredEmail(

View File

@@ -35,7 +35,7 @@ import {
DocAction,
DocRole,
} from '../../permission';
import { PublicUserType } from '../../user';
import { WorkspaceUserType } from '../../user';
import { WorkspaceType } from '../types';
import {
DotToUnderline,
@@ -124,8 +124,8 @@ class GrantedDocUserType {
@Field(() => DocRole, { name: 'role' })
type!: DocRole;
@Field(() => PublicUserType)
user!: PublicUserType;
@Field(() => WorkspaceUserType)
user!: WorkspaceUserType;
}
@ObjectType()
@@ -391,16 +391,16 @@ export class DocResolver {
pagination
);
const publicUsers = await this.models.user.getPublicUsers(
const workspaceUsers = await this.models.user.getWorkspaceUsers(
permissions.map(p => p.userId)
);
const publicUsersMap = new Map(publicUsers.map(pu => [pu.id, pu]));
const workspaceUsersMap = new Map(workspaceUsers.map(wu => [wu.id, wu]));
return paginate(
permissions.map(p => ({
...p,
user: publicUsersMap.get(p.userId) as PublicUserType,
user: workspaceUsersMap.get(p.userId) as WorkspaceUserType,
})),
'createdAt',
pagination,

View File

@@ -86,7 +86,7 @@ export class WorkspaceService {
return;
}
const workspace = await this.getWorkspaceInfo(workspaceId);
const invitee = await this.models.user.getPublicUser(inviteeUserId);
const invitee = await this.models.user.getWorkspaceUser(inviteeUserId);
if (!invitee) {
this.logger.error(
`Invitee user not found in workspace: ${workspaceId}, userId: ${inviteeUserId}`
@@ -105,10 +105,10 @@ export class WorkspaceService {
await this.getInviteInfo(inviteId);
const workspace = await this.getWorkspaceInfo(workspaceId);
const invitee = inviteeUserId
? await this.models.user.getPublicUser(inviteeUserId)
? await this.models.user.getWorkspaceUser(inviteeUserId)
: null;
const inviter = inviterUserId
? await this.models.user.getPublicUser(inviterUserId)
? await this.models.user.getWorkspaceUser(inviterUserId)
: await this.models.workspaceUser.getOwner(workspaceId);
if (!inviter || !invitee) {
@@ -173,7 +173,7 @@ export class WorkspaceService {
return;
}
const invitee = await this.models.user.getPublicUser(inviteeUserId);
const invitee = await this.models.user.getWorkspaceUser(inviteeUserId);
if (!invitee) {
this.logger.error(
`Invitee user not found for inviteId: ${inviteId}, userId: ${inviteeUserId}`
@@ -220,7 +220,7 @@ export class WorkspaceService {
userId: string,
ws: { id: string; role: WorkspaceRole }
) {
const user = await this.models.user.getPublicUser(userId);
const user = await this.models.user.getWorkspaceUser(userId);
if (!user) throw new UserNotFound();
const workspace = await this.getWorkspaceInfo(ws.id);

View File

@@ -533,7 +533,7 @@ export class WorkspaceResolver {
const inviteeId = inviteeUserId || user?.id;
if (!inviteeId) throw new UserNotFound();
const invitee = await this.models.user.getPublicUser(inviteeId);
const invitee = await this.models.user.getWorkspaceUser(inviteeId);
return { workspace, user: owner, invitee };
}