mirror of
https://github.com/labring/FastGPT.git
synced 2025-10-19 01:54:04 +00:00

* System template (#2082) * feat: system plugin (#2024) * add plugin cost & change plugin avatar (#2030) * add plugin cost & change plugin avatar * add author * feat: duckduckgo plugin * duckduck search * perf: templates select system plugin * perf: system plugin avatar * feat: duckduck plugins * doc * perf: plugin classify * perf: icon avatar component * perf: system template avatar --------- Co-authored-by: heheer <71265218+newfish-cmyk@users.noreply.github.com> * feat: system plugin search * perf: plugin packages important * perf: source avatar * nextconfig * perf: i18n * perf: default model * perf: system plugin author --------- Co-authored-by: heheer <71265218+newfish-cmyk@users.noreply.github.com>
141 lines
3.6 KiB
TypeScript
141 lines
3.6 KiB
TypeScript
/* Auth app permission */
|
|
import { MongoApp } from '../../../core/app/schema';
|
|
import { AppDetailType } from '@fastgpt/global/core/app/type.d';
|
|
import { AuthPropsType } from '../type/auth.d';
|
|
import { parseHeaderCert } from '../controller';
|
|
import { PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant';
|
|
import { AppErrEnum } from '@fastgpt/global/common/error/code/app';
|
|
import { getTmbInfoByTmbId } from '../../user/team/controller';
|
|
import { getResourcePermission } from '../controller';
|
|
import { AppPermission } from '@fastgpt/global/support/permission/app/controller';
|
|
import { AuthResponseType } from '../type/auth.d';
|
|
import { PermissionValueType } from '@fastgpt/global/support/permission/type';
|
|
import { AppFolderTypeList } from '@fastgpt/global/core/app/constants';
|
|
import { ParentIdType } from '@fastgpt/global/common/parentFolder/type';
|
|
import { splitCombinePluginId } from '../../../core/app/plugin/controller';
|
|
import { PluginSourceEnum } from '@fastgpt/global/core/plugin/constants';
|
|
|
|
export const authPluginByTmbId = async ({
|
|
tmbId,
|
|
appId,
|
|
per
|
|
}: {
|
|
tmbId: string;
|
|
appId: string;
|
|
per: PermissionValueType;
|
|
}) => {
|
|
const { source } = await splitCombinePluginId(appId);
|
|
if (source === PluginSourceEnum.personal) {
|
|
await authAppByTmbId({
|
|
appId,
|
|
tmbId,
|
|
per
|
|
});
|
|
}
|
|
};
|
|
|
|
export const authAppByTmbId = async ({
|
|
tmbId,
|
|
appId,
|
|
per
|
|
}: {
|
|
tmbId: string;
|
|
appId: string;
|
|
per: PermissionValueType;
|
|
}): Promise<{
|
|
app: AppDetailType;
|
|
}> => {
|
|
const { teamId, permission: tmbPer } = await getTmbInfoByTmbId({ tmbId });
|
|
|
|
const app = await (async () => {
|
|
const app = await MongoApp.findOne({ _id: appId }).lean();
|
|
|
|
if (!app) {
|
|
return Promise.reject(AppErrEnum.unExist);
|
|
}
|
|
const isOwner = tmbPer.isOwner || String(app.tmbId) === String(tmbId);
|
|
|
|
const { Per, defaultPermission } = await (async () => {
|
|
if (
|
|
AppFolderTypeList.includes(app.type) ||
|
|
app.inheritPermission === false ||
|
|
!app.parentId
|
|
) {
|
|
// 1. is a folder. (Folders have compeletely permission)
|
|
// 2. inheritPermission is false.
|
|
// 3. is root folder/app.
|
|
const rp = await getResourcePermission({
|
|
teamId,
|
|
tmbId,
|
|
resourceId: appId,
|
|
resourceType: PerResourceTypeEnum.app
|
|
});
|
|
const Per = new AppPermission({ per: rp?.permission ?? app.defaultPermission, isOwner });
|
|
return {
|
|
Per,
|
|
defaultPermission: app.defaultPermission
|
|
};
|
|
} else {
|
|
// is not folder and inheritPermission is true and is not root folder.
|
|
const { app: parent } = await authAppByTmbId({
|
|
tmbId,
|
|
appId: app.parentId,
|
|
per
|
|
});
|
|
|
|
const Per = new AppPermission({
|
|
per: parent.permission.value,
|
|
isOwner
|
|
});
|
|
return {
|
|
Per,
|
|
defaultPermission: parent.defaultPermission
|
|
};
|
|
}
|
|
})();
|
|
|
|
if (!Per.checkPer(per)) {
|
|
return Promise.reject(AppErrEnum.unAuthApp);
|
|
}
|
|
|
|
return {
|
|
...app,
|
|
defaultPermission,
|
|
permission: Per
|
|
};
|
|
})();
|
|
|
|
return { app };
|
|
};
|
|
|
|
export const authApp = async ({
|
|
appId,
|
|
per,
|
|
...props
|
|
}: AuthPropsType & {
|
|
appId: ParentIdType;
|
|
}): Promise<
|
|
AuthResponseType & {
|
|
app: AppDetailType;
|
|
}
|
|
> => {
|
|
const result = await parseHeaderCert(props);
|
|
const { tmbId } = result;
|
|
|
|
if (!appId) {
|
|
return Promise.reject(AppErrEnum.unExist);
|
|
}
|
|
|
|
const { app } = await authAppByTmbId({
|
|
tmbId,
|
|
appId,
|
|
per
|
|
});
|
|
|
|
return {
|
|
...result,
|
|
permission: app.permission,
|
|
app
|
|
};
|
|
};
|