n8n
Version:
n8n Workflow Automation Tool
167 lines • 8.59 kB
JavaScript
"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