Skip to content

Commit

Permalink
feat: dataset collaborator with group, remove default permission
Browse files Browse the repository at this point in the history
  • Loading branch information
FinleyGe committed Oct 12, 2024
1 parent 673c57d commit 7c5fa44
Show file tree
Hide file tree
Showing 12 changed files with 159 additions and 218 deletions.
9 changes: 5 additions & 4 deletions packages/global/core/dataset/type.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { PermissionSchemaType } from '../../support/permission/type';
import type { LLMModelItemType, VectorModelItemType } from '../../core/ai/model.d';
import { PermissionTypeEnum } from '../../support/permission/constant';
import { PushDatasetDataChunkProps } from './api';
Expand Down Expand Up @@ -32,8 +31,8 @@ export type DatasetSchemaType = {
selector: string;
};
externalReadUrl?: string;
} & PermissionSchemaType;
// } & PermissionSchemaType;
inheritPermission: boolean;
};

export type DatasetCollectionSchemaType = {
_id: string;
Expand Down Expand Up @@ -146,7 +145,9 @@ export type DatasetListItemType = {
type: `${DatasetTypeEnum}`;
permission: DatasetPermission;
vectorModel: VectorModelItemType;
} & PermissionSchemaType;
inheritPermission: boolean;
private?: boolean;
};

