Browse Source

Simplify data source transformation (#1578)

pull/1577/head^2
Thomas Kaul 2 years ago
committed by GitHub
parent
commit
b5f565c054
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 37
      apps/api/src/helper/object.helper.ts
  2. 75
      apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts

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

@ -27,3 +27,40 @@ export function nullifyValuesInObjects<T>(aObjects: T[], keys: string[]): T[] {
return nullifyValuesInObject(object, keys); return nullifyValuesInObject(object, keys);
}); });
} }
export function redactAttributes({
object,
options
}: {
object: any;
options: { attribute: string; valueMap: { [key: string]: any } }[];
}): any {
if (!object || !options || !options.length) {
return object;
}
const redactedObject = cloneDeep(object);
for (const option of options) {
if (redactedObject.hasOwnProperty(option.attribute)) {
redactedObject[option.attribute] =
option.valueMap[redactedObject[option.attribute]] ??
option.valueMap['*'] ??
redactedObject[option.attribute];
} else {
// If the attribute is not present on the current object,
// check if it exists on any nested objects
for (const property in redactedObject) {
if (typeof redactedObject[property] === 'object') {
// Recursively call the function on the nested object
redactedObject[property] = redactAttributes({
options,
object: redactedObject[property]
});
}
}
}
}
return redactedObject;
}

75
apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts

@ -1,3 +1,4 @@
import { redactAttributes } from '@ghostfolio/api/helper/object.helper';
import { encodeDataSource } from '@ghostfolio/common/helper'; import { encodeDataSource } from '@ghostfolio/common/helper';
import { import {
CallHandler, CallHandler,
@ -5,7 +6,7 @@ import {
Injectable, Injectable,
NestInterceptor NestInterceptor
} from '@nestjs/common'; } from '@nestjs/common';
import { isArray } from 'lodash'; import { DataSource } from '@prisma/client';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
@ -28,63 +29,23 @@ export class TransformDataSourceInResponseInterceptor<T>
if ( if (
this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') === true this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') === true
) { ) {
if (data.activities) { data = redactAttributes({
data.activities.map((activity) => { options: [
activity.SymbolProfile.dataSource = encodeDataSource( {
activity.SymbolProfile.dataSource attribute: 'dataSource',
); valueMap: Object.keys(DataSource).reduce(
return activity; (valueMap, dataSource) => {
}); valueMap[dataSource] = encodeDataSource(
} DataSource[dataSource]
);
if (isArray(data.benchmarks)) { return valueMap;
data.benchmarks.map((benchmark) => { },
benchmark.dataSource = encodeDataSource(benchmark.dataSource); {}
return benchmark; )
});
}
if (data.dataSource) {
data.dataSource = encodeDataSource(data.dataSource);
}
if (data.errors) {
for (const error of data.errors) {
if (error.dataSource) {
error.dataSource = encodeDataSource(error.dataSource);
}
}
}
if (data.holdings) {
for (const symbol of Object.keys(data.holdings)) {
if (data.holdings[symbol].dataSource) {
data.holdings[symbol].dataSource = encodeDataSource(
data.holdings[symbol].dataSource
);
} }
} ],
} object: data
});
if (data.items) {
data.items.map((item) => {
item.dataSource = encodeDataSource(item.dataSource);
return item;
});
}
if (data.positions) {
data.positions.map((position) => {
position.dataSource = encodeDataSource(position.dataSource);
return position;
});
}
if (data.SymbolProfile) {
data.SymbolProfile.dataSource = encodeDataSource(
data.SymbolProfile.dataSource
);
}
} }
return data; return data;

Loading…
Cancel
Save