perf: org permission (#3556)

This commit is contained in:
Archer
2025-01-10 10:48:54 +08:00
committed by GitHub
parent 93cf5bb372
commit ed619edd47
23 changed files with 84 additions and 73 deletions

View File

@@ -2,6 +2,7 @@ import { i18nT } from '../../../../web/i18n/utils';
import type { ErrType } from '../errorCode';
/* team: 500000 */
export enum TeamErrEnum {
notUser = 'notUser',
teamOverSize = 'teamOverSize',
unAuthTeam = 'unAuthTeam',
teamMemberOverSize = 'teamMemberOverSize',
@@ -27,6 +28,10 @@ export enum TeamErrEnum {
}
const teamErr = [
{
statusText: TeamErrEnum.notUser,
message: i18nT('common:code_error.team_error.not_user')
},
{
statusText: TeamErrEnum.teamOverSize,
message: i18nT('common:code_error.team_error.over_size')

View File

@@ -1,7 +1,9 @@
export const HUMAN_ICON = `/icon/human.svg`;
export const LOGO_ICON = `/icon/logo.svg`;
export const HUGGING_FACE_ICON = `/imgs/model/huggingface.svg`;
export const DEFAULT_TEAM_AVATAR = `/imgs/avatar/defaultTeamAvatar.svg`;
export const DEFAULT_ORG_AVATAR = '/imgs/avatar/defaultOrgAvatar.svg';
export const DEFAULT_USER_AVATAR = '/imgs/avatar/BlueAvatar.svg';
export const isProduction = process.env.NODE_ENV === 'production';

View File

@@ -153,7 +153,7 @@ export const getClbsAndGroupsWithInfo = async ({
})
.populate<{ tmb: TeamMemberSchema & { user: UserModelSchema } }>({
path: 'tmb',
select: 'name userId',
select: 'name userId role',
populate: {
path: 'user',
select: 'avatar'

View File

@@ -4,7 +4,6 @@ import type { ClientSession } from 'mongoose';
import { MongoOrgModel } from './orgSchema';
import { MongoOrgMemberModel } from './orgMemberSchema';
import { getOrgChildrenPath } from '@fastgpt/global/support/user/team/org/constant';
import { getNanoid } from '@fastgpt/global/common/string/tools';
export const getOrgsByTmbId = async ({ teamId, tmbId }: { teamId: string; tmbId: string }) =>
MongoOrgMemberModel.find({ teamId, tmbId }, 'orgId').lean();
@@ -16,23 +15,29 @@ export const getOrgIdSetWithParentByTmbId = async ({
teamId: string;
tmbId: string;
}) => {
const orgMembers = await MongoOrgMemberModel.find({ teamId, tmbId }, 'orgId')
.populate<{ org: { path: string } }>('org', 'path')
.lean();
const orgMembers = await MongoOrgMemberModel.find({ teamId, tmbId }, 'orgId').lean();
const orgIds = new Set<string>();
const orgIds = Array.from(new Set(orgMembers.map((item) => String(item.orgId))));
const orgs = await MongoOrgModel.find({ _id: { $in: orgIds } }, 'path').lean();
for (const orgMember of orgMembers) {
orgIds.add(String(orgMember.orgId));
const pathIdList = new Set<string>(
orgs
.map((org) => {
const pathIdList = org.path.split('/').filter(Boolean);
return pathIdList;
})
.flat()
);
const parentOrgs = await MongoOrgModel.find(
{
teamId,
pathId: { $in: Array.from(pathIdList) }
},
'_id'
).lean();
const parentOrgIds = parentOrgs.map((item) => String(item._id));
// Add parent org
const parentIds = orgMember.org.path.split('/').filter(Boolean);
for (const parentId of parentIds) {
orgIds.add(parentId);
}
}
return orgIds;
return new Set([...orgIds, ...parentOrgIds]);
};
export const getChildrenByOrg = async ({

View File

@@ -349,6 +349,8 @@ export const iconPaths = {
history: () => import('./icons/history.svg'),
infoRounded: () => import('./icons/infoRounded.svg'),
kbTest: () => import('./icons/kbTest.svg'),
key: () => import('./icons/key.svg'),
keyPrimary: () => import('./icons/keyPrimary.svg'),
menu: () => import('./icons/menu.svg'),
minus: () => import('./icons/minus.svg'),
'modal/AddClb': () => import('./icons/modal/AddClb.svg'),
@@ -360,7 +362,6 @@ export const iconPaths = {
'modal/selectSource': () => import('./icons/modal/selectSource.svg'),
'modal/setting': () => import('./icons/modal/setting.svg'),
'modal/teamPlans': () => import('./icons/modal/teamPlans.svg'),
'modal/key': () => import('./icons/modal/key.svg'),
'model/BAAI': () => import('./icons/model/BAAI.svg'),
'model/alicloud': () => import('./icons/model/alicloud.svg'),
'model/baichuan': () => import('./icons/model/baichuan.svg'),
@@ -412,7 +413,6 @@ export const iconPaths = {
'support/bill/shoppingCart': () => import('./icons/support/bill/shoppingCart.svg'),
'support/bill/wallet': () => import('./icons/support/bill/wallet.svg'),
'support/outlink/apikeyFill': () => import('./icons/support/outlink/apikeyFill.svg'),
'support/outlink/apikeyLight': () => import('./icons/support/outlink/apikeyLight.svg'),
'support/outlink/iframeLight': () => import('./icons/support/outlink/iframeLight.svg'),
'support/outlink/share': () => import('./icons/support/outlink/share.svg'),
'support/outlink/shareLight': () => import('./icons/support/outlink/shareLight.svg'),
@@ -420,7 +420,6 @@ export const iconPaths = {
'support/permission/privateLight': () => import('./icons/support/permission/privateLight.svg'),
'support/permission/publicLight': () => import('./icons/support/permission/publicLight.svg'),
'support/team/group': () => import('./icons/support/team/group.svg'),
'support/team/key': () => import('./icons/support/team/key.svg'),
'support/team/memberLight': () => import('./icons/support/team/memberLight.svg'),
'support/usage/usageRecordLight': () => import('./icons/support/usage/usageRecordLight.svg'),
'support/user/informLight': () => import('./icons/support/user/informLight.svg'),

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M12.2109 12.3945C14.7199 12.3945 16.75 10.3639 16.75 7.8636C16.75 5.36333 14.7199 3.33268 12.2109 3.33268C9.70193 3.33268 7.67177 5.36333 7.67177 7.8636C7.67177 8.28211 7.72817 8.68482 7.83285 9.06581C8.02882 9.77912 7.86557 10.6064 7.27775 11.1959L3.33532 15.1497L3.33531 16.666H5.02967L5.07424 16.6215L5.52315 18.2969C5.43021 18.3205 5.33398 18.3327 5.23648 18.3327H2.66864C2.11635 18.3327 1.66864 17.885 1.66864 17.3327L1.66865 14.943C1.66865 14.6342 1.79111 14.3379 2.00918 14.1192L6.09755 10.0191C6.23063 9.88562 6.27567 9.6891 6.22574 9.50736C6.08191 8.98387 6.00511 8.43269 6.00511 7.8636C6.00511 4.44077 8.78354 1.66602 12.2109 1.66602C15.6383 1.66602 18.4167 4.44077 18.4167 7.8636C18.4167 11.2864 15.6383 14.0612 12.2109 14.0612C11.651 14.0612 11.1084 13.9871 10.5923 13.8483C10.4113 13.7996 10.216 13.8449 10.0833 13.9774L8.90842 15.1498L7.72991 13.9713L8.90598 12.7977C9.49218 12.2127 10.3143 12.0475 11.0254 12.2389C11.4015 12.34 11.7985 12.3945 12.2109 12.3945Z" />
<path
d="M6.13784 16.7874H6.85411C7.26832 16.7874 7.60417 16.4516 7.60417 16.0374L7.60411 16.0283V15.3211H8.43437C8.84858 15.3211 9.18437 14.9853 9.18437 14.5711C9.18437 14.1569 8.84858 13.8211 8.43437 13.8211H6.96804C6.94888 13.8211 6.92989 13.8218 6.9111 13.8232C6.89229 13.8218 6.87328 13.8211 6.85411 13.8211C6.4399 13.8211 6.10411 14.1569 6.10411 14.5711V15.2874H5.38784C4.97363 15.2874 4.63784 15.6232 4.63784 16.0374V17.569C4.63784 17.9832 4.97363 18.319 5.38784 18.319C5.80206 18.319 6.13784 17.9832 6.13784 17.569V16.7874Z" />
<path
d="M14.4642 7.1898C14.4642 8.11027 13.718 8.85647 12.7975 8.85647C11.877 8.85647 11.1308 8.11027 11.1308 7.1898C11.1308 6.26932 11.877 5.52313 12.7975 5.52313C13.718 5.52313 14.4642 6.26932 14.4642 7.1898Z" />
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -82,6 +82,7 @@
"code_error.team_error.group_name_duplicate": "Duplicate group name",
"code_error.team_error.group_name_empty": "Group name cannot be empty",
"code_error.team_error.group_not_exist": "Group does not exist",
"code_error.team_error.not_user": "The member cannot be found",
"code_error.team_error.org_member_duplicated": "Duplicate organization member",
"code_error.team_error.org_member_not_exist": "Organization member does not exist",
"code_error.team_error.org_not_exist": "Organization does not exist",

View File

@@ -105,7 +105,7 @@
"team.group.role.admin": "administrator",
"team.group.role.member": "member",
"team.group.role.owner": "owner",
"team.group.search_placeholder": "Search member/group/org name",
"search_group_org_user": "Search member/group/org name",
"team.group.set_as_admin": "Set as administrator",
"team.group.toast.can_not_delete_owner": "Owner cannot be deleted, please transfer first",
"team.group.transfer_owner": "transfer owner",

View File

@@ -86,6 +86,7 @@
"code_error.team_error.group_name_duplicate": "群组名称重复",
"code_error.team_error.group_name_empty": "群组名称不能为空",
"code_error.team_error.group_not_exist": "群组不存在",
"code_error.team_error.not_user": "找不到该成员",
"code_error.team_error.org_member_duplicated": "重复的部门成员",
"code_error.team_error.org_member_not_exist": "部门成员不存在",
"code_error.team_error.org_not_exist": "部门不存在",

View File

@@ -105,7 +105,7 @@
"team.group.role.admin": "管理员",
"team.group.role.member": "成员",
"team.group.role.owner": "所有者",
"team.group.search_placeholder": "搜索成员/部门/群组名称",
"search_group_org_user": "搜索成员/部门/群组名称",
"team.group.set_as_admin": "设为管理员",
"team.group.toast.can_not_delete_owner": "不能删除所有者, 请先转让",
"team.group.transfer_owner": "转让所有者",

View File

@@ -82,6 +82,7 @@
"code_error.team_error.group_name_duplicate": "群組名稱重複",
"code_error.team_error.group_name_empty": "群組名稱不能為空",
"code_error.team_error.group_not_exist": "群組不存在",
"code_error.team_error.not_user": "找不到該成員",
"code_error.team_error.org_member_duplicated": "重複的組織成員",
"code_error.team_error.org_member_not_exist": "組織成員不存在",
"code_error.team_error.org_not_exist": "組織不存在",

View File

@@ -105,7 +105,7 @@
"team.group.role.admin": "管理員",
"team.group.role.member": "成員",
"team.group.role.owner": "擁有者",
"team.group.search_placeholder": "搜尋成員/部門/群組名稱",
"search_group_org_user": "搜尋成員/部門/群組名稱",
"team.group.set_as_admin": "設為管理員",
"team.group.toast.can_not_delete_owner": "無法刪除擁有者,請先轉移擁有權",
"team.group.transfer_owner": "轉移擁有者",