jack zhang 62b2b5c68b
chore: add copyright information to the file header (#4028)
* fix: add license code

* fix: bug

* fix: bug

* fix: upgrade

* fix: improve

* chore: add copyright information to the file header

* fix: d.ts bug

* fix: bug

* fix: e2e bug

* fix: merge main

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2024-04-30 15:51:31 +08:00

103 lines
3.4 KiB
TypeScript

/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import { FullDataRepository } from '../services/full-data-repository';
import lodash from 'lodash';
type UsingConfigType = 'strategy' | 'resourceAction';
function totalPage(total, pageSize): number {
return Math.ceil(total / pageSize);
}
const rolesRemoteCollectionsResourcer = {
name: 'roles.dataSourcesCollections',
actions: {
async list(ctx, next) {
const role = ctx.action.params.associatedIndex;
const { page = 1, pageSize = 20 } = ctx.action.params;
const { filter } = ctx.action.params;
const { dataSourceKey } = filter;
const dataSource = ctx.app.dataSourceManager.dataSources.get(dataSourceKey);
const collectionRepository = new FullDataRepository<any>(dataSource.collectionManager.getCollections());
// all collections
const [collections] = await collectionRepository.findAndCount();
const filterItem = lodash.get(filter, '$and');
const filterByTitle = filterItem?.find((item) => item.title);
const filterByName = filterItem?.find((item) => item.name);
const filterTitle = lodash.get(filterByTitle, 'title.$includes')?.toLowerCase();
const filterName = lodash.get(filterByName, 'name.$includes')?.toLowerCase();
const roleResources = await ctx.app.db.getRepository('dataSourcesRolesResources').find({
filter: {
roleName: role,
dataSourceKey,
},
});
// role collections
const roleResourcesNames = roleResources.map((roleResource) => roleResource.get('name'));
const roleResourceActionResourceNames = roleResources
.filter((roleResources) => roleResources.get('usingActionsConfig'))
.map((roleResources) => roleResources.get('name'));
const filtedCollections = collections.filter((collection) => {
return (
(!filterTitle || lodash.get(collection, 'options.title')?.toLowerCase().includes(filterTitle)) &&
(!filterName || collection.options.name.toLowerCase().includes(filterName))
);
});
const items = lodash.sortBy(
filtedCollections.map((collection, i) => {
const collectionName = collection.options.name;
const exists = roleResourcesNames.includes(collectionName);
const usingConfig: UsingConfigType = roleResourceActionResourceNames.includes(collectionName)
? 'resourceAction'
: 'strategy';
return {
type: 'collection',
name: collectionName,
collectionName,
title: collection.options.uiSchema?.title || collection.options.title,
roleName: role,
usingConfig,
exists,
fields: [...collection.fields.values()].map((field) => {
return field.options;
}),
};
}),
'name',
);
ctx.body = {
count: filtedCollections.length,
rows: items,
page: Number(page),
pageSize: Number(pageSize),
totalPage: totalPage(filtedCollections.length, pageSize),
};
await next();
},
},
};
export { rolesRemoteCollectionsResourcer };