From c59da67f6719d7b07fd5db3e28d104c5595a2ff1 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Mon, 25 Apr 2022 11:17:15 +0530 Subject: [PATCH] feat: accept both project id or title in data apis Signed-off-by: Pranav C --- .../nocodb/src/lib/noco-models/Project.ts | 49 +++++++++++++++++++ .../src/lib/noco/meta/api/dataApis/helpers.ts | 6 +-- .../extractProjectIdAndAuthenticate.ts | 2 +- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/packages/nocodb/src/lib/noco-models/Project.ts b/packages/nocodb/src/lib/noco-models/Project.ts index 59599f3d9b..33fa34ede0 100644 --- a/packages/nocodb/src/lib/noco-models/Project.ts +++ b/packages/nocodb/src/lib/noco-models/Project.ts @@ -323,4 +323,53 @@ export default class Project implements ProjectType { } return projectData?.id && this.get(projectData?.id, ncMeta); } + + static async getByTitleOrId(titleOrId: string, ncMeta = Noco.ncMeta) { + const projectId = + titleOrId && + (await NocoCache.get( + `${CacheScope.PROJECT}:${titleOrId}`, + CacheGetType.TYPE_OBJECT + )); + let projectData = null; + if (!projectId) { + projectData = await Noco.ncMeta.metaGet2( + null, + null, + MetaTable.PROJECT, + { + deleted: false + }, + null, + { + _or: [ + { + id: { + eq: titleOrId + } + }, + { + title: { + eq: titleOrId + } + } + ] + } + ); + await NocoCache.set( + `${CacheScope.PROJECT}:${titleOrId}`, + projectData?.id + ); + } else { + return this.get(projectId); + } + return projectData?.id && this.get(projectData?.id, ncMeta); + } + + static async getWithInfoByTitleOrId(titleOrId: string, ncMeta = Noco.ncMeta) { + const project = await this.getByTitleOrId(titleOrId, ncMeta); + if (project) await project.getBases(ncMeta); + + return project; + } } diff --git a/packages/nocodb/src/lib/noco/meta/api/dataApis/helpers.ts b/packages/nocodb/src/lib/noco/meta/api/dataApis/helpers.ts index 75f689952e..56c7224a40 100644 --- a/packages/nocodb/src/lib/noco/meta/api/dataApis/helpers.ts +++ b/packages/nocodb/src/lib/noco/meta/api/dataApis/helpers.ts @@ -18,11 +18,7 @@ export async function getViewAndModelFromRequestByAliasOrId( | Request<{ projectName: string; tableName: string; viewName?: string }> | Request ) { - let project = await Project.getWithInfoByTitle(req.params.projectName); - - if (!project) { - project = await Project.getWithInfo(req.params.projectName); - } + const project = await Project.getWithInfoByTitleOrId(req.params.projectName); const model = await Model.getByAliasOrId({ project_id: project.id, diff --git a/packages/nocodb/src/lib/noco/meta/helpers/extractProjectIdAndAuthenticate.ts b/packages/nocodb/src/lib/noco/meta/helpers/extractProjectIdAndAuthenticate.ts index b30e33bb83..9fcad108da 100644 --- a/packages/nocodb/src/lib/noco/meta/helpers/extractProjectIdAndAuthenticate.ts +++ b/packages/nocodb/src/lib/noco/meta/helpers/extractProjectIdAndAuthenticate.ts @@ -18,7 +18,7 @@ export default async (req, res, next) => { // extract project id based on request path params if (params.projectName) { - const project = await Project.getByTitle(params.projectName); + const project = await Project.getByTitleOrId(params.projectName); req.ncProjectId = project.id; res.locals.project = project; }