Skip to content

Commit

Permalink
chore: adjust
Browse files Browse the repository at this point in the history
  • Loading branch information
FinleyGe committed Sep 12, 2024
1 parent 2bc426f commit 8ff6168
Show file tree
Hide file tree
Showing 16 changed files with 119 additions and 109 deletions.
16 changes: 7 additions & 9 deletions packages/global/support/permission/collaborator.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { RequireAtLeastOne, RequireOnlyOne } from 'common/type/utils';
import { RequireAtLeastOne, RequireOnlyOne } from '../../common/type/utils';
import { Permission } from './controller';
import { PermissionValueType } from './type';

Expand All @@ -10,14 +10,12 @@ export type CollaboratorItemType = {
avatar: string;
};

export type UpdateClbPermissionProps = RequireAtLeastOne<
{
members: string[];
groups: string[];
permission: PermissionValueType;
},
'members' | 'groups'
>;
export type UpdateClbPermissionProps = RequireAtLeastOne<{
members: string[];
groups: string[];
}> & {
permission: PermissionValueType;
};

export type DeleteClbPermissionProps = RequireOnlyOne<{
tmbId: string;
Expand Down
12 changes: 12 additions & 0 deletions packages/global/support/user/team/group/api.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export type postCreateGroupData = {
name: string;
avatar?: string;
memberIdList?: string[];
};

export type putUpdateGroupData = {
groupId: string;
name?: string;
avatar?: string;
memberIdList?: string[];
};
21 changes: 19 additions & 2 deletions packages/service/support/permission/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { NextApiResponse } from 'next';
import type { AuthModeType, ReqHeaderAuthType } from './type.d';
import {
AuthUserTypeEnum,
NullPermission,
PerResourceTypeEnum,
SubjectTypeEnum
} from '@fastgpt/global/support/permission/constant';
Expand All @@ -13,12 +14,15 @@ import { FileTokenQuery } from '@fastgpt/global/common/file/type';
import { MongoResourcePermission } from './schema';
import { ClientSession } from 'mongoose';
import { ParentIdType } from '@fastgpt/global/common/parentFolder/type';
import { ResourcePermissionType } from '@fastgpt/global/support/permission/type';
import {
PermissionValueType,
ResourcePermissionType
} from '@fastgpt/global/support/permission/type';
import { bucketNameMap } from '@fastgpt/global/common/file/constants';
import { addMinutes } from 'date-fns';
import { RequireOnlyOne } from '@fastgpt/global/common/type/utils';

export const getResourcePermission = async <T extends `${PerResourceTypeEnum}`>({
export const getResourcePermission = async <T extends PerResourceTypeEnum>({
resourceType,
teamId,
tmbId,
Expand Down Expand Up @@ -323,3 +327,16 @@ export const authFileToken = (token?: string) =>
});
});
});

