Browse Source

Transform data source (part II)

pull/658/head
Thomas 3 years ago
parent
commit
845b600d7c
  1. 16
      apps/api/src/app/order/order.controller.ts
  2. 8
      apps/api/src/app/symbol/symbol.controller.ts
  3. 18
      apps/api/src/interceptors/transform-data-source-in-request.interceptor.ts
  4. 24
      apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts

16
apps/api/src/app/order/order.controller.ts

@ -1,5 +1,6 @@
import { UserService } from '@ghostfolio/api/app/user/user.service'; import { UserService } from '@ghostfolio/api/app/user/user.service';
import { nullifyValuesInObjects } from '@ghostfolio/api/helper/object.helper'; import { nullifyValuesInObjects } from '@ghostfolio/api/helper/object.helper';
import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor';
import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor';
import { ImpersonationService } from '@ghostfolio/api/services/impersonation.service'; import { ImpersonationService } from '@ghostfolio/api/services/impersonation.service';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
@ -59,8 +60,8 @@ export class OrderController {
} }
@Get() @Get()
@UseInterceptors(TransformDataSourceInResponseInterceptor)
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@UseInterceptors(TransformDataSourceInResponseInterceptor)
public async getAllOrders( public async getAllOrders(
@Headers('impersonation-id') impersonationId @Headers('impersonation-id') impersonationId
): Promise<Activities> { ): Promise<Activities> {
@ -94,19 +95,9 @@ export class OrderController {
return { activities }; return { activities };
} }
@Get(':id')
@UseGuards(AuthGuard('jwt'))
public async getOrderById(@Param('id') id: string): Promise<OrderModel> {
return this.orderService.order({
id_userId: {
id,
userId: this.request.user.id
}
});
}
@Post() @Post()
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@UseInterceptors(TransformDataSourceInRequestInterceptor)
public async createOrder(@Body() data: CreateOrderDto): Promise<OrderModel> { public async createOrder(@Body() data: CreateOrderDto): Promise<OrderModel> {
if ( if (
!hasPermission(this.request.user.permissions, permissions.createOrder) !hasPermission(this.request.user.permissions, permissions.createOrder)
@ -141,6 +132,7 @@ export class OrderController {
@Put(':id') @Put(':id')
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@UseInterceptors(TransformDataSourceInRequestInterceptor)
public async update(@Param('id') id: string, @Body() data: UpdateOrderDto) { public async update(@Param('id') id: string, @Body() data: UpdateOrderDto) {
if ( if (
!hasPermission(this.request.user.permissions, permissions.updateOrder) !hasPermission(this.request.user.permissions, permissions.updateOrder)

8
apps/api/src/app/symbol/symbol.controller.ts

@ -1,3 +1,5 @@
import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor';
import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor';
import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces';
import { import {
Controller, Controller,
@ -5,7 +7,8 @@ import {
HttpException, HttpException,
Param, Param,
Query, Query,
UseGuards UseGuards,
UseInterceptors
} from '@nestjs/common'; } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { DataSource } from '@prisma/client'; import { DataSource } from '@prisma/client';
@ -25,6 +28,7 @@ export class SymbolController {
*/ */
@Get('lookup') @Get('lookup')
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@UseInterceptors(TransformDataSourceInResponseInterceptor)
public async lookupSymbol( public async lookupSymbol(
@Query() { query = '' } @Query() { query = '' }
): Promise<{ items: LookupItem[] }> { ): Promise<{ items: LookupItem[] }> {
@ -43,6 +47,8 @@ export class SymbolController {
*/ */
@Get(':dataSource/:symbol') @Get(':dataSource/:symbol')
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@UseInterceptors(TransformDataSourceInRequestInterceptor)
@UseInterceptors(TransformDataSourceInResponseInterceptor)
public async getSymbolData( public async getSymbolData(
@Param('dataSource') dataSource: DataSource, @Param('dataSource') dataSource: DataSource,
@Param('symbol') symbol: string, @Param('symbol') symbol: string,

18
apps/api/src/interceptors/transform-data-source-in-request.interceptor.ts

@ -23,15 +23,23 @@ export class TransformDataSourceInRequestInterceptor<T>
const request = http.getRequest(); const request = http.getRequest();
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') === true) { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') === true) {
// Decode data source if (request.body.dataSource) {
request.body.dataSource = this.decodeDataSource(
request.body.dataSource
);
}
if (request.params.dataSource) { if (request.params.dataSource) {
request.params.dataSource = Buffer.from( request.params.dataSource = this.decodeDataSource(
request.params.dataSource, request.params.dataSource
'hex' );
).toString();
} }
} }
return next.handle(); return next.handle();
} }
private decodeDataSource(encodeDataSource: string) {
return Buffer.from(encodeDataSource, 'hex').toString();
}
} }

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

@ -28,11 +28,35 @@ export class TransformDataSourceInResponseInterceptor<T>
) { ) {
if (data.activities) { if (data.activities) {
data.activities.map((activity) => { data.activities.map((activity) => {
activity.SymbolProfile.dataSource = this.encodeDataSource(
activity.SymbolProfile.dataSource
);
activity.dataSource = this.encodeDataSource(activity.dataSource); activity.dataSource = this.encodeDataSource(activity.dataSource);
return activity; return activity;
}); });
} }
if (data.dataSource) {
data.dataSource = this.encodeDataSource(data.dataSource);
}
if (data.holdings) {
for (const symbol of Object.keys(data.holdings)) {
if (data.holdings[symbol].dataSource) {
data.holdings[symbol].dataSource = this.encodeDataSource(
data.holdings[symbol].dataSource
);
}
}
}
if (data.items) {
data.items.map((item) => {
item.dataSource = this.encodeDataSource(item.dataSource);
return item;
});
}
if (data.positions) { if (data.positions) {
data.positions.map((position) => { data.positions.map((position) => {
position.dataSource = this.encodeDataSource(position.dataSource); position.dataSource = this.encodeDataSource(position.dataSource);

Loading…
Cancel
Save