import { VariableListRequestDto } from '@n8n/api-types'; import { Delete, Get, GlobalScope, Licensed, Patch, Post, Query, RestController, } from '@n8n/decorators'; import { BadRequestError } from '@/errors/response-errors/bad-request.error'; import { NotFoundError } from '@/errors/response-errors/not-found.error'; import { VariableCountLimitReachedError } from '@/errors/variable-count-limit-reached.error'; import { VariableValidationError } from '@/errors/variable-validation.error'; import { VariablesRequest } from '@/requests'; import { VariablesService } from './variables.service.ee'; @RestController('/variables') export class VariablesController { constructor(private readonly variablesService: VariablesService) {} @Get('/') @GlobalScope('variable:list') async getVariables(_req: unknown, _res: unknown, @Query query: VariableListRequestDto) { return await this.variablesService.getAllCached(query.state); } @Post('/') @Licensed('feat:variables') @GlobalScope('variable:create') async createVariable(req: VariablesRequest.Create) { const variable = req.body; delete variable.id; try { return await this.variablesService.create(variable); } catch (error) { if (error instanceof VariableCountLimitReachedError) { throw new BadRequestError(error.message); } else if (error instanceof VariableValidationError) { throw new BadRequestError(error.message); } throw error; } } @Get('/:id') @GlobalScope('variable:read') async getVariable(req: VariablesRequest.Get) { const id = req.params.id; const variable = await this.variablesService.getCached(id); if (variable === null) { throw new NotFoundError(`Variable with id ${req.params.id} not found`); } return variable; } @Patch('/:id') @Licensed('feat:variables') @GlobalScope('variable:update') async updateVariable(req: VariablesRequest.Update) { const id = req.params.id; const variable = req.body; delete variable.id; try { return await this.variablesService.update(id, variable); } catch (error) { if (error instanceof VariableCountLimitReachedError) { throw new BadRequestError(error.message); } else if (error instanceof VariableValidationError) { throw new BadRequestError(error.message); } throw error; } } @Delete('/:id') @GlobalScope('variable:delete') async deleteVariable(req: VariablesRequest.Delete) { const id = req.params.id; await this.variablesService.delete(id); return true; } }