Files
FastGPT/test/mocks/request.ts
Archer 199f454b6b feat: team permission refine (#4494) (#4498)
* feat: team permission refine (#4402)

* chore: team permission extend

* feat: manage team permission

* chore: api auth

* fix: i18n

* feat: add initv493

* fix: test, org auth manager

* test: app test for refined permission

* update init sh

* fix: add/remove manage permission (#4427)

* fix: add/remove manage permission

* fix: github action fastgpt-test

* fix: mock create model

* fix: team write permission

* fix: ts

* account permission

---------

Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com>
2025-04-10 11:11:54 +08:00

153 lines
3.8 KiB
TypeScript

import { TeamErrEnum } from '@fastgpt/global/common/error/code/team';
import { AuthUserTypeEnum } from '@fastgpt/global/support/permission/constant';
import { TeamPermission } from '@fastgpt/global/support/permission/user/controller';
import { MongoGroupMemberModel } from '@fastgpt/service/support/permission/memberGroup/groupMemberSchema';
import { getTmbInfoByTmbId } from '@fastgpt/service/support/user/team/controller';
import { vi } from 'vitest';
// vi.mock(import('@/service/middleware/entry'), async () => {
// const NextAPI = vi.fn((handler: any) => handler);
// return {
// NextAPI
// };
// });
vi.mock(import('@fastgpt/service/common/middle/entry'), async (importOriginal) => {
const mod = await importOriginal();
const NextEntry = vi.fn(({ beforeCallback = [] }: { beforeCallback?: Promise<any>[] }) => {
return (...args: any) => {
return async function api(req: any, res: any) {
try {
await Promise.all([...beforeCallback]);
let response = null;
for await (const handler of args) {
response = await handler(req, res);
if (res.writableFinished) {
break;
}
}
return {
code: 200,
data: response
};
} catch (error) {
return {
code: 500,
error,
url: req.url
};
}
};
};
});
return {
...mod,
NextEntry
};
});
export type parseHeaderCertRet = {
userId: string;
teamId: string;
tmbId: string;
appId: string;
authType: AuthUserTypeEnum;
sourceName: string | undefined;
apikey: string;
isRoot: boolean;
};
export type MockReqType<B = any, Q = any> = {
body?: B;
query?: Q;
auth?: parseHeaderCertRet;
[key: string]: any;
};
vi.mock(import('@fastgpt/service/support/permission/controller'), async (importOriginal) => {
const mod = await importOriginal();
const parseHeaderCert = vi.fn(
({
req,
authToken = false,
authRoot = false,
authApiKey = false
}: {
req: MockReqType;
authToken?: boolean;
authRoot?: boolean;
authApiKey?: boolean;
}) => {
const { auth } = req;
if (!auth) {
return Promise.reject(Error('unAuthorization'));
}
return Promise.resolve(auth);
}
);
return {
...mod,
parseHeaderCert
};
});
vi.mock(
import('@fastgpt/service/support/permission/memberGroup/controllers'),
async (importOriginal) => {
const mod = await importOriginal();
const parseHeaderCert = vi.fn(
({
req,
authToken = false,
authRoot = false,
authApiKey = false
}: {
req: MockReqType;
authToken?: boolean;
authRoot?: boolean;
authApiKey?: boolean;
}) => {
const { auth } = req;
if (!auth) {
return Promise.reject(Error('unAuthorization(mock)'));
}
return Promise.resolve(auth);
}
);
const authGroupMemberRole = vi.fn(async ({ groupId, role, ...props }: any) => {
const result = await parseHeaderCert(props);
const { teamId, tmbId, isRoot } = result;
if (isRoot) {
return {
...result,
permission: new TeamPermission({
isOwner: true
}),
teamId,
tmbId
};
}
const [groupMember, tmb] = await Promise.all([
MongoGroupMemberModel.findOne({ groupId, tmbId }),
getTmbInfoByTmbId({ tmbId })
]);
// Team admin or role check
if (tmb.permission.hasManagePer || (groupMember && role.includes(groupMember.role))) {
return {
...result,
permission: tmb.permission,
teamId,
tmbId
};
}
return Promise.reject(TeamErrEnum.unAuthTeam);
});
return {
...mod,
authGroupMemberRole
};
}
);