UNPKG

n8n

Version:

n8n Workflow Automation Tool

174 lines 8.72 kB
"use strict"; const backend_common_1 = require("@n8n/backend-common"); const db_1 = require("@n8n/db"); const di_1 = require("@n8n/di"); const permissions_1 = require("@n8n/permissions"); const zod_1 = require("zod"); const credential_types_1 = require("../../../../credential-types"); const credentials_service_1 = require("../../../../credentials/credentials.service"); const credentials_service_ee_1 = require("../../../../credentials/credentials.service.ee"); const credentials_helper_1 = require("../../../../credentials-helper"); const credential_not_found_error_1 = require("../../../../errors/credential-not-found.error"); const bad_request_error_1 = require("../../../../errors/response-errors/bad-request.error"); const forbidden_error_1 = require("../../../../errors/response-errors/forbidden.error"); const not_found_error_1 = require("../../../../errors/response-errors/not-found.error"); const credentials_mapper_1 = require("./credentials.mapper"); const credentials_middleware_1 = require("./credentials.middleware"); const credentials_service_2 = require("./credentials.service"); const global_middleware_1 = require("../../shared/middlewares/global.middleware"); const pagination_service_1 = require("../../shared/services/pagination.service"); const credentialsHandlers = { getCredentials: [ (0, global_middleware_1.apiKeyHasScopeWithGlobalScopeFallback)({ scope: 'credential:list' }), global_middleware_1.validCursor, async (req, res) => { const offset = Number(req.query.offset) || 0; const limit = Math.min(Number(req.query.limit) || 100, 250); const repo = di_1.Container.get(db_1.CredentialsRepository); const [credentials, count] = await repo.findAndCount({ take: limit, skip: offset, select: ['id', 'name', 'type', 'createdAt', 'updatedAt'], relations: ['shared', 'shared.project'], order: { createdAt: 'DESC' }, }); const data = credentials.map((credential) => { const shared = (0, credentials_service_2.buildSharedForCredential)(credential); return { id: credential.id, name: credential.name, type: credential.type, createdAt: credential.createdAt, updatedAt: credential.updatedAt, shared, }; }); return res.json({ data, nextCursor: (0, pagination_service_1.encodeNextCursor)({ offset, limit, numberOfTotalRecords: count, }), }); }, ], getCredential: [ (0, global_middleware_1.publicApiScope)('credential:read'), (0, global_middleware_1.projectScope)('credential:read', 'credential'), async (req, res) => { const { id: credentialId } = req.params; const credential = await (0, credentials_service_2.getCredential)(credentialId); if (!credential) { throw new not_found_error_1.NotFoundError('Credential not found'); } return res.json((0, credentials_mapper_1.toPublicApiCredentialResponse)(credential)); }, ], testCredential: [ (0, global_middleware_1.publicApiScope)('credential:read'), (0, global_middleware_1.projectScope)('credential:read', 'credential'), async (req, res) => { const { id: credentialId } = req.params; try { const credentialTestResult = await di_1.Container.get(credentials_service_1.CredentialsService).testById(req.user.id, credentialId); return res.json(credentialTestResult); } catch (error) { if (error instanceof credential_not_found_error_1.CredentialNotFoundError) { throw new not_found_error_1.NotFoundError(error.message); } throw error; } }, ], createCredential: [ credentials_middleware_1.validCredentialType, credentials_middleware_1.validCredentialsProperties, (0, global_middleware_1.publicApiScope)('credential:create'), async (req, res) => { const savedCredential = await (0, credentials_service_2.saveCredential)(req.body, req.user); return res.json(savedCredential); }, ], updateCredential: [ credentials_middleware_1.validCredentialTypeForUpdate, credentials_middleware_1.validCredentialsPropertiesForUpdate, (0, global_middleware_1.publicApiScope)('credential:update'), (0, global_middleware_1.projectScope)('credential:update', 'credential'), async (req, res) => { const { id: credentialId } = req.params; const existingCredential = await (0, credentials_service_2.getCredential)(credentialId); if (!existingCredential) { throw new not_found_error_1.NotFoundError('Credential not found'); } if (req.body.isGlobal !== undefined && req.body.isGlobal !== existingCredential.isGlobal) { if (!di_1.Container.get(backend_common_1.LicenseState).isSharingLicensed()) { throw new forbidden_error_1.ForbiddenError('You are not licensed for sharing credentials'); } const canShareGlobally = (0, permissions_1.hasGlobalScope)(req.user, 'credential:shareGlobally'); if (!canShareGlobally) { throw new forbidden_error_1.ForbiddenError('You do not have permission to change global sharing for credentials'); } } try { const updatedCredential = await (0, credentials_service_2.updateCredential)(existingCredential, req.user, req.body); return res.json((0, credentials_mapper_1.toPublicApiCredentialResponse)(updatedCredential)); } catch (error) { if (error instanceof credentials_service_2.CredentialsIsNotUpdatableError) { throw new bad_request_error_1.BadRequestError(error.message); } throw error; } }, ], transferCredential: [ (0, global_middleware_1.publicApiScope)('credential:move'), (0, global_middleware_1.projectScope)('credential:move', 'credential'), async (req, res) => { const body = zod_1.z.object({ destinationProjectId: zod_1.z.string() }).parse(req.body); await di_1.Container.get(credentials_service_ee_1.EnterpriseCredentialsService).transferOne(req.user, req.params.id, body.destinationProjectId); return res.status(204).send(); }, ], deleteCredential: [ (0, global_middleware_1.publicApiScope)('credential:delete'), (0, global_middleware_1.projectScope)('credential:delete', 'credential'), async (req, res) => { const { id: credentialId } = req.params; let credential; if (!['global:owner', 'global:admin'].includes(req.user.role.slug)) { const shared = await (0, credentials_service_2.getSharedCredentials)(req.user.id, credentialId); if (shared?.role === 'credential:owner') { credential = shared.credentials; } } else { credential = (await (0, credentials_service_2.getCredential)(credentialId)) ?? undefined; } if (!credential) { throw new not_found_error_1.NotFoundError('Not Found'); } await (0, credentials_service_2.removeCredential)(req.user, credential); return res.json((0, credentials_service_2.sanitizeCredentials)(credential)); }, ], getCredentialType: [ async (req, res) => { const { credentialTypeName } = req.params; try { di_1.Container.get(credential_types_1.CredentialTypes).getByName(credentialTypeName); } catch (error) { throw new not_found_error_1.NotFoundError('Not Found'); } const schema = di_1.Container.get(credentials_helper_1.CredentialsHelper) .getCredentialsProperties(credentialTypeName) .filter((property) => property.type !== 'hidden'); return res.json((0, credentials_service_2.toJsonSchema)(schema)); }, ], }; module.exports = credentialsHandlers; //# sourceMappingURL=credentials.handler.js.map