Browse Source

Merge pull request #1854 from nocodb/feat/accept-project-id-or-title

feat: accept project id or title in data apis
pull/1870/head
navi 2 years ago committed by GitHub
parent
commit
488eef4080
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 75
      packages/nocodb/src/lib/noco-models/Project.ts
  2. 6
      packages/nocodb/src/lib/noco/meta/api/dataApis/helpers.ts
  3. 2
      packages/nocodb/src/lib/noco/meta/helpers/extractProjectIdAndAuthenticate.ts

75
packages/nocodb/src/lib/noco-models/Project.ts

@ -179,13 +179,16 @@ export default class Project implements ProjectType {
// get existing cache // get existing cache
const key = `${CacheScope.PROJECT}:${projectId}`; const key = `${CacheScope.PROJECT}:${projectId}`;
const o = await NocoCache.get(key, CacheGetType.TYPE_OBJECT); const o = await NocoCache.get(key, CacheGetType.TYPE_OBJECT);
if (o?.uuid) { if (o) {
await NocoCache.del(`${CacheScope.PROJECT}:${o.uuid}`); // delete <scope>:<id>
} await NocoCache.del(`${CacheScope.PROJECT}:${projectId}`);
if (o) await NocoCache.del(`${CacheScope.PROJECT}:${projectId}`); // delete <scope>:<title>
if (o?.title) {
await NocoCache.del(`${CacheScope.PROJECT}:${o.title}`); 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 // remove item in cache list
@ -264,12 +267,17 @@ export default class Project implements ProjectType {
await base.delete(ncMeta); await base.delete(ncMeta);
} }
const project = await this.get(projectId); const project = await this.get(projectId);
if (project.uuid) {
if (project) {
// delete <scope>:<uuid>
await NocoCache.del(`${CacheScope.PROJECT}:${project.uuid}`); await NocoCache.del(`${CacheScope.PROJECT}:${project.uuid}`);
} // delete <scope>:<title>
if (project.title) {
await NocoCache.del(`${CacheScope.PROJECT}:${project.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( await NocoCache.deepDel(
CacheScope.PROJECT, CacheScope.PROJECT,
`${CacheScope.PROJECT}:${projectId}`, `${CacheScope.PROJECT}:${projectId}`,
@ -323,4 +331,53 @@ export default class Project implements ProjectType {
} }
return projectData?.id && this.get(projectData?.id, ncMeta); return projectData?.id && this.get(projectData?.id, ncMeta);
} }
static async getByTitleOrId(titleOrId: string, ncMeta = Noco.ncMeta) {
const projectId =
titleOrId &&
(await NocoCache.get(
`${CacheScope.PROJECT}:ref:${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}:ref:${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;
}
} }

6
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<{ projectName: string; tableName: string; viewName?: string }>
| Request | Request
) { ) {
let project = await Project.getWithInfoByTitle(req.params.projectName); const project = await Project.getWithInfoByTitleOrId(req.params.projectName);
if (!project) {
project = await Project.getWithInfo(req.params.projectName);
}
const model = await Model.getByAliasOrId({ const model = await Model.getByAliasOrId({
project_id: project.id, project_id: project.id,

2
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 // extract project id based on request path params
if (params.projectName) { if (params.projectName) {
const project = await Project.getByTitle(params.projectName); const project = await Project.getByTitleOrId(params.projectName);
req.ncProjectId = project.id; req.ncProjectId = project.id;
res.locals.project = project; res.locals.project = project;
} }

Loading…
Cancel
Save