mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-06 05:59:25 +08:00
* refactor: support api datasource * refactor: support api datasource * refactor: support api datasource * feat: url support preview (#4559) * feat: url support preview * feat: add settings for Input.Preview * refactor: refactor CollectionField.tsx to use dynamic component * Revert "refactor: refactor CollectionField.tsx to use dynamic component" This reverts commit 37719eb28e5866762459da3b269288340a21b661. * test: add e2e test * refactor(e2e): extract template --------- Co-authored-by: Zeke Zhang <958414905@qq.com> * fix(map): amap reset (#4574) * chore: volta node version * chore: data source api * refactor: support api datasource * chore: data source api * chore: data source api * chore: field options * refactor: support api data source * refactor: support api data source * refactor: support api data source * refactor: support api data source * refactor: support api data source * refactor: support api data source * refactor: support api data source * fix: load data source fields * refactor: support api data source * feat(data-vi): support for using url params and current role variables (#4586) * feat(data-vi): support for using url params and current role variable * fix: bug * fix(variable): should remove through collection field (#4590) * fix: style issues for gridCard in mobile client (#4593) * fix: style issiues for gridCard in mobile client * fix: bug * fix: bug * fix: bug * fix: style issues for gridCard in mobile client (#4599) * fix: style issiues for gridCard in mobile client * fix: bug * fix: bug * fix: bug * fix: style improve * chore: update lerna * chore(versions): 😊 publish v1.0.1-alpha.1 * chore: update changelog * chore: fix typo (#4589) * feat(plugin-workflow-smtp-mailer): add new plugin for sending email in workflow (#4584) * feat(plugin-workflow-smtp-mailer): add new plugin for sending email in workflow * refactor(plugin-workflow-mailer): change plugin name and locales * fix(plugin-workflow-mailer): fix parameters * fix(preset): add new plugin to preset * fix(plugin-workflow-mailer): fix locale namespace * fix: iframe block loses height when set to default (#4602) * fix: iframe block loses height when set to default * refactor: local improve * feat(client): allow JSON5 value in Form Input of type JSONTextArea (#4600) * feat(client): allow json5 value in form-item type json component * test: fix tests * chore: set json5 default as false * chore: add demo --------- Co-authored-by: xilesun <2013xile@gmail.com> * fix: remove grid wrap (#4612) * refactor(plugin-workflow): change variable getter from collection fields (#4567) * refactor(plugin-workflow): change variable getter from collection fields * fix(plugin-workflow): fix import * chore(plugin-workflow-action-trigger): remove unused import * fix(plugin-workflow): fix collection field in workflow variable * refactor(plugin-workflow-manual): avoid tslint error * fix(client): fix text wrap in variable input (#4605) * fix(client): fix text wrap in variable input * fix(client): revert css * feat(tree-block): support filtering child nodes (#4603) * feat(tree-block): support filtering child nodes * test: add list test * test: remove only * fix: use isValidFilter * fix(export): export button remaining in loading state after cancel (#4615) * chore: rebase * chore: collection option * fix: update data source fields * chore: console.log * refactor: support api data source * fix: data source test * fix: sync field in data source * chore: unavailableActions in collection option * chore: unavailableActions in data source collections * chore: file collection unavailableActions * fix: test * chore: unavailableActions in actionInitializers * fix: bug * fix: destroy action * chore: unavailableActions in plugin actionInitializers * fix: view * chore: unavailableActions in actionInitializers * fix: missing removeCollection * chore: test name * fix: bug * fix: bug * chore: test * refactor: availableTypes * refactor: availableTypes * chore: datasource options * refactor: get current data source * refactor: code improve * fix: update collection with fields * refactor: code improve * refactor: code improve * refactor: code improve * refactor: code improve * chore: datasource logger * chore: export Schema * refactor: rawTextArea * refactor: loadFilterTargetKeys in external data source * chore: unavailableFunctions * refactor: support unAvailableFunctions * refactor: support unAvailableFunctions * refactor: support unAvailableFunctions * refactor: support unAvailableFunctions * refactor: support unAvailableFunctions * revert: unavailableFunctions * refactor: code improve * fix: test * chore: operation * chore: operation * fix: input support json field * refactor: blockInitializers support unavailableActions * chore: availableActions * chore: availableActions * refactor: support availableActions * refactor: support availableActions * chore: magic model test case * fix: unixTimestamp support integer * fix: disassociate * fix: input readPretty * fix: resolve error when opening modal via URL * style: input readPretty style improve * chore: support simple pagination * chore: skip test * refactor: details support pagination * refactor: details support pagination * chore: useActionAvailable * fix: bug * test: fix test * fix: detailsBlockInitializer useActionAvailable * chore: fix unit test * refactor: pagination * refactor: pagination * test: fix test --------- Co-authored-by: katherinehhh <katherine_15995@163.com> Co-authored-by: chenos <chenlinxh@gmail.com> Co-authored-by: Zeke Zhang <958414905@qq.com> Co-authored-by: YANG QIA <2013xile@gmail.com> Co-authored-by: Katherine <shunai.tang@hand-china.com> Co-authored-by: GitHub Actions Bot <actions@github.com> Co-authored-by: Junyi <mytharcher@users.noreply.github.com> Co-authored-by: David Fecke <david.fecke@eyecook.net>
136 lines
3.4 KiB
TypeScript
136 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 { ACL } from '@nocobase/acl';
|
|
import { getNameByParams, parseRequest, ResourceManager } from '@nocobase/resourcer';
|
|
import EventEmitter from 'events';
|
|
import compose from 'koa-compose';
|
|
import { loadDefaultActions } from './load-default-actions';
|
|
import { ICollectionManager } from './types';
|
|
import { Logger } from '@nocobase/logger';
|
|
|
|
export type DataSourceOptions = any;
|
|
|
|
export abstract class DataSource extends EventEmitter {
|
|
public collectionManager: ICollectionManager;
|
|
public resourceManager: ResourceManager;
|
|
public acl: ACL;
|
|
logger: Logger;
|
|
|
|
constructor(protected options: DataSourceOptions) {
|
|
super();
|
|
this.init(options);
|
|
}
|
|
|
|
setLogger(logger: Logger) {
|
|
this.logger = logger;
|
|
}
|
|
|
|
get name() {
|
|
return this.options.name;
|
|
}
|
|
|
|
static testConnection(options?: any): Promise<boolean> {
|
|
return Promise.resolve(true);
|
|
}
|
|
|
|
init(options: DataSourceOptions = {}) {
|
|
this.acl = this.createACL();
|
|
|
|
this.resourceManager = this.createResourceManager({
|
|
prefix: process.env.API_BASE_PATH,
|
|
...options.resourceManager,
|
|
});
|
|
|
|
this.collectionManager = this.createCollectionManager(options);
|
|
this.resourceManager.registerActionHandlers(loadDefaultActions());
|
|
|
|
if (options.acl !== false) {
|
|
this.resourceManager.use(this.acl.middleware(), { tag: 'acl', after: ['auth'] });
|
|
}
|
|
}
|
|
|
|
middleware(middlewares: any = []) {
|
|
const dataSource = this;
|
|
|
|
if (!this['_used']) {
|
|
for (const [fn, options] of middlewares) {
|
|
this.resourceManager.use(fn, options);
|
|
}
|
|
this['_used'] = true;
|
|
}
|
|
|
|
return async (ctx, next) => {
|
|
ctx.dataSource = dataSource;
|
|
|
|
ctx.getCurrentRepository = () => {
|
|
const { resourceName, resourceOf } = ctx.action;
|
|
|
|
return this.collectionManager.getRepository(resourceName, resourceOf);
|
|
};
|
|
|
|
return compose([this.collectionToResourceMiddleware(), this.resourceManager.middleware()])(ctx, next);
|
|
};
|
|
}
|
|
|
|
createACL() {
|
|
return new ACL();
|
|
}
|
|
|
|
createResourceManager(options) {
|
|
return new ResourceManager(options);
|
|
}
|
|
|
|
publicOptions() {
|
|
return null;
|
|
}
|
|
|
|
async load(options: any = {}) {}
|
|
async close() {}
|
|
|
|
abstract createCollectionManager(options?: any): ICollectionManager;
|
|
|
|
protected collectionToResourceMiddleware() {
|
|
return async (ctx, next) => {
|
|
const params = parseRequest(
|
|
{
|
|
path: ctx.request.path,
|
|
method: ctx.request.method,
|
|
},
|
|
{
|
|
prefix: this.resourceManager.options.prefix,
|
|
accessors: this.resourceManager.options.accessors,
|
|
},
|
|
);
|
|
if (!params) {
|
|
return next();
|
|
}
|
|
const resourceName = getNameByParams(params);
|
|
// 如果资源名称未被定义
|
|
if (this.resourceManager.isDefined(resourceName)) {
|
|
return next();
|
|
}
|
|
|
|
const splitResult = resourceName.split('.');
|
|
|
|
const collectionName = splitResult[0];
|
|
|
|
if (!this.collectionManager.hasCollection(collectionName)) {
|
|
return next();
|
|
}
|
|
|
|
this.resourceManager.define({
|
|
name: resourceName,
|
|
});
|
|
|
|
return next();
|
|
};
|
|
}
|
|
}
|