mirror of https://github.com/nocodb/nocodb
Pranav C
2 years ago
2 changed files with 280 additions and 0 deletions
@ -0,0 +1,169 @@
|
||||
import { Request, Response } from 'express'; |
||||
import { ProjectType } from 'nocodb-sdk'; |
||||
import Project from '../models/Project'; |
||||
import { ProjectListType } from 'nocodb-sdk'; |
||||
import { packageVersion } from '../utils/packageVersion'; |
||||
import { T } from 'nc-help'; |
||||
import { PagedResponseImpl } from '../meta/helpers/PagedResponse'; |
||||
import NcConnectionMgrv2 from '../utils/common/NcConnectionMgrv2'; |
||||
import ncMetaAclMw from '../meta/helpers/ncMetaAclMw'; |
||||
import ProjectUser from '../models/ProjectUser'; |
||||
import Noco from '../Noco'; |
||||
import isDocker from 'is-docker'; |
||||
import { metaApiMetrics } from '../meta/helpers/apiMetrics'; |
||||
import Filter from '../models/Filter'; |
||||
|
||||
import { projectService } from '../services'; |
||||
|
||||
// // Project CRUD
|
||||
|
||||
export async function projectGet( |
||||
req: Request<any, any, any>, |
||||
res: Response<Project> |
||||
) { |
||||
const project = await projectService.getProjectWithInfo({ |
||||
projectId: req.params.projectId, |
||||
}); |
||||
|
||||
projectService.sanitizeProject(project); |
||||
|
||||
res.json(project); |
||||
} |
||||
|
||||
export async function projectUpdate( |
||||
req: Request<any, any, any>, |
||||
res: Response<ProjectListType> |
||||
) { |
||||
const project = await projectService.projectUpdate({ |
||||
projectId: req.params.projectId, |
||||
project: req.body, |
||||
}); |
||||
|
||||
res.json(project); |
||||
} |
||||
|
||||
export async function projectList( |
||||
req: Request<any> & { user: { id: string; roles: string } }, |
||||
res: Response<ProjectListType> |
||||
) { |
||||
const projects = await projectService.projectList({ |
||||
user: req.user, |
||||
query: req.query, |
||||
}); |
||||
|
||||
res.json( |
||||
new PagedResponseImpl(projects as ProjectType[], { |
||||
count: projects.length, |
||||
limit: projects.length, |
||||
}) |
||||
); |
||||
} |
||||
|
||||
export async function projectDelete(req: Request<any>, res: Response<boolean>) { |
||||
const deleted = await projectService.projectSoftDelete({ |
||||
projectId: req.params.projectId, |
||||
}); |
||||
|
||||
res.json(deleted); |
||||
} |
||||
|
||||
async function projectCreate(req: Request<any, any>, res) { |
||||
const project = await projectService.projectCreate({ |
||||
project: req.body, |
||||
user: req['user'], |
||||
}); |
||||
|
||||
res.json(project); |
||||
} |
||||
|
||||
export async function projectInfoGet(_req, res) { |
||||
res.json({ |
||||
Node: process.version, |
||||
Arch: process.arch, |
||||
Platform: process.platform, |
||||
Docker: isDocker(), |
||||
RootDB: Noco.getConfig()?.meta?.db?.client, |
||||
PackageVersion: packageVersion, |
||||
}); |
||||
} |
||||
|
||||
export async function projectCost(req, res) { |
||||
let cost = 0; |
||||
const project = await Project.getWithInfo(req.params.projectId); |
||||
|
||||
for (const base of project.bases) { |
||||
const sqlClient = await NcConnectionMgrv2.getSqlClient(base); |
||||
const userCount = await ProjectUser.getUsersCount(req.query); |
||||
const recordCount = (await sqlClient.totalRecords())?.data.TotalRecords; |
||||
|
||||
if (recordCount > 100000) { |
||||
// 36,000 or $79/user/month
|
||||
cost = Math.max(36000, 948 * userCount); |
||||
} else if (recordCount > 50000) { |
||||
// $36,000 or $50/user/month
|
||||
cost = Math.max(36000, 600 * userCount); |
||||
} else if (recordCount > 10000) { |
||||
// $240/user/yr
|
||||
cost = Math.min(240 * userCount, 36000); |
||||
} else if (recordCount > 1000) { |
||||
// $120/user/yr
|
||||
cost = Math.min(120 * userCount, 36000); |
||||
} |
||||
} |
||||
|
||||
T.event({ |
||||
event: 'a:project:cost', |
||||
data: { |
||||
cost, |
||||
}, |
||||
}); |
||||
|
||||
res.json({ cost }); |
||||
} |
||||
|
||||
export async function hasEmptyOrNullFilters(req, res) { |
||||
res.json(await Filter.hasEmptyOrNullFilters(req.params.projectId)); |
||||
} |
||||
|
||||
export default (router) => { |
||||
router.get( |
||||
'/api/v1/db/meta/projects/:projectId/info', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(projectInfoGet, 'projectInfoGet') |
||||
); |
||||
router.get( |
||||
'/api/v1/db/meta/projects/:projectId', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(projectGet, 'projectGet') |
||||
); |
||||
router.patch( |
||||
'/api/v1/db/meta/projects/:projectId', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(projectUpdate, 'projectUpdate') |
||||
); |
||||
router.get( |
||||
'/api/v1/db/meta/projects/:projectId/cost', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(projectCost, 'projectCost') |
||||
); |
||||
router.delete( |
||||
'/api/v1/db/meta/projects/:projectId', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(projectDelete, 'projectDelete') |
||||
); |
||||
router.post( |
||||
'/api/v1/db/meta/projects', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(projectCreate, 'projectCreate') |
||||
); |
||||
router.get( |
||||
'/api/v1/db/meta/projects', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(projectList, 'projectList') |
||||
); |
||||
router.get( |
||||
'/api/v1/db/meta/projects/:projectId/has-empty-or-null-filters', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(hasEmptyOrNullFilters, 'hasEmptyOrNullFilters') |
||||
); |
||||
}; |
@ -0,0 +1,111 @@
|
||||
import { Request, Response, Router } from 'express'; |
||||
import { TableListType, TableReqType, TableType } from 'nocodb-sdk'; |
||||
import { metaApiMetrics } from '../meta/helpers/apiMetrics'; |
||||
import ncMetaAclMw from '../meta/helpers/ncMetaAclMw'; |
||||
import { PagedResponseImpl } from '../meta/helpers/PagedResponse'; |
||||
import { tableService } from '../services'; |
||||
|
||||
export async function tableList(req: Request, res: Response<TableListType>) { |
||||
res.json( |
||||
new PagedResponseImpl( |
||||
await tableService.getAccessibleTables({ |
||||
projectId: req.params.projectId, |
||||
baseId: req.params.baseId, |
||||
includeM2M: req.query?.includeM2M === 'true', |
||||
roles: (req as any).session?.passport?.user?.roles, |
||||
}) |
||||
) |
||||
); |
||||
} |
||||
|
||||
export async function tableCreate(req: Request<any, any, TableReqType>, res) { |
||||
const result = await tableService.tableCreate({ |
||||
projectId: req.params.projectId, |
||||
baseId: req.params.baseId, |
||||
table: req.body, |
||||
user: (req as any).session?.passport?.user, |
||||
}); |
||||
|
||||
res.json(result); |
||||
} |
||||
|
||||
export async function tableGet(req: Request, res: Response<TableType>) { |
||||
const table = await tableService.getTableWithAccessibleViews({ |
||||
tableId: req.params.tableId, |
||||
user: (req as any).session?.passport?.user, |
||||
}); |
||||
|
||||
res.json(table); |
||||
} |
||||
|
||||
export async function tableDelete(req: Request, res: Response) { |
||||
const result = await tableService.tableDelete({ |
||||
tableId: req.params.tableId, |
||||
user: (req as any).session?.passport?.user, |
||||
req, |
||||
}); |
||||
|
||||
res.json(result); |
||||
} |
||||
|
||||
export async function tableReorder(req: Request, res: Response) { |
||||
res.json( |
||||
await tableService.reorderTable({ |
||||
tableId: req.params.tableId, |
||||
order: req.body.order, |
||||
}) |
||||
); |
||||
} |
||||
|
||||
// todo: move to table service
|
||||
export async function tableUpdate(req: Request<any, any>, res) { |
||||
await tableService.tableUpdate({ |
||||
tableId: req.params.tableId, |
||||
table: req.body, |
||||
projectId: (req as any).ncProjectId, |
||||
}); |
||||
res.json({ msg: 'success' }); |
||||
} |
||||
|
||||
const router = Router({ mergeParams: true }); |
||||
router.get( |
||||
'/api/v1/db/meta/projects/:projectId/tables', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(tableList, 'tableList') |
||||
); |
||||
router.get( |
||||
'/api/v1/db/meta/projects/:projectId/:baseId/tables', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(tableList, 'tableList') |
||||
); |
||||
router.post( |
||||
'/api/v1/db/meta/projects/:projectId/tables', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(tableCreate, 'tableCreate') |
||||
); |
||||
router.post( |
||||
'/api/v1/db/meta/projects/:projectId/:baseId/tables', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(tableCreate, 'tableCreate') |
||||
); |
||||
router.get( |
||||
'/api/v1/db/meta/tables/:tableId', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(tableGet, 'tableGet') |
||||
); |
||||
router.patch( |
||||
'/api/v1/db/meta/tables/:tableId', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(tableUpdate, 'tableUpdate') |
||||
); |
||||
router.delete( |
||||
'/api/v1/db/meta/tables/:tableId', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(tableDelete, 'tableDelete') |
||||
); |
||||
router.post( |
||||
'/api/v1/db/meta/tables/:tableId/reorder', |
||||
metaApiMetrics, |
||||
ncMetaAclMw(tableReorder, 'tableReorder') |
||||
); |
||||
export default router; |
Loading…
Reference in new issue