From ea3a9d3b799aed8a87d648850f2289c3901493cd Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 8 May 2022 22:16:47 +0200 Subject: [PATCH] Feature/eliminate circular dependencies in common library (#896) * Eliminate circular dependencies * Update changelog --- CHANGELOG.md | 4 ++++ .../interfaces/portfolio-position-detail.interface.ts | 8 +------- apps/api/src/app/portfolio/portfolio.service.ts | 8 +++----- .../app/symbol/interfaces/symbol-item.interface.ts | 2 +- apps/api/src/app/symbol/symbol.service.ts | 2 +- apps/api/src/app/user/interfaces/access.interface.ts | 4 ---- .../ghostfolio-scraper-api.service.ts | 5 ++--- .../google-sheets/google-sheets.service.ts | 5 ++--- .../rakuten-rapid-api/rakuten-rapid-api.service.ts | 5 ++--- .../yahoo-finance/yahoo-finance.service.ts | 7 +++---- apps/api/src/services/interfaces/interfaces.ts | 11 +---------- .../components/home-market/home-market.component.ts | 7 +++++-- .../app/components/positions/positions.component.ts | 6 +----- .../lib/interfaces/historical-data-item.interface.ts | 6 ++++++ libs/common/src/lib/interfaces/index.ts | 2 ++ .../src/lib/interfaces/portfolio-chart.interface.ts | 2 +- .../lib/interfaces/portfolio-position.interface.ts | 3 +-- libs/common/src/lib/interfaces/position.interface.ts | 2 +- libs/common/src/lib/interfaces/user.interface.ts | 6 ++++-- libs/common/src/lib/types/index.ts | 2 ++ libs/common/src/lib/types/market-state-type.ts | 1 + .../lib/trend-indicator/trend-indicator.component.ts | 3 +-- 22 files changed, 45 insertions(+), 56 deletions(-) delete mode 100644 apps/api/src/app/user/interfaces/access.interface.ts create mode 100644 libs/common/src/lib/interfaces/historical-data-item.interface.ts create mode 100644 libs/common/src/lib/types/market-state-type.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index eac3bba9..98e60c75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Upgraded `Nx` from version `13.8.5` to `14.1.4` - Upgraded `storybook` from version `6.4.18` to `6.4.22` +### Fixed + +- Eliminated the circular dependencies in the `@ghostfolio/common` library + ## 1.145.0 - 07.05.2022 ### Added diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts index 5f2425d7..f400923e 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts @@ -1,4 +1,5 @@ import { EnhancedSymbolProfile } from '@ghostfolio/api/services/interfaces/symbol-profile.interface'; +import { HistoricalDataItem } from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { Tag } from '@prisma/client'; @@ -27,10 +28,3 @@ export interface HistoricalDataContainer { isAllTimeLow: boolean; items: HistoricalDataItem[]; } - -export interface HistoricalDataItem { - averagePrice?: number; - date: string; - grossPerformancePercent?: number; - value: number; -} diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 795f516e..6ffdc94e 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -18,7 +18,6 @@ import { FeeRatioInitialInvestment } from '@ghostfolio/api/models/rules/fees/fee import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; import { ImpersonationService } from '@ghostfolio/api/services/impersonation.service'; -import { MarketState } from '@ghostfolio/api/services/interfaces/interfaces'; import { EnhancedSymbolProfile } from '@ghostfolio/api/services/interfaces/symbol-profile.interface'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; import { @@ -30,6 +29,7 @@ import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { Accounts, Filter, + HistoricalDataItem, PortfolioDetails, PortfolioPerformanceResponse, PortfolioReport, @@ -72,7 +72,6 @@ import { isEmpty, sortBy, uniqBy } from 'lodash'; import { HistoricalDataContainer, - HistoricalDataItem, PortfolioPositionDetail } from './interfaces/portfolio-position-detail.interface'; import { PortfolioCalculator } from './portfolio-calculator'; @@ -777,8 +776,7 @@ export class PortfolioService { position.grossPerformancePercentage?.toNumber() ?? null, investment: new Big(position.investment).toNumber(), marketState: - dataProviderResponses[position.symbol]?.marketState ?? - MarketState.delayed, + dataProviderResponses[position.symbol]?.marketState ?? 'delayed', name: symbolProfileMap[position.symbol].name, netPerformance: position.netPerformance?.toNumber() ?? null, netPerformancePercentage: @@ -1062,7 +1060,7 @@ export class PortfolioService { grossPerformancePercent: 0, investment: convertedBalance, marketPrice: 0, - marketState: MarketState.open, + marketState: 'open', name: account.currency, netPerformance: 0, netPerformancePercent: 0, diff --git a/apps/api/src/app/symbol/interfaces/symbol-item.interface.ts b/apps/api/src/app/symbol/interfaces/symbol-item.interface.ts index 78754790..51ed38d4 100644 --- a/apps/api/src/app/symbol/interfaces/symbol-item.interface.ts +++ b/apps/api/src/app/symbol/interfaces/symbol-item.interface.ts @@ -1,4 +1,4 @@ -import { HistoricalDataItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-position-detail.interface'; +import { HistoricalDataItem } from '@ghostfolio/common/interfaces'; import { DataSource } from '@prisma/client'; export interface SymbolItem { diff --git a/apps/api/src/app/symbol/symbol.service.ts b/apps/api/src/app/symbol/symbol.service.ts index c45f45cd..6cfcbc20 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -1,4 +1,3 @@ -import { HistoricalDataItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-position-detail.interface'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { IDataGatheringItem, @@ -6,6 +5,7 @@ import { } from '@ghostfolio/api/services/interfaces/interfaces'; import { MarketDataService } from '@ghostfolio/api/services/market-data.service'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; +import { HistoricalDataItem } from '@ghostfolio/common/interfaces'; import { Injectable, Logger } from '@nestjs/common'; import { DataSource } from '@prisma/client'; import { format, subDays } from 'date-fns'; diff --git a/apps/api/src/app/user/interfaces/access.interface.ts b/apps/api/src/app/user/interfaces/access.interface.ts deleted file mode 100644 index 33682b0c..00000000 --- a/apps/api/src/app/user/interfaces/access.interface.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface Access { - alias?: string; - id: string; -} diff --git a/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts b/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts index 58ac5de3..f0ee8423 100644 --- a/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts @@ -2,8 +2,7 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.in import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, - IDataProviderResponse, - MarketState + IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; @@ -133,7 +132,7 @@ export class GhostfolioScraperApiService implements DataProviderInterface { marketPrice: marketData.find((marketDataItem) => { return marketDataItem.symbol === symbolProfile.symbol; }).marketPrice, - marketState: MarketState.delayed + marketState: 'delayed' }; } diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index 16e18f52..97022706 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -3,8 +3,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration.ser import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, - IDataProviderResponse, - MarketState + IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service'; @@ -114,7 +113,7 @@ export class GoogleSheetsService implements DataProviderInterface { return symbolProfile.symbol === symbol; })?.currency, dataSource: this.getName(), - marketState: MarketState.delayed + marketState: 'delayed' }; } } diff --git a/apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts b/apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts index 3cb04dfa..baa6591f 100644 --- a/apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts @@ -3,8 +3,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration.ser import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, - IDataProviderResponse, - MarketState + IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma.service'; import { ghostfolioFearAndGreedIndexSymbol } from '@ghostfolio/common/config'; @@ -118,7 +117,7 @@ export class RakutenRapidApiService implements DataProviderInterface { currency: undefined, dataSource: this.getName(), marketPrice: fgi.now.value, - marketState: MarketState.open + marketState: 'open' } }; } diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index 0f0683ac..28c9e854 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -3,8 +3,7 @@ import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/c import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { IDataProviderHistoricalResponse, - IDataProviderResponse, - MarketState + IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { baseCurrency } from '@ghostfolio/common/config'; import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper'; @@ -216,8 +215,8 @@ export class YahooFinanceService implements DataProviderInterface { marketState: quote.marketState === 'REGULAR' || this.cryptocurrencyService.isCryptocurrency(symbol) - ? MarketState.open - : MarketState.closed, + ? 'open' + : 'closed', marketPrice: quote.regularMarketPrice || 0 }; diff --git a/apps/api/src/services/interfaces/interfaces.ts b/apps/api/src/services/interfaces/interfaces.ts index 50fd6009..dbe3dfa4 100644 --- a/apps/api/src/services/interfaces/interfaces.ts +++ b/apps/api/src/services/interfaces/interfaces.ts @@ -1,18 +1,11 @@ +import { MarketState } from '@ghostfolio/common/types'; import { Account, - AssetClass, - AssetSubClass, DataSource, SymbolProfile, Type as TypeOfOrder } from '@prisma/client'; -export const MarketState = { - closed: 'closed', - delayed: 'delayed', - open: 'open' -}; - export interface IOrder { account: Account; currency: string; @@ -44,5 +37,3 @@ export interface IDataGatheringItem { date?: Date; symbol: string; } - -export type MarketState = typeof MarketState[keyof typeof MarketState]; diff --git a/apps/client/src/app/components/home-market/home-market.component.ts b/apps/client/src/app/components/home-market/home-market.component.ts index 12ef7b76..0ea2f594 100644 --- a/apps/client/src/app/components/home-market/home-market.component.ts +++ b/apps/client/src/app/components/home-market/home-market.component.ts @@ -1,10 +1,13 @@ import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { HistoricalDataItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-position-detail.interface'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { ghostfolioFearAndGreedIndexSymbol } from '@ghostfolio/common/config'; import { resetHours } from '@ghostfolio/common/helper'; -import { InfoItem, User } from '@ghostfolio/common/interfaces'; +import { + HistoricalDataItem, + InfoItem, + User +} from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; diff --git a/apps/client/src/app/components/positions/positions.component.ts b/apps/client/src/app/components/positions/positions.component.ts index bbd7dcf3..b3d6bd3c 100644 --- a/apps/client/src/app/components/positions/positions.component.ts +++ b/apps/client/src/app/components/positions/positions.component.ts @@ -5,7 +5,6 @@ import { OnChanges, OnInit } from '@angular/core'; -import { MarketState } from '@ghostfolio/api/services/interfaces/interfaces'; import { Position } from '@ghostfolio/common/interfaces'; @Component({ @@ -42,10 +41,7 @@ export class PositionsComponent implements OnChanges, OnInit { this.positionsWithPriority = []; for (const portfolioPosition of this.positions) { - if ( - portfolioPosition.marketState === MarketState.open || - this.range !== '1d' - ) { + if (portfolioPosition.marketState === 'open' || this.range !== '1d') { // Only show positions where the market is open in today's view this.positionsWithPriority.push(portfolioPosition); } else { diff --git a/libs/common/src/lib/interfaces/historical-data-item.interface.ts b/libs/common/src/lib/interfaces/historical-data-item.interface.ts new file mode 100644 index 00000000..3bb98fdb --- /dev/null +++ b/libs/common/src/lib/interfaces/historical-data-item.interface.ts @@ -0,0 +1,6 @@ +export interface HistoricalDataItem { + averagePrice?: number; + date: string; + grossPerformancePercent?: number; + value: number; +} diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 0b20b8f2..0f483c10 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -9,6 +9,7 @@ import { import { Coupon } from './coupon.interface'; import { Export } from './export.interface'; import { Filter } from './filter.interface'; +import { HistoricalDataItem } from './historical-data-item.interface'; import { InfoItem } from './info-item.interface'; import { PortfolioChart } from './portfolio-chart.interface'; import { PortfolioDetails } from './portfolio-details.interface'; @@ -40,6 +41,7 @@ export { Coupon, Export, Filter, + HistoricalDataItem, InfoItem, PortfolioChart, PortfolioDetails, diff --git a/libs/common/src/lib/interfaces/portfolio-chart.interface.ts b/libs/common/src/lib/interfaces/portfolio-chart.interface.ts index a696fe63..0ed4a8bb 100644 --- a/libs/common/src/lib/interfaces/portfolio-chart.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-chart.interface.ts @@ -1,4 +1,4 @@ -import { HistoricalDataItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-position-detail.interface'; +import { HistoricalDataItem } from './historical-data-item.interface'; export interface PortfolioChart { hasError: boolean; diff --git a/libs/common/src/lib/interfaces/portfolio-position.interface.ts b/libs/common/src/lib/interfaces/portfolio-position.interface.ts index 1b5714a9..703d6a6a 100644 --- a/libs/common/src/lib/interfaces/portfolio-position.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-position.interface.ts @@ -1,7 +1,6 @@ -import { MarketState } from '@ghostfolio/api/services/interfaces/interfaces'; import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; -import { Market } from '../types'; +import { Market, MarketState } from '../types'; import { Country } from './country.interface'; import { Sector } from './sector.interface'; diff --git a/libs/common/src/lib/interfaces/position.interface.ts b/libs/common/src/lib/interfaces/position.interface.ts index a5e3eb93..72b99c37 100644 --- a/libs/common/src/lib/interfaces/position.interface.ts +++ b/libs/common/src/lib/interfaces/position.interface.ts @@ -1,5 +1,5 @@ -import { MarketState } from '@ghostfolio/api/services/interfaces/interfaces'; import { AssetClass, DataSource } from '@prisma/client'; +import { MarketState } from '../types'; export interface Position { assetClass: AssetClass; diff --git a/libs/common/src/lib/interfaces/user.interface.ts b/libs/common/src/lib/interfaces/user.interface.ts index a6bd3dab..b4025954 100644 --- a/libs/common/src/lib/interfaces/user.interface.ts +++ b/libs/common/src/lib/interfaces/user.interface.ts @@ -1,10 +1,12 @@ -import { Access } from '@ghostfolio/api/app/user/interfaces/access.interface'; import { Account, Tag } from '@prisma/client'; import { UserSettings } from './user-settings.interface'; export interface User { - access: Access[]; + access: { + alias?: string; + id: string; + }[]; accounts: Account[]; alias?: string; id: string; diff --git a/libs/common/src/lib/types/index.ts b/libs/common/src/lib/types/index.ts index 40ba5127..7d7050ad 100644 --- a/libs/common/src/lib/types/index.ts +++ b/libs/common/src/lib/types/index.ts @@ -2,6 +2,7 @@ import type { AccessWithGranteeUser } from './access-with-grantee-user.type'; import { AccountWithValue } from './account-with-value.type'; import type { DateRange } from './date-range.type'; import type { Granularity } from './granularity.type'; +import { MarketState } from './market-state-type'; import { Market } from './market.type'; import type { OrderWithAccount } from './order-with-account.type'; import type { RequestWithUser } from './request-with-user.type'; @@ -13,6 +14,7 @@ export type { DateRange, Granularity, Market, + MarketState, OrderWithAccount, RequestWithUser, ToggleOption diff --git a/libs/common/src/lib/types/market-state-type.ts b/libs/common/src/lib/types/market-state-type.ts new file mode 100644 index 00000000..3311507d --- /dev/null +++ b/libs/common/src/lib/types/market-state-type.ts @@ -0,0 +1 @@ +export type MarketState = 'closed' | 'delayed' | 'open'; diff --git a/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts b/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts index 708b27dc..4da6d6c8 100644 --- a/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts +++ b/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts @@ -1,6 +1,5 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { MarketState } from '@ghostfolio/api/services/interfaces/interfaces'; -import { DateRange } from '@ghostfolio/common/types'; +import { DateRange, MarketState } from '@ghostfolio/common/types'; @Component({ selector: 'gf-trend-indicator',