mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-27 08:25:07 +00:00

* feat(member-group): Team (#2616) * feat: member-group schema define * feat(fe): create group * feat: add group edit modal * feat(fe): add avatar group component * feat: edit group fix: permission select menu style * feat: bio-mode support for select-member component * fix: avatar group key unique * feat: group manage * feat: divide member into group and clbs * feat: finish team permission * chore: adjust * fix: get clbs * perf: groups code * pref: member group for team (#2706) * chore: fe adjust fix: remove the member from groups when removing from team feat: change the groups avatar when updating the team's avatar * chore: DefaultGroupName as a constant string '' * fix: create default group when create team for root * feat: comment * feat: 4811 init * pref: member group for team (#2732) * chore: default group name * feat: get default group when get by tmbid * feat(fe): adjust * member ui * fix: delete group (#2736) * perf: init4811 * pref: member group (#2818) * fix: update clb per then refetch clb list * fix: calculate group permission * feat(fe): group tag * refactor(fe): team and group manage * feat: manage group member * feat: add group transfer owner modal * feat: group manage member * chore: adjust the file structure * pref: member group * chore: adjust fe style * fix: ts error * chore: fe adjust * chore: fe adjust * chore: adjust * chore: adjust the code * perf: i18n and schema name * pref: member-group (#2862) * feat: group list ordered by updateTime * fix: transfer ownership of group when deleting member * fix: i18n fix * feat: can not set member as admin/owner when user is not active * fix: GroupInfoModal hover input do not change color * fix(fe): searchinput do not scroll * perf: team group ui * doc * remove enum --------- Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com>
177 lines
4.5 KiB
TypeScript
177 lines
4.5 KiB
TypeScript
import { TeamTmbItemType, TeamMemberWithTeamSchema } from '@fastgpt/global/support/user/team/type';
|
|
import { ClientSession, Types } from '../../../common/mongo';
|
|
import {
|
|
TeamMemberRoleEnum,
|
|
TeamMemberStatusEnum,
|
|
notLeaveStatus
|
|
} from '@fastgpt/global/support/user/team/constant';
|
|
import { MongoTeamMember } from './teamMemberSchema';
|
|
import { MongoTeam } from './teamSchema';
|
|
import { UpdateTeamProps } from '@fastgpt/global/support/user/team/controller';
|
|
import { getResourcePermission } from '../../permission/controller';
|
|
import { PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant';
|
|
import { TeamPermission } from '@fastgpt/global/support/permission/user/controller';
|
|
import { TeamDefaultPermissionVal } from '@fastgpt/global/support/permission/user/constant';
|
|
import { MongoMemberGroupModel } from '../../permission/memberGroup/memberGroupSchema';
|
|
import { mongoSessionRun } from '../../../common/mongo/sessionRun';
|
|
import { DefaultGroupName } from '@fastgpt/global/support/user/team/group/constant';
|
|
|
|
async function getTeamMember(match: Record<string, any>): Promise<TeamTmbItemType> {
|
|
const tmb = (await MongoTeamMember.findOne(match).populate('teamId')) as TeamMemberWithTeamSchema;
|
|
if (!tmb) {
|
|
return Promise.reject('member not exist');
|
|
}
|
|
|
|
const Per = await getResourcePermission({
|
|
resourceType: PerResourceTypeEnum.team,
|
|
teamId: tmb.teamId._id,
|
|
tmbId: tmb._id
|
|
});
|
|
|
|
return {
|
|
userId: String(tmb.userId),
|
|
teamId: String(tmb.teamId._id),
|
|
teamName: tmb.teamId.name,
|
|
memberName: tmb.name,
|
|
avatar: tmb.teamId.avatar,
|
|
balance: tmb.teamId.balance,
|
|
tmbId: String(tmb._id),
|
|
teamDomain: tmb.teamId?.teamDomain,
|
|
role: tmb.role,
|
|
status: tmb.status,
|
|
defaultTeam: tmb.defaultTeam,
|
|
lafAccount: tmb.teamId.lafAccount,
|
|
permission: new TeamPermission({
|
|
per: Per ?? TeamDefaultPermissionVal,
|
|
isOwner: tmb.role === TeamMemberRoleEnum.owner
|
|
}),
|
|
notificationAccount: tmb.teamId.notificationAccount
|
|
};
|
|
}
|
|
|
|
export async function getTmbInfoByTmbId({ tmbId }: { tmbId: string }) {
|
|
if (!tmbId) {
|
|
return Promise.reject('tmbId or userId is required');
|
|
}
|
|
return getTeamMember({
|
|
_id: new Types.ObjectId(String(tmbId)),
|
|
status: notLeaveStatus
|
|
});
|
|
}
|
|
|
|
export async function getUserDefaultTeam({ userId }: { userId: string }) {
|
|
if (!userId) {
|
|
return Promise.reject('tmbId or userId is required');
|
|
}
|
|
return getTeamMember({
|
|
userId: new Types.ObjectId(userId),
|
|
defaultTeam: true
|
|
});
|
|
}
|
|
|
|
export async function createDefaultTeam({
|
|
userId,
|
|
teamName = 'My Team',
|
|
avatar = '/icon/logo.svg',
|
|
balance,
|
|
session
|
|
}: {
|
|
userId: string;
|
|
teamName?: string;
|
|
avatar?: string;
|
|
balance?: number;
|
|
session: ClientSession;
|
|
}) {
|
|
// auth default team
|
|
const tmb = await MongoTeamMember.findOne({
|
|
userId: new Types.ObjectId(userId),
|
|
defaultTeam: true
|
|
});
|
|
|
|
if (!tmb) {
|
|
// create team
|
|
const [{ _id: insertedId }] = await MongoTeam.create(
|
|
[
|
|
{
|
|
ownerId: userId,
|
|
name: teamName,
|
|
avatar,
|
|
balance,
|
|
createTime: new Date()
|
|
}
|
|
],
|
|
{ session }
|
|
);
|
|
// create team member
|
|
const [tmb] = await MongoTeamMember.create(
|
|
[
|
|
{
|
|
teamId: insertedId,
|
|
userId,
|
|
name: 'Owner',
|
|
role: TeamMemberRoleEnum.owner,
|
|
status: TeamMemberStatusEnum.active,
|
|
createTime: new Date(),
|
|
defaultTeam: true
|
|
}
|
|
],
|
|
{ session }
|
|
);
|
|
// create default group
|
|
await MongoMemberGroupModel.create(
|
|
[
|
|
{
|
|
teamId: tmb.teamId,
|
|
name: DefaultGroupName,
|
|
avatar
|
|
}
|
|
],
|
|
{ session }
|
|
);
|
|
console.log('create default team and group', userId);
|
|
return tmb;
|
|
} else {
|
|
console.log('default team exist', userId);
|
|
await MongoTeam.findByIdAndUpdate(tmb.teamId, {
|
|
$set: {
|
|
...(balance !== undefined && { balance })
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
export async function updateTeam({
|
|
teamId,
|
|
name,
|
|
avatar,
|
|
teamDomain,
|
|
lafAccount
|
|
}: UpdateTeamProps & { teamId: string }) {
|
|
return mongoSessionRun(async (session) => {
|
|
await MongoTeam.findByIdAndUpdate(
|
|
teamId,
|
|
{
|
|
name,
|
|
avatar,
|
|
teamDomain,
|
|
lafAccount
|
|
},
|
|
{ session }
|
|
);
|
|
|
|
// update default group
|
|
if (avatar) {
|
|
await MongoMemberGroupModel.updateOne(
|
|
{
|
|
teamId: teamId,
|
|
name: DefaultGroupName
|
|
},
|
|
{
|
|
avatar
|
|
},
|
|
{ session }
|
|
);
|
|
}
|
|
});
|
|
}
|