mirror of
https://github.com/n8n-io/n8n.git
synced 2025-01-12 05:17:28 -08:00
⚡ Before credentials get created or updated check if one with same type and
name already exist
This commit is contained in:
parent
ea82fd36c2
commit
3282acbcf1
|
@ -55,8 +55,10 @@ import {
|
||||||
|
|
||||||
import {
|
import {
|
||||||
FindManyOptions,
|
FindManyOptions,
|
||||||
|
FindOneOptions,
|
||||||
LessThan,
|
LessThan,
|
||||||
LessThanOrEqual,
|
LessThanOrEqual,
|
||||||
|
Not,
|
||||||
} from 'typeorm';
|
} from 'typeorm';
|
||||||
|
|
||||||
import * as parseUrl from 'parseurl';
|
import * as parseUrl from 'parseurl';
|
||||||
|
@ -499,6 +501,19 @@ class App {
|
||||||
throw new Error('No encryption key got found to encrypt the credentials!');
|
throw new Error('No encryption key got found to encrypt the credentials!');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if credentials with the same name and type exist already
|
||||||
|
const findQuery = {
|
||||||
|
where: {
|
||||||
|
name: incomingData.name,
|
||||||
|
type: incomingData.type,
|
||||||
|
},
|
||||||
|
} as FindOneOptions;
|
||||||
|
|
||||||
|
const checkResult = await Db.collections.Credentials!.findOne(findQuery);
|
||||||
|
if (checkResult !== undefined) {
|
||||||
|
throw new ResponseHelper.ReponseError(`Credentials with the same type and name exist already.`, undefined, 400);
|
||||||
|
}
|
||||||
|
|
||||||
// Encrypt the data
|
// Encrypt the data
|
||||||
const credentials = new Credentials(incomingData.name, incomingData.type, incomingData.nodesAccess);
|
const credentials = new Credentials(incomingData.name, incomingData.type, incomingData.nodesAccess);
|
||||||
credentials.setData(incomingData.data, encryptionKey);
|
credentials.setData(incomingData.data, encryptionKey);
|
||||||
|
@ -532,6 +547,20 @@ class App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if credentials with the same name and type exist already
|
||||||
|
const findQuery = {
|
||||||
|
where: {
|
||||||
|
id: Not(id),
|
||||||
|
name: incomingData.name,
|
||||||
|
type: incomingData.type,
|
||||||
|
},
|
||||||
|
} as FindOneOptions;
|
||||||
|
|
||||||
|
const checkResult = await Db.collections.Credentials!.findOne(findQuery);
|
||||||
|
if (checkResult !== undefined) {
|
||||||
|
throw new ResponseHelper.ReponseError(`Credentials with the same type and name exist already.`, undefined, 400);
|
||||||
|
}
|
||||||
|
|
||||||
const encryptionKey = await UserSettings.getEncryptionKey();
|
const encryptionKey = await UserSettings.getEncryptionKey();
|
||||||
if (encryptionKey === undefined) {
|
if (encryptionKey === undefined) {
|
||||||
throw new Error('No encryption key got found to encrypt the credentials!');
|
throw new Error('No encryption key got found to encrypt the credentials!');
|
||||||
|
|
|
@ -71,6 +71,8 @@ import Vue from 'vue';
|
||||||
|
|
||||||
import { restApi } from '@/components/mixins/restApi';
|
import { restApi } from '@/components/mixins/restApi';
|
||||||
import { nodeHelpers } from '@/components/mixins/nodeHelpers';
|
import { nodeHelpers } from '@/components/mixins/nodeHelpers';
|
||||||
|
import { showMessage } from '@/components/mixins/showMessage';
|
||||||
|
|
||||||
import { ICredentialsDecryptedResponse, IUpdateInformation } from '@/Interface';
|
import { ICredentialsDecryptedResponse, IUpdateInformation } from '@/Interface';
|
||||||
import {
|
import {
|
||||||
CredentialInformation,
|
CredentialInformation,
|
||||||
|
@ -89,6 +91,7 @@ import mixins from 'vue-typed-mixins';
|
||||||
export default mixins(
|
export default mixins(
|
||||||
nodeHelpers,
|
nodeHelpers,
|
||||||
restApi,
|
restApi,
|
||||||
|
showMessage,
|
||||||
).extend({
|
).extend({
|
||||||
name: 'CredentialsInput',
|
name: 'CredentialsInput',
|
||||||
props: [
|
props: [
|
||||||
|
@ -152,7 +155,7 @@ export default mixins(
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
this.propertyValue[name] = parameterData.value;
|
this.propertyValue[name] = parameterData.value;
|
||||||
},
|
},
|
||||||
async createCredentials () {
|
async createCredentials (): Promise<void> {
|
||||||
const nodesAccess = this.nodesAccess.map((nodeType) => {
|
const nodesAccess = this.nodesAccess.map((nodeType) => {
|
||||||
return {
|
return {
|
||||||
nodeType,
|
nodeType,
|
||||||
|
@ -166,7 +169,13 @@ export default mixins(
|
||||||
data: this.propertyValue,
|
data: this.propertyValue,
|
||||||
} as ICredentialsDecrypted;
|
} as ICredentialsDecrypted;
|
||||||
|
|
||||||
const result = await this.restApi().createNewCredentials(newCredentials);
|
let result;
|
||||||
|
try {
|
||||||
|
result = await this.restApi().createNewCredentials(newCredentials);
|
||||||
|
} catch (error) {
|
||||||
|
this.$showError(error, 'Problem Creating Credentials', 'There was a problem creating the credentials:');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Add also to local store
|
// Add also to local store
|
||||||
this.$store.commit('addCredentials', result);
|
this.$store.commit('addCredentials', result);
|
||||||
|
@ -202,7 +211,13 @@ export default mixins(
|
||||||
data: this.propertyValue,
|
data: this.propertyValue,
|
||||||
} as ICredentialsDecrypted;
|
} as ICredentialsDecrypted;
|
||||||
|
|
||||||
const result = await this.restApi().updateCredentials((this.credentialData as ICredentialsDecryptedResponse).id as string, newCredentials);
|
let result;
|
||||||
|
try {
|
||||||
|
result = await this.restApi().updateCredentials((this.credentialData as ICredentialsDecryptedResponse).id as string, newCredentials);
|
||||||
|
} catch (error) {
|
||||||
|
this.$showError(error, 'Problem Updating Credentials', 'There was a problem updating the credentials:');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Update also in local store
|
// Update also in local store
|
||||||
this.$store.commit('updateCredentials', result);
|
this.$store.commit('updateCredentials', result);
|
||||||
|
|
Loading…
Reference in a new issue