🐛 Fix issue with overwrites

This commit is contained in:
Jan Oberhauser 2020-09-13 12:35:13 +02:00
parent a2ee2773db
commit 6d8e9b1cd2

View file

@ -11,25 +11,45 @@ import {
class CredentialsOverwritesClass { class CredentialsOverwritesClass {
private credentialTypes = CredentialTypes();
private overwriteData: ICredentialsOverwrite = {}; private overwriteData: ICredentialsOverwrite = {};
private resolvedTypes: string[] = [];
async init(overwriteData?: ICredentialsOverwrite) { async init(overwriteData?: ICredentialsOverwrite) {
if (overwriteData !== undefined) { if (overwriteData !== undefined) {
// If data is already given it can directly be set instead of // If data is already given it can directly be set instead of
// loaded from environment // loaded from environment
this.overwriteData = overwriteData; this.__setData(JSON.parse(JSON.stringify(overwriteData)));
return; return;
} }
const data = await GenericHelpers.getConfigValue('credentials.overwrite.data') as string; const data = await GenericHelpers.getConfigValue('credentials.overwrite.data') as string;
try { try {
this.overwriteData = JSON.parse(data); const overwriteData = JSON.parse(data);
this.__setData(overwriteData);
} catch (error) { } catch (error) {
throw new Error(`The credentials-overwrite is not valid JSON.`); throw new Error(`The credentials-overwrite is not valid JSON.`);
} }
} }
__setData(overwriteData: ICredentialsOverwrite) {
this.overwriteData = overwriteData;
for (const credentialTypeData of this.credentialTypes.getAll()) {
const type = credentialTypeData.name;
const overwrites = this.__getExtended(type);
if (overwrites && Object.keys(overwrites).length) {
this.overwriteData[type] = overwrites;
}
}
}
applyOverwrite(type: string, data: ICredentialDataDecryptedObject) { applyOverwrite(type: string, data: ICredentialDataDecryptedObject) {
const overwrites = this.get(type); const overwrites = this.get(type);
@ -49,30 +69,45 @@ class CredentialsOverwritesClass {
return returnData; return returnData;
} }
get(type: string): ICredentialDataDecryptedObject | undefined {
const credentialTypes = CredentialTypes(); __getExtended(type: string): ICredentialDataDecryptedObject | undefined {
const credentialTypeData = credentialTypes.getByName(type);
if (this.resolvedTypes.includes(type)) {
// Type got already resolved and can so returned directly
return this.overwriteData[type];
}
const credentialTypeData = this.credentialTypes.getByName(type);
if (credentialTypeData === undefined) { if (credentialTypeData === undefined) {
throw new Error(`The credentials of type "${type}" are not known.`); throw new Error(`The credentials of type "${type}" are not known.`);
} }
if (credentialTypeData.extends === undefined) { if (credentialTypeData.extends === undefined) {
this.resolvedTypes.push(type);
return this.overwriteData[type]; return this.overwriteData[type];
} }
const overwrites: ICredentialDataDecryptedObject = {}; const overwrites: ICredentialDataDecryptedObject = {};
for (const credentialsTypeName of credentialTypeData.extends) { for (const credentialsTypeName of credentialTypeData.extends) {
Object.assign(overwrites, this.get(credentialsTypeName)); Object.assign(overwrites, this.__getExtended(credentialsTypeName));
} }
if (this.overwriteData[type] !== undefined) { if (this.overwriteData[type] !== undefined) {
Object.assign(overwrites, this.overwriteData[type]); Object.assign(overwrites, this.overwriteData[type]);
} }
this.resolvedTypes.push(type);
return overwrites; return overwrites;
} }
get(type: string): ICredentialDataDecryptedObject | undefined {
return this.overwriteData[type];
}
getAll(): ICredentialsOverwrite { getAll(): ICredentialsOverwrite {
return this.overwriteData; return this.overwriteData;
} }