export const getMaxGroupPer = (groups: PermissionValueType[]) => {
if (!groups.length) {
return undefined;
}
return groups.reduce((prev, cur) => {
if (cur) {
return Math.max(prev, cur);
} else {
return prev;
}
});
};
16 changes: 9 additions & 7 deletions packages/service/support/permission/memberGroup/controllers.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import { MemberGroupSchemaType } from '@fastgpt/global/support/permission/memberGroup/type';
import { MongoGroupMemberModel } from './groupMemberSchema';
import { TeamMemberSchema } from '@fastgpt/global/support/user/team/type';
import { getResourcePermission } from '../controller';
import { PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant';
import { MongoResourcePermission } from '../schema';
import { MongoMemberGroupModel } from './memberGroupSchema';
import { Permission } from '@fastgpt/global/support/permission/controller';

export const getGroupsByTmbId = async (tmbId: string) => {
return (
Expand Down Expand Up @@ -56,17 +54,20 @@ export const getGroupMembersWithInfoByGroupId = async (groupId: string) => {
/**
* Get tmb's group permission: the maximum permission of the group
* @param tmbId
* @param resourceId
* @param resourceType
* @returns
*/
export const getGroupPermission = async ({
export const getGroupPermission = async <T extends `${PerResourceTypeEnum}`>({
tmbId,
resourceId,
teamId,
resourceType
}: {
tmbId: string;
resourceId: string;
resourceType: `${PerResourceTypeEnum}`;
}) => {
teamId: string;
resourceType: T;
} & (T extends PerResourceTypeEnum.team ? { resourceId?: undefined } : { resourceId: string })) => {
const groupIds = (await getGroupsByTmbId(tmbId)).map((item) => item._id);
const groupPermissions = (
await MongoResourcePermission.find({
Expand All @@ -75,14 +76,15 @@ export const getGroupPermission = async ({
},
resourceType,
resourceId: resourceType === 'team' ? undefined : resourceId,
teamId: resourceType === 'team' ? resourceId : undefined
teamId
})
).map((item) => item.permission);
const maxPermission = groupPermissions.length > 0 ? Math.max(...groupPermissions) : undefined;

return maxPermission;
};

/** Get all groups of a team */
export const getGroupsByTeamId = async (teamId: string) => {
const groups = await MongoMemberGroupModel.find({
teamId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { MemberGroupCollectionName } from './memberGroupSchema';
import { GroupMemberSchemaType } from '@fastgpt/global/support/permission/memberGroup/type';
const { Schema } = connectionMongo;

export const GroupMemberCollectionName = 'group_member';
export const GroupMemberCollectionName = 'group_members';

export const GroupMemberSchema = new Schema({
groupId: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { connectionMongo, getMongoModel } from '../../../common/mongo';
import { MemberGroupSchemaType } from '@fastgpt/global/support/permission/memberGroup/type';
const { Schema } = connectionMongo;

export const MemberGroupCollectionName = 'member_group';
export const MemberGroupCollectionName = 'member_groups';

export const MemberGroupSchema = new Schema({
teamId: {
Expand Down
6 changes: 3 additions & 3 deletions packages/service/support/permission/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import {
} from '@fastgpt/global/support/user/team/constant';
import { connectionMongo, getMongoModel } from '../../common/mongo';
import type { ResourcePermissionType, SubjectType } from '@fastgpt/global/support/permission/type';
import { PerResourceTypeEnum, SubjectTypeEnum } from '@fastgpt/global/support/permission/constant';
import { MemberGroupSchema, MemberGroupCollectionName } from './memberGroup/memberGroupSchema';
import { PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant';
import { MemberGroupCollectionName } from './memberGroup/memberGroupSchema';
const { Schema } = connectionMongo;

export const ResourcePermissionCollectionName = 'resource_permission';
export const ResourcePermissionCollectionName = 'resource_permissions';

export const ResourcePermissionSchema = new Schema({
teamId: {
Expand Down
20 changes: 8 additions & 12 deletions packages/service/support/user/team/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ import {
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 { getMaxGroupPer, getResourcePermission } from '../../permission/controller';
import { NullPermission, PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant';
import { TeamPermission } from '@fastgpt/global/support/permission/user/controller';
import { getGroupsByTmbId } from '../../permission/memberGroup/controllers';
import { TeamDefaultPermissionVal } from '@fastgpt/global/support/permission/user/constant';

async function getTeamMember(match: Record<string, any>): Promise<TeamTmbItemType> {
const tmb = (await MongoTeamMember.findOne(match).populate('teamId')) as TeamMemberWithTeamSchema;
Expand All @@ -25,25 +26,20 @@ async function getTeamMember(match: Record<string, any>): Promise<TeamTmbItemTyp
tmbId: tmb._id
});

const groups = (await getGroupsByTmbId(tmb._id)).map((item) => {
const groupIdList = (await getGroupsByTmbId(tmb._id)).map((item) => {
return item._id;
});
console.debug(groups);

const groupPers = await Promise.all(
groups.map((groupId) =>
groupIdList.map((groupId) =>
getResourcePermission({
resourceType: PerResourceTypeEnum.team,
groupId,
teamId: tmb.teamId._id
})
)
); // could be null
const maxGroupPer = groupPers.reduce((prev, cur) => {
if (cur) {
return Math.max(prev, cur.permission);
}
return prev;
}, 0);
const maxGroupPer = getMaxGroupPer(groupPers.map((item) => item?.permission || NullPermission));

return {
userId: String(tmb.userId),
Expand All @@ -59,7 +55,7 @@ async function getTeamMember(match: Record<string, any>): Promise<TeamTmbItemTyp
defaultTeam: tmb.defaultTeam,
lafAccount: tmb.teamId.lafAccount,
permission: new TeamPermission({
per: tmbPer?.permission || maxGroupPer,
per: tmbPer?.permission || maxGroupPer || TeamDefaultPermissionVal,
isOwner: tmb.role === TeamMemberRoleEnum.owner
}),
notificationAccount: tmb.teamId.notificationAccount
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ function PermissionSelect({
}: PermissionSelectProps) {
const { t } = useTranslation();
const { permission, permissionList } = useContextSelector(CollaboratorContext, (v) => v);
const ref = useRef<any>(null);
const closeTimer = useRef<any>();
const ref = useRef<HTMLButtonElement>(null);
const closeTimer = useRef<NodeJS.Timeout>();

const [isOpen, setIsOpen] = useState(false);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro
const { run: onCreate, loading: isLoadingCreate } = useRequest2(
async () => {
postCreateGroup({
members: getValues('members'),
memberIdList: getValues('members'),
name: getValues('name'),
avatar: getValues('avatar')
});
Expand All @@ -82,7 +82,7 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro
groupId: editGroupId,
name: getValues('name'),
avatar: getValues('avatar'),
members: getValues('members')
memberIdList: getValues('members')
});
},
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useMemo, useState } from 'react';
import React, { useState } from 'react';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { useTranslation } from 'next-i18next';
import { ModalCloseButton, ModalBody, Box, ModalFooter, Button } from '@chakra-ui/react';
Expand All @@ -7,14 +7,6 @@ import { useRequest } from '@fastgpt/web/hooks/useRequest';
import { postInviteTeamMember } from '@/web/support/user/team/api';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import type { InviteMemberResponse } from '@fastgpt/global/support/user/team/controller.d';
import MySelect from '@fastgpt/web/components/common/MySelect';
import {
ManagePermissionVal,
ReadPermissionVal,
WritePermissionVal
} from '@fastgpt/global/support/permission/constant';
import { useI18n } from '@/web/context/I18n';
import { useUserStore } from '@/web/support/user/useUserStore';

const InviteModal = ({
teamId,
Expand All @@ -26,46 +18,45 @@ const InviteModal = ({
onSuccess: () => void;
}) => {
const { t } = useTranslation();
const { userT } = useI18n();
const { ConfirmModal, openConfirm } = useConfirm({
title: t('common:user.team.Invite Member Result Tip'),
showCancel: false
});
const { userInfo } = useUserStore();
// const { userInfo } = useUserStore();

const [inviteUsernames, setInviteUsernames] = useState<string[]>([]);
const inviteTypes = useMemo(
() => [
{
label: userT('permission.Read'),
description: userT('permission.Read desc'),
value: ReadPermissionVal
},
{
label: userT('permission.Write'),
description: userT('permission.Write tip'),
value: WritePermissionVal
},
...(userInfo?.team?.permission.isOwner
? [
{
label: userT('permission.Manage'),
description: userT('permission.Manage tip'),
value: ManagePermissionVal
}
]
: [])
],
[userInfo?.team?.permission.isOwner, userT]
);
const [selectedInviteType, setSelectInviteType] = useState(inviteTypes[0].value);
// const inviteTypes = useMemo(
// () => [
// {
// label: userT('permission.Read'),
// description: userT('permission.Read desc'),
// value: ReadPermissionVal
// },
// {
// label: userT('permission.Write'),
// description: userT('permission.Write tip'),
// value: WritePermissionVal
// },
// ...(userInfo?.team?.permission.isOwner
// ? [
// {
// label: userT('permission.Manage'),
// description: userT('permission.Manage tip'),
// value: ManagePermissionVal
// }
// ]
// : [])
// ],
// [userInfo?.team?.permission.isOwner, userT]
// );
// const [selectedInviteType, setSelectInviteType] = useState(inviteTypes[0].value);

const { mutate: onInvite, isLoading } = useRequest({
mutationFn: () => {
return postInviteTeamMember({
teamId,
usernames: inviteUsernames,
permission: selectedInviteType
usernames: inviteUsernames
// permission: selectedInviteType
});
},
onSuccess(res: InviteMemberResponse) {
Expand Down Expand Up @@ -104,9 +95,9 @@ const InviteModal = ({
<ModalBody>
<Box mb={2}>{t('common:user.Account')}</Box>
<TagTextarea defaultValues={inviteUsernames} onUpdate={setInviteUsernames} />
<Box mt={4}>
<MySelect list={inviteTypes} value={selectedInviteType} onchange={setSelectInviteType} />
</Box>
{/* <Box mt={4}> */}
{/* <MySelect list={inviteTypes} value={selectedInviteType} onchange={setSelectInviteType} /> */}
{/* </Box> */}
</ModalBody>
<ModalFooter>
<Button
Expand Down
Loading

0 comments on commit 8ff6168

Please sign in to comment.