export type DatasetItemType = Omit<DatasetSchemaType, 'vectorModel' | 'agentModel'> & {
vectorModel: VectorModelItemType;
Expand Down
7 changes: 4 additions & 3 deletions packages/service/core/dataset/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ import {
TeamCollectionName,
TeamMemberCollectionName
} from '@fastgpt/global/support/user/team/constant';
import { DatasetDefaultPermissionVal } from '@fastgpt/global/support/permission/dataset/constant';
import { getPermissionSchema } from '@fastgpt/global/support/permission/utils';
import type { DatasetSchemaType } from '@fastgpt/global/core/dataset/type.d';

export const DatasetCollectionName = 'datasets';
Expand Down Expand Up @@ -88,7 +86,10 @@ const DatasetSchema = new Schema({
externalReadUrl: {
type: String
},
...getPermissionSchema(DatasetDefaultPermissionVal)
inheritPermission: {
type: Boolean,
default: true
}
});

try {
Expand Down
1 change: 0 additions & 1 deletion packages/service/support/permission/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,6 @@ export const delResourcePermission = ({
resourceType: PerResourceTypeEnum;
teamId: string;
resourceId: string;
tmbId: string;
session?: ClientSession;
} & RequireOnlyOne<{
tmbId: string;
Expand Down
12 changes: 5 additions & 7 deletions packages/service/support/permission/dataset/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { MongoDatasetData } from '../../../core/dataset/data/schema';
import { AuthModeType, AuthResponseType } from '../type';
import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import { ParentIdType } from '@fastgpt/global/common/parentFolder/type';
import { DatasetDefaultPermissionVal } from '@fastgpt/global/support/permission/dataset/constant';

export const authDatasetByTmbId = async ({
tmbId,
Expand Down Expand Up @@ -62,7 +63,7 @@ export const authDatasetByTmbId = async ({
const isOwner = tmbPer.isOwner || String(dataset.tmbId) === String(tmbId);

// get dataset permission or inherit permission from parent folder.
const { Per, defaultPermission } = await (async () => {
const { Per } = await (async () => {
if (
dataset.type === DatasetTypeEnum.folder ||
dataset.inheritPermission === false ||
Expand All @@ -78,12 +79,11 @@ export const authDatasetByTmbId = async ({
resourceType: PerResourceTypeEnum.dataset
});
const Per = new DatasetPermission({
per: rp ?? dataset.defaultPermission,
per: rp ?? DatasetDefaultPermissionVal,
isOwner
});
return {
Per,
defaultPermission: dataset.defaultPermission
Per
};
} else {
// is not folder and inheritPermission is true and is not root folder.
Expand All @@ -100,8 +100,7 @@ export const authDatasetByTmbId = async ({
});

return {
Per,
defaultPermission: parent.defaultPermission
Per
};
}
})();
Expand All @@ -112,7 +111,6 @@ export const authDatasetByTmbId = async ({

return {
...dataset,
defaultPermission,
permission: Per
};
})();
Expand Down
72 changes: 49 additions & 23 deletions projects/app/src/pages/api/core/dataset/allDataset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import type { NextApiRequest } from 'next';
import { MongoDataset } from '@fastgpt/service/core/dataset/schema';
import { getVectorModel } from '@fastgpt/service/core/ai/model';
import type { DatasetSimpleItemType } from '@fastgpt/global/core/dataset/type.d';
import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import { NextAPI } from '@/service/middleware/entry';
import {
PerResourceTypeEnum,
Expand All @@ -11,6 +10,9 @@ import {
import { MongoResourcePermission } from '@fastgpt/service/support/permission/schema';
import { DatasetPermission } from '@fastgpt/global/support/permission/dataset/controller';
import { authUserPer } from '@fastgpt/service/support/permission/user/auth';
import { DatasetDefaultPermissionVal } from '@fastgpt/global/support/permission/dataset/constant';
import { getGroupsByTmbId } from '@fastgpt/service/support/permission/memberGroup/controllers';
import { getGroupPer } from '@fastgpt/service/support/permission/controller';

/* get all dataset by teamId or tmbId */
async function handler(req: NextApiRequest): Promise<DatasetSimpleItemType[]> {
Expand All @@ -25,7 +27,14 @@ async function handler(req: NextApiRequest): Promise<DatasetSimpleItemType[]> {
per: ReadPermissionVal
});

const [myDatasets, rpList] = await Promise.all([
const myGroupIds = (
await getGroupsByTmbId({
tmbId,
teamId
})
).map((item) => String(item._id));

const [myDatasets, perList] = await Promise.all([
MongoDataset.find({
teamId
})
Expand All @@ -34,39 +43,56 @@ async function handler(req: NextApiRequest): Promise<DatasetSimpleItemType[]> {
})
.lean(),
MongoResourcePermission.find({
resourceType: PerResourceTypeEnum.dataset,
teamId,
tmbId
$and: [
{
resourceType: PerResourceTypeEnum.dataset,
teamId
},
{ $or: [{ tmbId }, { groupId: { $in: myGroupIds } }] }
]
}).lean()
]);

const filterDatasets = myDatasets
.map((dataset) => {
const perVal = (() => {
const perVal = rpList.find(
(item) => String(item.resourceId) === String(dataset._id)
)?.permission;
if (perVal) {
return perVal;
}
const parentDataset = myDatasets.find(
(item) => String(item._id) === String(dataset.parentId)
);

if (dataset.inheritPermission && dataset.parentId) {
const parentDataset = myDatasets.find(
(item) => String(item._id) === String(dataset.parentId)
if (dataset.inheritPermission && dataset.parentId && parentDataset) {
const tmbPer = perList.find(
(item) => String(item.resourceId) === String(parentDataset._id) && !!item.tmbId
)?.permission;
const groupPer = getGroupPer(
perList
.filter(
(item) =>
String(item.resourceId) === String(parentDataset._id) &&
myGroupIds.includes(String(item.groupId))
)
.map((item) => item.permission)
);
return tmbPer ?? groupPer ?? DatasetDefaultPermissionVal;
} else {
const tmbPer = perList.find(
(item) => String(item.resourceId) === String(dataset._id) && !!item.tmbId
)?.permission;
const groupPer = getGroupPer(
perList
.filter(
(item) =>
String(item.resourceId) === String(dataset._id) &&
myGroupIds.includes(String(item.groupId))
)
.map((item) => item.permission)
);
if (parentDataset) {
const parentPerVal =
rpList.find((item) => String(item.resourceId) === String(parentDataset._id))
?.permission ?? parentDataset.defaultPermission;
if (parentPerVal) {
return parentPerVal;
}
}
return tmbPer ?? groupPer ?? DatasetDefaultPermissionVal;
}
})();

const Per = new DatasetPermission({
per: perVal ?? dataset.defaultPermission,
per: perVal ?? DatasetDefaultPermissionVal,
isOwner: String(dataset.tmbId) === tmbId || tmbPer.isOwner
});

Expand Down
32 changes: 12 additions & 20 deletions projects/app/src/pages/api/core/dataset/folder/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun';
import { parseParentIdInMongo } from '@fastgpt/global/common/parentFolder/utils';
import { FolderImgUrl } from '@fastgpt/global/common/file/image/constants';
import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import { DatasetDefaultPermissionVal } from '@fastgpt/global/support/permission/dataset/constant';
import { getResourceAllClbs } from '@fastgpt/service/support/permission/controller';
import { getResourceClbsAndGroups } from '@fastgpt/service/support/permission/controller';
import { syncCollaborators } from '@fastgpt/service/support/permission/inheritPermission';
export type DatasetFolderCreateQuery = {};
export type DatasetFolderCreateBody = {
Expand All @@ -38,18 +37,14 @@ async function handler(
authToken: true
});

const parentFolder = await (async () => {
if (parentId) {
return (
await authDataset({
datasetId: parentId,
per: WritePermissionVal,
req,
authToken: true
})
).dataset;
}
})();
if (parentId) {
await authDataset({
datasetId: parentId,
per: WritePermissionVal,
req,
authToken: true
});
}

await mongoSessionRun(async (session) => {
const app = await MongoDataset.create({
Expand All @@ -59,14 +54,11 @@ async function handler(
intro,
teamId,
tmbId,
type: DatasetTypeEnum.folder,
defaultPermission: !!parentFolder
? parentFolder.defaultPermission
: DatasetDefaultPermissionVal
type: DatasetTypeEnum.folder
});

if (parentId) {
const parentClbs = await getResourceAllClbs({
const parentClbsAndGroups = await getResourceClbsAndGroups({
teamId,
resourceId: parentId,
resourceType: PerResourceTypeEnum.dataset,
Expand All @@ -77,7 +69,7 @@ async function handler(
resourceType: PerResourceTypeEnum.dataset,
teamId,
resourceId: app._id,
collaborators: parentClbs,
collaborators: parentClbsAndGroups,
session
});
}
Expand Down
Loading

0 comments on commit 7c5fa44

Please sign in to comment.