Browse Source

Improve data source encoding

pull/7138/head
Thomas Kaul 3 weeks ago
parent
commit
f86594fe75
  1. 61
      apps/api/src/helper/data-source.helper.ts
  2. 6
      apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts

61
apps/api/src/helper/data-source.helper.ts

@ -1,20 +1,57 @@
import { DataSource } from '@prisma/client'; import { DataSource } from '@prisma/client';
import { createHash } from 'node:crypto'; import { createHash } from 'node:crypto';
const decodedDataSourceMap: Record<string, DataSource> = Object.values( const encodedDataSourceByDataSource = new Map<DataSource, string>(
DataSource Object.values(DataSource).map((dataSource) => {
).reduce((map, dataSource) => { return [dataSource, hashDataSource(dataSource)];
map[encodeDataSource(dataSource)] = dataSource; })
);
return map; const dataSourceByEncodedDataSource = new Map<string, DataSource>(
}, {}); [...encodedDataSourceByDataSource].map(([dataSource, encodedDataSource]) => {
return [encodedDataSource, dataSource];
})
);
export function encodeDataSource(aDataSource: DataSource) { /**
if (!aDataSource) { * @deprecated Backward compatibility to support importing data that was
* exported using the previous data source encoding
*/
const dataSourceByDeprecatedEncodedDataSource = new Map<string, DataSource>(
Object.values(DataSource).map((dataSource) => {
return [deprecatedHashDataSource(dataSource), dataSource];
})
);
/**
* @deprecated Backward compatibility (see above)
*/
function deprecatedHashDataSource(dataSource: DataSource) {
return Buffer.from(dataSource, 'utf-8').toString('hex');
}
function hashDataSource(dataSource: DataSource) {
return createHash('sha256').update(dataSource).digest('hex').slice(0, 8);
}
export function decodeDataSource(encodedDataSource: string) {
if (!encodedDataSource) {
return undefined;
}
return (
dataSourceByEncodedDataSource.get(encodedDataSource) ??
dataSourceByDeprecatedEncodedDataSource.get(encodedDataSource) ??
encodedDataSource
);
}
export function encodeDataSource(dataSource: DataSource) {
if (!dataSource) {
return undefined; return undefined;
} }
return createHash('sha256').update(aDataSource).digest('hex').slice(0, 8); return encodedDataSourceByDataSource.get(dataSource);
} }
export function getMaskedGhostfolioDataSource({ export function getMaskedGhostfolioDataSource({
@ -28,9 +65,3 @@ export function getMaskedGhostfolioDataSource({
? DataSource.GHOSTFOLIO ? DataSource.GHOSTFOLIO
: dataSource; : dataSource;
} }
export function decodeDataSource(encodedDataSource: string) {
return encodedDataSource
? decodedDataSourceMap[encodedDataSource]
: undefined;
}

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

@ -53,9 +53,9 @@ export class TransformDataSourceInResponseInterceptor<
return next.handle().pipe( return next.handle().pipe(
map((data: any) => { map((data: any) => {
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {
const valueMap = hasRole(user, 'ADMIN') const valueMap = {
? {} ...(hasRole(user, 'ADMIN') ? {} : this.encodedDataSourceMap)
: this.encodedDataSourceMap; };
if (isExportMode) { if (isExportMode) {
const ghostfolioDataSources = this.configurationService.get( const ghostfolioDataSources = this.configurationService.get(

Loading…
Cancel
Save