diff --git a/packages/service/support/user/utils.ts b/packages/service/support/user/utils.ts index fc1fef631..3d60de01f 100644 --- a/packages/service/support/user/utils.ts +++ b/packages/service/support/user/utils.ts @@ -1,4 +1,7 @@ +import { SourceMemberType } from '@fastgpt/global/support/user/type'; import { MongoTeam } from './team/teamSchema'; +import { MongoTeamMember } from './team/teamMemberSchema'; +import { ClientSession } from '../../common/mongo'; /* export dataset limit */ export const updateExportDatasetLimit = async (teamId: string) => { @@ -67,3 +70,43 @@ export const checkWebSyncLimit = async ({ return Promise.reject(`每个团队,每 ${limitMinutes} 分钟仅使用一次同步功能。`); } }; + +/** + * This function will add a property named sourceMember to the list passed in. + * @param list The list to add the sourceMember property to. [TmbId] property is required. + * @error If member is not found, this item will be skipped. + * @returns The list with the sourceMember property added. + */ +export async function addSourceMember({ + list, + teamId, + session +}: { + list: T[]; + teamId?: string; + session?: ClientSession; +}): Promise> { + if (!list.length) return []; + + const tmbList = await MongoTeamMember.find( + { + _id: { $in: list.map((item) => String(item.tmbId)) }, + ...(teamId && { teamId }) + }, + 'tmbId name avatar status', + { + session + } + ).lean(); + + return list + .map((item) => { + const tmb = tmbList.find((tmb) => String(tmb._id) === String(item.tmbId)); + if (!tmb) return; + return { + ...item, + ...(tmb && { sourceMember: { name: tmb.name, avatar: tmb.avatar, status: tmb.status } }) + }; + }) + .filter(Boolean) as Array; +} diff --git a/projects/app/src/pages/account/team/components/GroupManage/GroupManageMember.tsx b/projects/app/src/pages/account/team/components/GroupManage/GroupManageMember.tsx index 74e4be634..9325fb76f 100644 --- a/projects/app/src/pages/account/team/components/GroupManage/GroupManageMember.tsx +++ b/projects/app/src/pages/account/team/components/GroupManage/GroupManageMember.tsx @@ -44,7 +44,8 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro members: allMembers, refetchGroups, groups, - refetchMembers + refetchMembers, + MemberScrollData } = useContextSelector(TeamContext, (v) => v); const group = useMemo(() => { @@ -156,31 +157,33 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro }} /> - {filtered.map((member) => { - return ( - handleToggleSelect(member.tmbId)} - > - } - /> - - {member.memberName} - - ); - })} + + {filtered.map((member) => { + return ( + handleToggleSelect(member.tmbId)} + > + } + /> + + {member.memberName} + + ); + })} + diff --git a/projects/app/src/pages/account/team/components/OrgManage/OrgMemberManageModal.tsx b/projects/app/src/pages/account/team/components/OrgManage/OrgMemberManageModal.tsx index 3e2f2afe0..3a0d074a8 100644 --- a/projects/app/src/pages/account/team/components/OrgManage/OrgMemberManageModal.tsx +++ b/projects/app/src/pages/account/team/components/OrgManage/OrgMemberManageModal.tsx @@ -22,7 +22,6 @@ import { useMemo, useState } from 'react'; import { useContextSelector } from 'use-context-selector'; import { TeamContext } from '../context'; import { OrgType } from '@fastgpt/global/support/user/team/org/type'; -import dynamic from 'next/dynamic'; export type GroupFormType = { members: { @@ -51,7 +50,7 @@ function OrgMemberManageModal({ onClose: () => void; }) { const { t } = useTranslation(); - const allMembers = useContextSelector(TeamContext, (v) => v.members); + const { members: allMembers, MemberScrollData } = useContextSelector(TeamContext, (v) => v); const [selectedMembers, setSelectedMembers] = useState( currentOrg.members.map((item) => item.tmbId) @@ -124,32 +123,34 @@ function OrgMemberManageModal({ }} /> - {filterMembers.map((member) => { - return ( - handleToggleSelect(member.tmbId)} - > - } - pointerEvents="none" - /> - - {member.memberName} - - ); - })} + + {filterMembers.map((member) => { + return ( + handleToggleSelect(member.tmbId)} + > + } + pointerEvents="none" + /> + + {member.memberName} + + ); + })} + diff --git a/projects/app/src/pages/api/core/app/getChatLogs.ts b/projects/app/src/pages/api/core/app/getChatLogs.ts index 57b9cdc56..164cf1429 100644 --- a/projects/app/src/pages/api/core/app/getChatLogs.ts +++ b/projects/app/src/pages/api/core/app/getChatLogs.ts @@ -10,8 +10,8 @@ import { NextAPI } from '@/service/middleware/entry'; import { WritePermissionVal } from '@fastgpt/global/support/permission/constant'; import { readFromSecondary } from '@fastgpt/service/common/mongo/utils'; import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; -import { TeamMemberCollectionName } from '@fastgpt/global/support/user/team/constant'; import { PaginationResponse } from '@fastgpt/web/common/fetch/type'; +import { addSourceMember } from '@fastgpt/service/support/user/utils'; async function handler( req: NextApiRequest, @@ -82,14 +82,6 @@ async function handler( as: 'chatitems' } }, - { - $lookup: { - from: TeamMemberCollectionName, - localField: 'tmbId', - foreignField: '_id', - as: 'member' - } - }, { $addFields: { userGoodFeedbackCount: { @@ -143,12 +135,7 @@ async function handler( customFeedbacksCount: 1, markCount: 1, outLinkUid: 1, - tmbId: 1, - sourceMember: { - name: '$member.name', - avatar: '$member.avatar', - status: '$member.status' - } + tmbId: 1 } } ], @@ -159,8 +146,15 @@ async function handler( MongoChat.countDocuments(where, { ...readFromSecondary }) ]); + const listWithSourceMember = await addSourceMember({ + list: list, + teamId + }); + + const listWithoutTmbId = list.filter((item) => !item.tmbId); + return { - list, + list: listWithSourceMember.concat(listWithoutTmbId), total }; } diff --git a/projects/app/src/pages/api/core/app/list.ts b/projects/app/src/pages/api/core/app/list.ts index f6e1b1679..d47f857aa 100644 --- a/projects/app/src/pages/api/core/app/list.ts +++ b/projects/app/src/pages/api/core/app/list.ts @@ -18,7 +18,7 @@ import { replaceRegChars } from '@fastgpt/global/common/string/tools'; import { concatPer } from '@fastgpt/service/support/permission/controller'; import { getGroupsByTmbId } from '@fastgpt/service/support/permission/memberGroup/controllers'; import { getOrgIdSetWithParentByTmbId } from '@fastgpt/service/support/permission/org/controllers'; -import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema'; +import { addSourceMember } from '@fastgpt/service/support/user/utils'; export type ListAppBody = { parentId?: ParentIdType; @@ -202,32 +202,9 @@ async function handler(req: ApiRequestProps): Promise app.permission.hasReadPer); - // get member info - const memberInfo = await MongoTeamMember.find( - { _id: { $in: formatApps.map((app) => app.tmbId) } }, - '_id name avatar status' - ).lean(); - - return formatApps.map((app) => { - const member = memberInfo.find((item) => String(item._id) === String(app.tmbId))!; - return { - _id: app._id, - tmbId: app.tmbId, - avatar: app.avatar, - type: app.type, - name: app.name, - intro: app.intro, - updateTime: app.updateTime, - permission: app.permission, - pluginData: app.pluginData, - inheritPermission: app.inheritPermission ?? true, - private: app.privateApp, - sourceMember: { - name: member.name, - avatar: member.avatar, - status: member.status - } - }; + return addSourceMember({ + list: formatApps, + teamId }); } diff --git a/projects/app/src/pages/api/core/app/version/list.ts b/projects/app/src/pages/api/core/app/version/list.ts index 35f299f22..5d3c58697 100644 --- a/projects/app/src/pages/api/core/app/version/list.ts +++ b/projects/app/src/pages/api/core/app/version/list.ts @@ -7,7 +7,7 @@ import { authApp } from '@fastgpt/service/support/permission/app/auth'; import { WritePermissionVal } from '@fastgpt/global/support/permission/constant'; import { VersionListItemType } from '@fastgpt/global/core/app/version'; import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; -import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema'; +import { addSourceMember } from '@fastgpt/service/support/user/utils'; export type versionListBody = PaginationProps<{ appId: string; @@ -36,43 +36,21 @@ async function handler( .limit(pageSize) .lean(); - const memberList = await MongoTeamMember.find( - { - _id: { $in: versions.map((item) => item.tmbId) } - }, - '_id name avatar status' - ).lean(); - - return versions.map((item) => { - const member = memberList.find((member) => String(member._id) === String(item.tmbId)); - return { - ...item, - sourceMember: { - name: member?.name || '', - avatar: member?.avatar || '', - status: member?.status || '' - } - }; - }); + return ( + await addSourceMember({ + list: versions + }) + ).map((item) => ({ + ...item, + isPublish: !!item.isPublish + })); })(), MongoAppVersion.countDocuments({ appId }) ]); - const versionList = result.map((item) => { - return { - _id: item._id, - appId: item.appId, - versionName: item.versionName, - time: item.time, - isPublish: item.isPublish, - tmbId: item.tmbId, - sourceMember: item.sourceMember - }; - }); - return { total, - list: versionList + list: result }; } diff --git a/projects/app/src/pages/api/core/dataset/list.ts b/projects/app/src/pages/api/core/dataset/list.ts index f554bebda..a4075c7e4 100644 --- a/projects/app/src/pages/api/core/dataset/list.ts +++ b/projects/app/src/pages/api/core/dataset/list.ts @@ -1,4 +1,3 @@ -import type { DatasetListItemType } from '@fastgpt/global/core/dataset/type.d'; import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; import { MongoDataset } from '@fastgpt/service/core/dataset/schema'; import { authUserPer } from '@fastgpt/service/support/permission/user/auth'; @@ -18,8 +17,7 @@ import { replaceRegChars } from '@fastgpt/global/common/string/tools'; import { getGroupsByTmbId } from '@fastgpt/service/support/permission/memberGroup/controllers'; import { concatPer } from '@fastgpt/service/support/permission/controller'; import { getOrgIdSetWithParentByTmbId } from '@fastgpt/service/support/permission/org/controllers'; -import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema'; -import { getVectorModel } from '@fastgpt/service/core/ai/model'; +import { addSourceMember } from '@fastgpt/service/support/user/utils'; export type GetDatasetListBody = { parentId: ParentIdType; @@ -175,30 +173,9 @@ async function handler(req: ApiRequestProps) { }) .filter((app) => app.permission.hasReadPer); - const tmbIds = formatDatasets.map((item) => String(item.tmbId)); - const memberInfo = await MongoTeamMember.find({ _id: { $in: tmbIds } }, '_id name avatar').lean(); - - return formatDatasets.map((item) => { - const member = - memberInfo.find((member) => String(member._id) === String(item.tmbId)) ?? memberInfo[0]; - - return { - _id: item._id, - avatar: item.avatar, - name: item.name, - intro: item.intro, - type: item.type, - permission: item.permission, - vectorModel: getVectorModel(item.vectorModel), - inheritPermission: item.inheritPermission, - tmbId: item.tmbId, - updateTime: item.updateTime, - private: item.privateDataset, - sourceMember: { - name: member!.name, - avatar: member!.avatar - } - }; + return addSourceMember({ + list: formatDatasets, + teamId }); }