From c59da67f6719d7b07fd5db3e28d104c5595a2ff1 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Mon, 25 Apr 2022 11:17:15 +0530 Subject: [PATCH 1/2] 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; } From 0a7e2e9608030c12edc500b4784dbc0d8204c219 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Mon, 25 Apr 2022 15:35:48 +0800 Subject: [PATCH 2/2] fix: use :ref: instead Signed-off-by: Wing-Kam Wong --- .../nocodb/src/lib/noco-models/Project.ts | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/packages/nocodb/src/lib/noco-models/Project.ts b/packages/nocodb/src/lib/noco-models/Project.ts index 33fa34ede0..25d8485e43 100644 --- a/packages/nocodb/src/lib/noco-models/Project.ts +++ b/packages/nocodb/src/lib/noco-models/Project.ts @@ -179,13 +179,16 @@ export default class Project implements ProjectType { // get existing cache const key = `${CacheScope.PROJECT}:${projectId}`; const o = await NocoCache.get(key, CacheGetType.TYPE_OBJECT); - if (o?.uuid) { - await NocoCache.del(`${CacheScope.PROJECT}:${o.uuid}`); - } - if (o) await NocoCache.del(`${CacheScope.PROJECT}:${projectId}`); - - if (o?.title) { + if (o) { + // delete : + await NocoCache.del(`${CacheScope.PROJECT}:${projectId}`); + // delete : await NocoCache.del(`${CacheScope.PROJECT}:${o.title}`); + // delete <scope>:<uuid> + await NocoCache.del(`${CacheScope.PROJECT}:${o.uuid}`); + // delete <scope>:ref:<titleOfId> + await NocoCache.del(`${CacheScope.PROJECT}:ref:${o.title}`); + await NocoCache.del(`${CacheScope.PROJECT}:ref:${o.id}`); } // remove item in cache list @@ -264,12 +267,17 @@ export default class Project implements ProjectType { await base.delete(ncMeta); } const project = await this.get(projectId); - if (project.uuid) { + + if (project) { + // delete <scope>:<uuid> await NocoCache.del(`${CacheScope.PROJECT}:${project.uuid}`); - } - if (project.title) { + // delete <scope>:<title> await NocoCache.del(`${CacheScope.PROJECT}:${project.title}`); + // delete <scope>:ref:<titleOfId> + await NocoCache.del(`${CacheScope.PROJECT}:ref:${project.title}`); + await NocoCache.del(`${CacheScope.PROJECT}:ref:${project.id}`); } + await NocoCache.deepDel( CacheScope.PROJECT, `${CacheScope.PROJECT}:${projectId}`, @@ -328,7 +336,7 @@ export default class Project implements ProjectType { const projectId = titleOrId && (await NocoCache.get( - `${CacheScope.PROJECT}:${titleOrId}`, + `${CacheScope.PROJECT}:ref:${titleOrId}`, CacheGetType.TYPE_OBJECT )); let projectData = null; @@ -357,7 +365,7 @@ export default class Project implements ProjectType { } ); await NocoCache.set( - `${CacheScope.PROJECT}:${titleOrId}`, + `${CacheScope.PROJECT}:ref:${titleOrId}`, projectData?.id ); } else {