Browse Source

Various improvements

pull/4570/head
Thomas Kaul 4 months ago
parent
commit
d29ba0153d
  1. 19
      apps/api/src/app/endpoints/watchlist/watchlist.controller.ts
  2. 8
      apps/api/src/app/endpoints/watchlist/watchlist.module.ts
  3. 2
      apps/api/src/app/endpoints/watchlist/watchlist.service.ts
  4. 3
      libs/common/src/lib/permissions.ts

19
apps/api/src/app/endpoints/watchlist/watchlist.controller.ts

@ -1,5 +1,7 @@
import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator';
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard';
import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor';
import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import { permissions } from '@ghostfolio/common/permissions'; import { permissions } from '@ghostfolio/common/permissions';
import { RequestWithUser } from '@ghostfolio/common/types'; import { RequestWithUser } from '@ghostfolio/common/types';
@ -13,10 +15,12 @@ import {
Inject, Inject,
Param, Param,
Post, Post,
UseGuards UseGuards,
UseInterceptors
} from '@nestjs/common'; } from '@nestjs/common';
import { REQUEST } from '@nestjs/core'; import { REQUEST } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { DataSource } from '@prisma/client';
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { CreateWatchlistItemDto } from './create-watchlist-item.dto'; import { CreateWatchlistItemDto } from './create-watchlist-item.dto';
@ -32,6 +36,7 @@ export class WatchlistController {
@Post() @Post()
@HasPermission(permissions.createWatchlistItem) @HasPermission(permissions.createWatchlistItem)
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@UseInterceptors(TransformDataSourceInRequestInterceptor)
public async createWatchlistItem(@Body() data: CreateWatchlistItemDto) { public async createWatchlistItem(@Body() data: CreateWatchlistItemDto) {
return this.watchlistService.createWatchlistItem({ return this.watchlistService.createWatchlistItem({
dataSource: data.dataSource, dataSource: data.dataSource,
@ -43,16 +48,17 @@ export class WatchlistController {
@Delete(':dataSource/:symbol') @Delete(':dataSource/:symbol')
@HasPermission(permissions.deleteWatchlistItem) @HasPermission(permissions.deleteWatchlistItem)
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
@UseInterceptors(TransformDataSourceInRequestInterceptor)
public async deleteWatchlistItem( public async deleteWatchlistItem(
@Param('dataSource') dataSource: string, @Param('dataSource') dataSource: DataSource,
@Param('symbol') symbol: string @Param('symbol') symbol: string
) { ) {
const watchlistItem = await this.watchlistService const watchlistItem = await this.watchlistService
.getWatchlistItems(this.request.user.id) .getWatchlistItems(this.request.user.id)
.then((items) => { .then((items) => {
return items.find( return items.find((item) => {
(item) => item.dataSource === dataSource && item.symbol === symbol return item.dataSource === dataSource && item.symbol === symbol;
); });
}); });
if (!watchlistItem) { if (!watchlistItem) {
@ -63,8 +69,8 @@ export class WatchlistController {
} }
return this.watchlistService.deleteWatchlistItem({ return this.watchlistService.deleteWatchlistItem({
dataSource,
symbol, symbol,
dataSource: watchlistItem.dataSource,
userId: this.request.user.id userId: this.request.user.id
}); });
} }
@ -72,6 +78,7 @@ export class WatchlistController {
@Get() @Get()
@HasPermission(permissions.readWatchlist) @HasPermission(permissions.readWatchlist)
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
@UseInterceptors(TransformDataSourceInResponseInterceptor)
public async getWatchlistItems(): Promise<AssetProfileIdentifier[]> { public async getWatchlistItems(): Promise<AssetProfileIdentifier[]> {
return this.watchlistService.getWatchlistItems(this.request.user.id); return this.watchlistService.getWatchlistItems(this.request.user.id);
} }

8
apps/api/src/app/endpoints/watchlist/watchlist.module.ts

@ -1,3 +1,5 @@
import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module';
import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
@ -7,7 +9,11 @@ import { WatchlistService } from './watchlist.service';
@Module({ @Module({
controllers: [WatchlistController], controllers: [WatchlistController],
imports: [PrismaModule], imports: [
TransformDataSourceInRequestModule,
TransformDataSourceInResponseModule,
PrismaModule
],
providers: [WatchlistService] providers: [WatchlistService]
}) })
export class WatchlistModule {} export class WatchlistModule {}

2
apps/api/src/app/endpoints/watchlist/watchlist.service.ts

@ -25,7 +25,7 @@ export class WatchlistService {
if (!symbolProfile) { if (!symbolProfile) {
throw new NotFoundException( throw new NotFoundException(
`Asset profile not found for ${symbol} (${dataSource}).` `Asset profile not found for ${symbol} (${dataSource})`
); );
} }

3
libs/common/src/lib/permissions.ts

@ -106,7 +106,8 @@ export function getPermissions(aRole: Role): string[] {
permissions.accessAssistant, permissions.accessAssistant,
permissions.accessHoldingsChart, permissions.accessHoldingsChart,
permissions.createUserAccount, permissions.createUserAccount,
permissions.readAiPrompt permissions.readAiPrompt,
permissions.readWatchlist
]; ];
case 'USER': case 'USER':

Loading…
Cancel
Save