UNPKG

n8n

Version:

n8n Workflow Automation Tool

167 lines 8.59 kB
"use strict"; const api_types_1 = require("@n8n/api-types"); const di_1 = require("@n8n/di"); const bad_request_error_1 = require("../../../../errors/response-errors/bad-request.error"); const conflict_error_1 = require("../../../../errors/response-errors/conflict.error"); const forbidden_error_1 = require("../../../../errors/response-errors/forbidden.error"); const not_found_error_1 = require("../../../../errors/response-errors/not-found.error"); const data_table_repository_1 = require("../../../../modules/data-table/data-table.repository"); const data_table_service_1 = require("../../../../modules/data-table/data-table.service"); const data_table_name_conflict_error_1 = require("../../../../modules/data-table/errors/data-table-name-conflict.error"); const data_table_not_found_error_1 = require("../../../../modules/data-table/errors/data-table-not-found.error"); const data_table_validation_error_1 = require("../../../../modules/data-table/errors/data-table-validation.error"); const project_service_ee_1 = require("../../../../services/project.service.ee"); const data_tables_service_1 = require("./data-tables.service"); const global_middleware_1 = require("../../shared/middlewares/global.middleware"); const pagination_service_1 = require("../../shared/services/pagination.service"); const handleError = (error) => { if (error instanceof data_table_validation_error_1.DataTableValidationError) { throw new bad_request_error_1.BadRequestError(error.message); } if (error instanceof data_table_not_found_error_1.DataTableNotFoundError) { throw new not_found_error_1.NotFoundError(error.message); } if (error instanceof forbidden_error_1.ForbiddenError) { throw new forbidden_error_1.ForbiddenError(error.message); } if (error instanceof data_table_name_conflict_error_1.DataTableNameConflictError) { throw new conflict_error_1.ConflictError(error.message); } throw error; }; const stringifyQuery = (query) => { const result = {}; for (const [key, value] of Object.entries(query)) { if (value !== undefined && value !== null) { result[key] = String(value); } } return result; }; const dataTableHandlers = { listDataTables: [ (0, global_middleware_1.publicApiScope)('dataTable:list'), global_middleware_1.validCursor, async (req, res) => { try { const payload = api_types_1.PublicApiListDataTableQueryDto.safeParse(stringifyQuery(req.query)); if (!payload.success) { throw new bad_request_error_1.BadRequestError(payload.error.errors[0]?.message || 'Invalid query parameters'); } const { offset, limit, filter, sortBy } = payload.data; const providedFilter = filter ?? {}; const { projectId: requestedProjectId, ...restFilter } = providedFilter; const isGlobalOwnerOrAdmin = ['global:owner', 'global:admin'].includes(req.user.role.slug); if (requestedProjectId && !isGlobalOwnerOrAdmin) { const projectWithScope = await di_1.Container.get(project_service_ee_1.ProjectService).getProjectWithScope(req.user, requestedProjectId, ['dataTable:listProject']); if (!projectWithScope) return res.json({ data: [], nextCursor: null }); } const finalFilter = await (0, data_tables_service_1.getDataTableListFilter)(req.user.id, isGlobalOwnerOrAdmin, requestedProjectId, restFilter); const result = await di_1.Container.get(data_table_service_1.DataTableService).getManyAndCount({ skip: offset, take: limit, filter: finalFilter, sortBy, }); const data = result.data.map(({ project: _project, ...rest }) => rest); return res.json({ data, nextCursor: (0, pagination_service_1.encodeNextCursor)({ offset, limit, numberOfTotalRecords: result.count, }), }); } catch (error) { return handleError(error); } }, ], createDataTable: [ (0, global_middleware_1.publicApiScope)('dataTable:create'), async (req, res) => { const payload = api_types_1.PublicApiCreateDataTableDto.safeParse(req.body); if (!payload.success) { throw new bad_request_error_1.BadRequestError(payload.error.errors[0]?.message || 'Invalid request body'); } const { projectId: requestedProjectId, ...dto } = payload.data; const projectId = await (0, data_tables_service_1.resolveProjectIdForCreate)(req.user, requestedProjectId); try { const result = await di_1.Container.get(data_table_service_1.DataTableService).createDataTable(projectId, dto); const { project: _project, ...dataTable } = result; return res.status(201).json(dataTable); } catch (error) { return handleError(error); } }, ], getDataTable: [ (0, global_middleware_1.publicApiScope)('dataTable:read'), (0, global_middleware_1.projectScope)('dataTable:read', 'dataTable'), async (req, res) => { try { const { dataTableId } = req.params; const projectId = await di_1.Container.get(data_table_service_1.DataTableService).getProjectIdForDataTable(dataTableId); const result = await di_1.Container.get(data_table_repository_1.DataTableRepository).findOne({ where: { id: dataTableId, project: { id: projectId } }, relations: ['project', 'columns'], }); if (!result) { throw new data_table_not_found_error_1.DataTableNotFoundError(dataTableId); } const { project: _project, ...dataTable } = result; return res.json(dataTable); } catch (error) { return handleError(error); } }, ], updateDataTable: [ (0, global_middleware_1.publicApiScope)('dataTable:update'), (0, global_middleware_1.projectScope)('dataTable:update', 'dataTable'), async (req, res) => { try { const { dataTableId } = req.params; const payload = api_types_1.UpdateDataTableDto.safeParse(req.body); if (!payload.success) { throw new bad_request_error_1.BadRequestError(payload.error.errors[0]?.message || 'Invalid request body'); } const projectId = await di_1.Container.get(data_table_service_1.DataTableService).getProjectIdForDataTable(dataTableId); await di_1.Container.get(data_table_service_1.DataTableService).updateDataTable(dataTableId, projectId, payload.data); const result = await di_1.Container.get(data_table_repository_1.DataTableRepository).findOne({ where: { id: dataTableId, project: { id: projectId } }, relations: ['project', 'columns'], }); if (!result) { throw new data_table_not_found_error_1.DataTableNotFoundError(dataTableId); } const { project: _project, ...dataTable } = result; return res.json(dataTable); } catch (error) { return handleError(error); } }, ], deleteDataTable: [ (0, global_middleware_1.publicApiScope)('dataTable:delete'), (0, global_middleware_1.projectScope)('dataTable:delete', 'dataTable'), async (req, res) => { try { const { dataTableId } = req.params; const projectId = await di_1.Container.get(data_table_service_1.DataTableService).getProjectIdForDataTable(dataTableId); await di_1.Container.get(data_table_service_1.DataTableService).deleteDataTable(dataTableId, projectId); return res.status(204).send(); } catch (error) { return handleError(error); } }, ], }; module.exports = dataTableHandlers; //# sourceMappingURL=data-tables.handler.js.map