feat(server): put current user in first on the list

This commit is contained in:
eyhn 2025-07-25 17:29:17 +08:00
parent c4cf5799d4
commit 5638c2d8e5
3 changed files with 66 additions and 5 deletions

View File

@ -226,9 +226,23 @@ e2e('should support pagination for member', async t => {
take: 2,
},
});
t.is(result.workspace.members[0].id, owner.id);
t.is(result.workspace.memberCount, 3);
t.is(result.workspace.members.length, 2);
await app.login(u1);
result = await app.gql({
query: getMembersByWorkspaceIdQuery,
variables: {
workspaceId: workspace.id,
skip: 0,
take: 5,
},
});
t.is(result.workspace.members[0].id, u1.id);
t.is(result.workspace.memberCount, 3);
t.is(result.workspace.members.length, 3);
result = await app.gql({
query: getMembersByWorkspaceIdQuery,
variables: {

View File

@ -117,10 +117,14 @@ export class WorkspaceMemberResolver {
status,
}));
} else {
const [list] = await this.models.workspaceUser.paginate(workspace.id, {
offset: skip ?? 0,
first: take ?? 8,
});
const [list] = await this.models.workspaceUser.paginate(
workspace.id,
{
offset: skip ?? 0,
first: take ?? 8,
},
user.id
);
return list.map(({ id, status, type, user }) => ({
...user,

View File

@ -302,7 +302,50 @@ export class WorkspaceUserModel extends BaseModel {
});
}
async paginate(workspaceId: string, pagination: PaginationInput) {
async paginate(
workspaceId: string,
pagination: PaginationInput,
priorityUserId?: string
) {
// If priorityUserId is provided and we're on the first page, handle priority user separately
if (priorityUserId && pagination.offset === 0 && !pagination.after) {
const priorityUser = await this.db.workspaceUserRole.findFirst({
include: {
user: {
select: workspaceUserSelect,
},
},
where: {
workspaceId,
userId: priorityUserId,
},
});
const remainingLimit = pagination.first - (priorityUser ? 1 : 0);
const otherUsers = await this.db.workspaceUserRole.findMany({
include: {
user: {
select: workspaceUserSelect,
},
},
where: {
workspaceId,
userId: priorityUser ? { not: priorityUserId } : undefined,
},
orderBy: {
createdAt: 'asc',
},
take: remainingLimit,
skip: 0,
});
const users = priorityUser ? [priorityUser, ...otherUsers] : otherUsers;
const total = await this.count(workspaceId);
return [users, total] as const;
}
return await Promise.all([
this.db.workspaceUserRole.findMany({
include: {