Browse Source

Eliminate cloneDeep()

pull/2760/head
Thomas Kaul 2 years ago
parent
commit
fdbfa38cee
  1. 14
      apps/api/src/helper/object.helper.ts
  2. 93
      apps/api/src/interceptors/redact-values-in-response.interceptor.ts

14
apps/api/src/helper/object.helper.ts

@ -32,9 +32,11 @@ export function nullifyValuesInObjects<T>(aObjects: T[], keys: string[]): T[] {
} }
export function redactAttributes({ export function redactAttributes({
isFirstRun = true,
object, object,
options options
}: { }: {
isFirstRun?: boolean;
object: any; object: any;
options: { attribute: string; valueMap: { [key: string]: any } }[]; options: { attribute: string; valueMap: { [key: string]: any } }[];
}): any { }): any {
@ -42,7 +44,10 @@ export function redactAttributes({
return object; return object;
} }
const redactedObject = cloneDeep(object); // Create deep clone
const redactedObject = isFirstRun
? JSON.parse(JSON.stringify(object))
: object;
for (const option of options) { for (const option of options) {
if (redactedObject.hasOwnProperty(option.attribute)) { if (redactedObject.hasOwnProperty(option.attribute)) {
@ -59,7 +64,11 @@ export function redactAttributes({
if (isArray(redactedObject[property])) { if (isArray(redactedObject[property])) {
redactedObject[property] = redactedObject[property].map( redactedObject[property] = redactedObject[property].map(
(currentObject) => { (currentObject) => {
return redactAttributes({ options, object: currentObject }); return redactAttributes({
options,
isFirstRun: false,
object: currentObject
});
} }
); );
} else if ( } else if (
@ -69,6 +78,7 @@ export function redactAttributes({
// Recursively call the function on the nested object // Recursively call the function on the nested object
redactedObject[property] = redactAttributes({ redactedObject[property] = redactAttributes({
options, options,
isFirstRun: false,
object: redactedObject[property] object: redactedObject[property]
}); });
} }

93
apps/api/src/interceptors/redact-values-in-response.interceptor.ts

@ -30,32 +30,28 @@ export class RedactValuesInResponseInterceptor<T>
hasImpersonationId || hasImpersonationId ||
this.userService.isRestrictedView(request.user) this.userService.isRestrictedView(request.user)
) { ) {
const attributes = [
'balance',
'balanceInBaseCurrency',
'comment',
'convertedBalance',
'dividendInBaseCurrency',
'fee',
'feeInBaseCurrency',
'filteredValueInBaseCurrency',
'grossPerformance',
'investment',
'netPerformance',
'quantity',
'symbolMapping',
'totalBalanceInBaseCurrency',
'totalValueInBaseCurrency',
'unitPrice',
'value',
'valueInBaseCurrency'
];
console.time('oldExecutionTime');
data = redactAttributes({ data = redactAttributes({
object: data, object: data,
options: attributes.map((attribute) => { options: [
'balance',
'balanceInBaseCurrency',
'comment',
'convertedBalance',
'dividendInBaseCurrency',
'fee',
'feeInBaseCurrency',
'filteredValueInBaseCurrency',
'grossPerformance',
'investment',
'netPerformance',
'quantity',
'symbolMapping',
'totalBalanceInBaseCurrency',
'totalValueInBaseCurrency',
'unitPrice',
'value',
'valueInBaseCurrency'
].map((attribute) => {
return { return {
attribute, attribute,
valueMap: { valueMap: {
@ -64,59 +60,10 @@ export class RedactValuesInResponseInterceptor<T>
}; };
}) })
}); });
console.timeLog('oldExecutionTime');
data = this.redactObject({
attributes,
data,
valueMap: {
'*': null
}
});
} }
return data; return data;
}) })
); );
} }
private redactObject({
attributes,
data,
valueMap
}: {
attributes: string[];
data: any;
valueMap: { [key: string]: any };
}) {
console.time('newExecutionTime');
// Stringify the JSON object
let jsonString = JSON.stringify(data);
// Nullify occurrences of attributes in the string
for (const attribute of attributes) {
const regex = new RegExp(`"${attribute}"\\s*:\\s*"[^"]*"`, 'g');
if (valueMap['*'] || valueMap['*'] === null) {
jsonString = jsonString.replace(
regex,
`"${attribute}":${valueMap['*']}`
);
} else if (valueMap[attribute]) {
jsonString = jsonString.replace(
regex,
`"${attribute}":${valueMap[attribute]}`
);
}
}
// Transform the stringified JSON back to an object
const transformedObject = JSON.parse(jsonString);
console.timeLog('newExecutionTime');
return transformedObject;
}
} }

Loading…
Cancel
Save