Browse Source

Introduce response typings

pull/4604/head
Thomas Kaul 4 months ago
parent
commit
c95a847700
  1. 13
      apps/api/src/app/endpoints/watchlist/watchlist.controller.ts
  2. 4
      apps/api/src/app/endpoints/watchlist/watchlist.service.ts
  3. 7
      apps/client/src/app/services/data.service.ts
  4. 2
      libs/common/src/lib/interfaces/index.ts
  5. 5
      libs/common/src/lib/interfaces/responses/watchlist-response.interface.ts

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

@ -2,6 +2,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat
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 { 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 { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor';
import { WatchlistResponse } 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';
@ -54,7 +55,7 @@ export class WatchlistController {
) { ) {
const watchlistItem = await this.watchlistService const watchlistItem = await this.watchlistService
.getWatchlistItems(this.request.user.id) .getWatchlistItems(this.request.user.id)
.then(({ watchlist }) => { .then((watchlist) => {
return watchlist.find((item) => { return watchlist.find((item) => {
return item.dataSource === dataSource && item.symbol === symbol; return item.dataSource === dataSource && item.symbol === symbol;
}); });
@ -78,7 +79,13 @@ export class WatchlistController {
@HasPermission(permissions.readWatchlist) @HasPermission(permissions.readWatchlist)
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseGuards(AuthGuard('jwt'), HasPermissionGuard)
@UseInterceptors(TransformDataSourceInResponseInterceptor) @UseInterceptors(TransformDataSourceInResponseInterceptor)
public async getWatchlistItems() { public async getWatchlistItems(): Promise<WatchlistResponse> {
return this.watchlistService.getWatchlistItems(this.request.user.id); const watchlist = await this.watchlistService.getWatchlistItems(
this.request.user.id
);
return {
watchlist
};
} }
} }

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

@ -64,7 +64,7 @@ export class WatchlistService {
public async getWatchlistItems( public async getWatchlistItems(
userId: string userId: string
): Promise<{ watchlist: AssetProfileIdentifier[] }> { ): Promise<AssetProfileIdentifier[]> {
const user = await this.prismaService.user.findUnique({ const user = await this.prismaService.user.findUnique({
select: { select: {
watchlist: { watchlist: {
@ -74,6 +74,6 @@ export class WatchlistService {
where: { id: userId } where: { id: userId }
}); });
return { watchlist: user.watchlist ?? [] }; return user?.watchlist ?? [];
} }
} }

7
apps/client/src/app/services/data.service.ts

@ -45,7 +45,8 @@ import {
PortfolioPerformanceResponse, PortfolioPerformanceResponse,
PortfolioReportResponse, PortfolioReportResponse,
PublicPortfolioResponse, PublicPortfolioResponse,
User User,
WatchlistResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions';
import type { import type {
@ -688,9 +689,7 @@ export class DataService {
} }
public fetchWatchlist() { public fetchWatchlist() {
return this.http.get<{ watchlist: AssetProfileIdentifier[] }>( return this.http.get<WatchlistResponse>('/api/v1/watchlist');
'/api/v1/watchlist'
);
} }
public generateAccessToken(aUserId: string) { public generateAccessToken(aUserId: string) {

2
libs/common/src/lib/interfaces/index.ts

@ -57,6 +57,7 @@ import type { PortfolioPerformanceResponse } from './responses/portfolio-perform
import type { PortfolioReportResponse } from './responses/portfolio-report.interface'; import type { PortfolioReportResponse } from './responses/portfolio-report.interface';
import type { PublicPortfolioResponse } from './responses/public-portfolio-response.interface'; import type { PublicPortfolioResponse } from './responses/public-portfolio-response.interface';
import type { QuotesResponse } from './responses/quotes-response.interface'; import type { QuotesResponse } from './responses/quotes-response.interface';
import type { WatchlistResponse } from './responses/watchlist-response.interface';
import type { ScraperConfiguration } from './scraper-configuration.interface'; import type { ScraperConfiguration } from './scraper-configuration.interface';
import type { Statistics } from './statistics.interface'; import type { Statistics } from './statistics.interface';
import type { SubscriptionOffer } from './subscription-offer.interface'; import type { SubscriptionOffer } from './subscription-offer.interface';
@ -135,5 +136,6 @@ export {
ToggleOption, ToggleOption,
User, User,
UserSettings, UserSettings,
WatchlistResponse,
XRayRulesSettings XRayRulesSettings
}; };

5
libs/common/src/lib/interfaces/responses/watchlist-response.interface.ts

@ -0,0 +1,5 @@
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
export interface WatchlistResponse {
watchlist: AssetProfileIdentifier[];
}
Loading…
Cancel
Save