diff --git a/packages/nocodb/src/app.module.ts b/packages/nocodb/src/app.module.ts index ad8a162866..fc79033b15 100644 --- a/packages/nocodb/src/app.module.ts +++ b/packages/nocodb/src/app.module.ts @@ -19,9 +19,6 @@ import { MetasModule } from './modules/metas/metas.module'; import { JobsModule } from './modules/jobs/jobs.module'; import { AppInitService } from './services/app-init.service'; import type { MiddlewareConsumer } from '@nestjs/common'; -import { DataTableController } from './controllers/data-table.controller'; -import { DataTableController } from './servicess/data-table.controller'; -import { DataTableService } from './services/data-table.service'; @Module({ imports: [ @@ -41,7 +38,6 @@ import { DataTableService } from './services/data-table.service'; ] : []), ], - controllers: [DataTableController], providers: [ AuthService, { @@ -53,7 +49,6 @@ import { DataTableService } from './services/data-table.service'; BaseViewStrategy, HookHandlerService, AppInitService, - DataTableService, ], }) export class AppModule { diff --git a/packages/nocodb/src/controllers/data-table.controller.ts b/packages/nocodb/src/controllers/data-table.controller.ts index da18ac5b30..3f772cd35b 100644 --- a/packages/nocodb/src/controllers/data-table.controller.ts +++ b/packages/nocodb/src/controllers/data-table.controller.ts @@ -41,6 +41,7 @@ export class DataTableController { query: req.query, projectId: projectId, modelId: modelId, + viewId: viewId, }); const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(startTime)); res.setHeader('xc-db-response', elapsedSeconds); @@ -59,6 +60,7 @@ export class DataTableController { const countResult = await this.dataTableService.dataCount({ query: req.query, modelId, + viewId, projectId, }); @@ -79,6 +81,7 @@ export class DataTableController { projectId: projectId, modelId: modelId, body: body, + viewId, cookie: req, }); } @@ -97,6 +100,7 @@ export class DataTableController { modelId: modelId, body: req.body, cookie: req, + viewId, rowId: rowId, }); } @@ -114,6 +118,7 @@ export class DataTableController { projectId: projectId, modelId: modelId, cookie: req, + viewId, rowId: rowId, }); } @@ -132,6 +137,7 @@ export class DataTableController { projectId, rowId: rowId, query: req.query, + viewId }); } } diff --git a/packages/nocodb/src/modules/datas/datas.module.ts b/packages/nocodb/src/modules/datas/datas.module.ts index 6c9f6f713b..054e2769df 100644 --- a/packages/nocodb/src/modules/datas/datas.module.ts +++ b/packages/nocodb/src/modules/datas/datas.module.ts @@ -3,8 +3,10 @@ import { MulterModule } from '@nestjs/platform-express'; import multer from 'multer'; import { NC_ATTACHMENT_FIELD_SIZE } from '../../constants'; import { DataAliasController } from '../../controllers/data-alias.controller'; +import { DataTableController } from '../../controllers/data-table.controller'; import { PublicDatasExportController } from '../../controllers/public-datas-export.controller'; import { PublicDatasController } from '../../controllers/public-datas.controller'; +import { DataTableService } from '../../services/data-table.service'; import { DatasService } from '../../services/datas.service'; import { DatasController } from '../../controllers/datas.controller'; import { BulkDataAliasController } from '../../controllers/bulk-data-alias.controller'; @@ -27,6 +29,7 @@ import { PublicDatasService } from '../../services/public-datas.service'; }), ], controllers: [ + DataTableController, DatasController, BulkDataAliasController, DataAliasController, @@ -37,6 +40,7 @@ import { PublicDatasService } from '../../services/public-datas.service'; PublicDatasExportController, ], providers: [ + DataTableService, DatasService, BulkDataAliasService, DataAliasNestedService, diff --git a/packages/nocodb/src/services/data-table.service.ts b/packages/nocodb/src/services/data-table.service.ts index 5fad03a26d..f29d6c79f0 100644 --- a/packages/nocodb/src/services/data-table.service.ts +++ b/packages/nocodb/src/services/data-table.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; import { NcError } from '../helpers/catchError'; -import { Base, Model } from '../models'; +import { Base, Model, View } from '../models'; import NcConnectionMgrv2 from '../utils/common/NcConnectionMgrv2'; import { DatasService } from './datas.service'; @@ -8,11 +8,17 @@ import { DatasService } from './datas.service'; export class DataTableService { constructor(private datasService: DatasService) {} - async dataList(param: { projectId?: string; modelId: string; query: any }) { - const model = await this.getModelAndValidate(param); + async dataList(param: { + projectId?: string; + modelId: string; + query: any; + viewId?: string; + }) { + const { model, view } = await this.getModelAndView(param); return await this.datasService.getDataList({ model, + view, query: param.query, }); } @@ -21,14 +27,16 @@ export class DataTableService { projectId?: string; modelId: string; rowId: string; + viewId?: string; query: any; }) { - const model = await this.getModelAndValidate(param); + const { model, view } = await this.getModelAndView(param); const base = await Base.get(model.base_id); const baseModel = await Model.getBaseModelSQL({ id: model.id, + viewId: view?.id, dbDriver: await NcConnectionMgrv2.get(base), }); @@ -43,15 +51,17 @@ export class DataTableService { async dataInsert(param: { projectId?: string; + viewId?: string; modelId: string; body: any; cookie: any; }) { - const model = await this.getModelAndValidate(param); + const { model, view } = await this.getModelAndView(param); const base = await Base.get(model.base_id); const baseModel = await Model.getBaseModelSQL({ id: model.id, + viewId: view?.id, dbDriver: await NcConnectionMgrv2.get(base), }); @@ -61,16 +71,18 @@ export class DataTableService { async dataUpdate(param: { projectId?: string; modelId: string; + viewId?: string; rowId: string; body: any; cookie: any; }) { - const model = await this.getModelAndValidate(param); + const { model, view } = await this.getModelAndView(param); const base = await Base.get(model.base_id); const baseModel = await Model.getBaseModelSQL({ id: model.id, + viewId: view?.id, dbDriver: await NcConnectionMgrv2.get(base), }); @@ -85,13 +97,15 @@ export class DataTableService { async dataDelete(param: { projectId?: string; modelId: string; + viewId?: string; rowId: string; cookie: any; }) { - const model = await this.getModelAndValidate(param); + const { model, view } = await this.getModelAndView(param); const base = await Base.get(model.base_id); const baseModel = await Model.getBaseModelSQL({ id: model.id, + viewId: view?.id, dbDriver: await NcConnectionMgrv2.get(base), }); @@ -103,27 +117,42 @@ export class DataTableService { return await baseModel.delByPk(param.rowId, null, param.cookie); } - private async getModelAndValidate(param: { + private async getModelAndView(param: { projectId?: string; + viewId?: string; modelId: string; - query: any; }) { const model = await Model.get(param.modelId); if (model.project_id && model.project_id !== param.projectId) { - throw new Error('Model not found in project'); + throw new Error('Model not belong to project'); } - return model; - } - async dataCount(param: { projectId?: string; modelId: string; query: any }) { + let view: View; - const model = await this.getModelAndValidate(param); + if (param.viewId) { + view = await View.get(param.viewId); + if (view.fk_model_id && view.fk_model_id !== param.modelId) { + throw new Error('View not belong to model'); + } + } + + return { model, view }; + } + + async dataCount(param: { + projectId?: string; + viewId?: string; + modelId: string; + query: any; + }) { + const { model, view } = await this.getModelAndView(param); const base = await Base.get(model.base_id); const baseModel = await Model.getBaseModelSQL({ id: model.id, + viewId: view?.id, dbDriver: await NcConnectionMgrv2.get(base), }); @@ -135,6 +164,5 @@ export class DataTableService { const count: number = await baseModel.count(countArgs); return { count }; - } }