Browse Source

Fix lint errors

pull/5027/head
Dan 9 months ago
parent
commit
26690ffed6
  1. 4
      apps/api/src/app/admin/admin.service.ts
  2. 53
      apps/api/src/app/portfolio/calculator/constantPortfolioReturn/portfolio-calculator.ts
  3. 1
      apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts
  4. 4
      apps/api/src/app/portfolio/portfolio.controller.ts
  5. 20
      apps/api/src/app/portfolio/portfolio.service.ts
  6. 4
      apps/api/src/helper/dateQueryHelper.ts
  7. 6
      apps/api/src/services/data-provider/data-provider.service.ts
  8. 1
      apps/api/src/services/market-data/market-data.service.ts
  9. 2
      apps/api/src/services/queues/data-gathering/data-gathering.processor.ts
  10. 4
      apps/api/src/services/symbol-profile/symbol-profile-overwrite.service.ts
  11. 4
      apps/client/src/app/components/header/header.component.ts
  12. 2
      apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
  13. 6
      libs/ui/src/lib/assistant/assistant.component.ts

4
apps/api/src/app/admin/admin.service.ts

@ -41,9 +41,7 @@ import {
PrismaClient,
Property,
SymbolProfile,
DataSource,
Tag,
SymbolProfileOverrides
DataSource
} from '@prisma/client';
import { differenceInDays } from 'date-fns';
import { groupBy } from 'lodash';

53
apps/api/src/app/portfolio/calculator/constantPortfolioReturn/portfolio-calculator.ts

@ -7,16 +7,13 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper';
import { DATE_FORMAT, parseDate, resetHours } from '@ghostfolio/common/helper';
import { Filter, HistoricalDataItem } from '@ghostfolio/common/interfaces';
import { DateRange } from '@ghostfolio/common/types';
import { Inject, Logger } from '@nestjs/common';
import { Big } from 'big.js';
import {
addDays,
differenceInDays,
eachDayOfInterval,
endOfDay,
format,
@ -83,19 +80,19 @@ export class CPRPortfolioCalculator extends TWRPortfolioCalculator {
start: Date;
end: Date;
}): Promise<{ chart: HistoricalDataItem[] }> {
let item = await super.getPerformance({
const item = await super.getPerformance({
end,
start
});
let itemResult = item.chart;
let dates = itemResult.map((item) => parseDate(item.date));
let timeWeighted = await this.getTimeWeightedChartData({
const itemResult = item.chart;
const dates = itemResult.map((item) => parseDate(item.date));
const timeWeighted = await this.getTimeWeightedChartData({
dates
});
item.chart = itemResult.map((itemInt) => {
let timeWeightedItem = timeWeighted.find(
const timeWeightedItem = timeWeighted.find(
(timeWeightedItem) => timeWeightedItem.date === itemInt.date
);
if (timeWeightedItem) {
@ -135,20 +132,20 @@ export class CPRPortfolioCalculator extends TWRPortfolioCalculator {
dateQuery: { in: [end] }
});
const endString = format(end, DATE_FORMAT);
let exchangeRates = await Promise.all(
const exchangeRates = await Promise.all(
Object.keys(holdings[endString]).map(async (holding) => {
let symbol = marketMap.values.find((m) => m.symbol === holding);
let symbolCurrency = this.getCurrencyFromActivities(orders, holding);
let exchangeRate = await this.exchangeRateDataService.toCurrencyAtDate(
1,
symbolCurrency,
this.currency,
end
);
const symbolCurrency = this.getCurrencyFromActivities(orders, holding);
const exchangeRate =
await this.exchangeRateDataService.toCurrencyAtDate(
1,
symbolCurrency,
this.currency,
end
);
return { symbolCurrency, exchangeRate };
})
);
let currencyRates = exchangeRates.reduce<{ [currency: string]: number }>(
const currencyRates = exchangeRates.reduce<{ [currency: string]: number }>(
(all, currency): { [currency: string]: number } => {
all[currency.symbolCurrency] ??= currency.exchangeRate;
return all;
@ -156,12 +153,12 @@ export class CPRPortfolioCalculator extends TWRPortfolioCalculator {
{}
);
let totalInvestment = await Object.keys(holdings[endString]).reduce(
const totalInvestment = await Object.keys(holdings[endString]).reduce(
(sum, holding) => {
if (!holdings[endString][holding].toNumber()) {
return sum;
}
let symbol = marketMap.values.find((m) => m.symbol === holding);
const symbol = marketMap.values.find((m) => m.symbol === holding);
if (symbol?.marketPrice === undefined) {
Logger.warn(
@ -170,8 +167,8 @@ export class CPRPortfolioCalculator extends TWRPortfolioCalculator {
);
return sum;
} else {
let symbolCurrency = this.getCurrency(holding);
let price = new Big(currencyRates[symbolCurrency]).mul(
const symbolCurrency = this.getCurrency(holding);
const price = new Big(currencyRates[symbolCurrency]).mul(
symbol.marketPrice
);
return sum.plus(new Big(price).mul(holdings[endString][holding]));
@ -191,7 +188,7 @@ export class CPRPortfolioCalculator extends TWRPortfolioCalculator {
dates = dates.sort((a, b) => a.getTime() - b.getTime());
const start = dates[0];
const end = dates[dates.length - 1];
let marketMapTask = this.computeMarketMap({
const marketMapTask = this.computeMarketMap({
gte: start,
lt: addDays(end, 1)
});
@ -201,7 +198,7 @@ export class CPRPortfolioCalculator extends TWRPortfolioCalculator {
end
);
let data: HistoricalDataItem[] = [];
const data: HistoricalDataItem[] = [];
const startString = format(start, DATE_FORMAT);
data.push({
@ -435,12 +432,12 @@ export class CPRPortfolioCalculator extends TWRPortfolioCalculator {
end: Date
) {
const transactionDates = Object.keys(investmentByDate).sort();
let dates = eachDayOfInterval({ start, end }, { step: 1 })
const dates = eachDayOfInterval({ start, end }, { step: 1 })
.map((date) => {
return resetHours(date);
})
.sort((a, b) => a.getTime() - b.getTime());
let currentHoldings: { [date: string]: { [symbol: string]: Big } } = {};
const currentHoldings: { [date: string]: { [symbol: string]: Big } } = {};
this.calculateInitialHoldings(investmentByDate, start, currentHoldings);
@ -448,7 +445,7 @@ export class CPRPortfolioCalculator extends TWRPortfolioCalculator {
const dateString = format(dates[i], DATE_FORMAT);
const previousDateString = format(dates[i - 1], DATE_FORMAT);
if (transactionDates.some((d) => d === dateString)) {
let holdings = { ...currentHoldings[previousDateString] };
const holdings = { ...currentHoldings[previousDateString] };
investmentByDate[dateString].forEach((trade) => {
holdings[trade.SymbolProfile.symbol] ??= new Big(0);
holdings[trade.SymbolProfile.symbol] = holdings[
@ -488,7 +485,7 @@ export class CPRPortfolioCalculator extends TWRPortfolioCalculator {
for (const symbol of Object.keys(preRangeTrades)) {
const trades: PortfolioOrder[] = preRangeTrades[symbol];
let startQuantity = trades.reduce((sum, trade) => {
const startQuantity = trades.reduce((sum, trade) => {
return sum.plus(trade.quantity.mul(getFactor(trade.type)));
}, new Big(0));
currentHoldings[format(start, DATE_FORMAT)][symbol] = startQuantity;

1
apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts

@ -13,7 +13,6 @@ import { OrderService } from '../../order/order.service';
import { CPRPortfolioCalculator } from './constantPortfolioReturn/portfolio-calculator';
import { MWRPortfolioCalculator } from './mwr/portfolio-calculator';
import { PortfolioCalculator } from './portfolio-calculator';
import { TWRPortfolioCalculator } from './twr/portfolio-calculator';
export enum PerformanceCalculationType {
MWR = 'MWR', // Money-Weighted Rate of Return

4
apps/api/src/app/portfolio/portfolio.controller.ts

@ -84,7 +84,6 @@ export class PortfolioController {
@Query('assetClasses') filterByAssetClasses?: string,
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string,
@Query('isAllocation') isAllocation: boolean = false,
@Query('withMarkets') withMarketsParam = 'false'
): Promise<PortfolioDetails & { hasError: boolean }> {
const withMarkets = withMarketsParam === 'true';
@ -483,8 +482,7 @@ export class PortfolioController {
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string,
@Query('withExcludedAccounts') withExcludedAccounts = false,
@Query('timeWeightedPerformance') calculateTimeWeightedPerformance = false,
@Query('withItems') withItems = false
@Query('timeWeightedPerformance') calculateTimeWeightedPerformance = false
): Promise<PortfolioPerformanceResponse> {
const filters = this.apiService.buildFiltersFromQueryParams({
filterByAccounts,

20
apps/api/src/app/portfolio/portfolio.service.ts

@ -15,7 +15,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/exchange-rate-data.service';
import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service';
import { IDataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import {
getAnnualizedPerformancePercent,
@ -818,23 +817,6 @@ export class PortfolioService {
})
);
// Convert investment, gross and net performance to currency of user
const investment = this.exchangeRateDataService.toCurrency(
position.investment?.toNumber(),
currency,
userCurrency
);
const grossPerformance = this.exchangeRateDataService.toCurrency(
position.grossPerformance?.toNumber(),
currency,
userCurrency
);
const netPerformance = this.exchangeRateDataService.toCurrency(
position.netPerformance?.toNumber(),
currency,
userCurrency
);
const historicalData = await this.dataProviderService.getHistorical(
[{ dataSource, symbol: aSymbol }],
'day',
@ -1899,7 +1881,7 @@ export class PortfolioService {
cashDetailsWithExcludedAccounts.balanceInBaseCurrency
).minus(balanceInBaseCurrency);
let excludedAccountsAndActivities = excludedBalanceInBaseCurrency
const excludedAccountsAndActivities = excludedBalanceInBaseCurrency
.plus(totalOfExcludedActivities)
.toNumber();

4
apps/api/src/helper/dateQueryHelper.ts

@ -13,8 +13,8 @@ export class DateQueryHelper {
let query = dateQuery;
if (dateQuery.in?.length > 0) {
dates = dateQuery.in;
let end = Math.max(...dates.map((d) => d.getTime()));
let start = Math.min(...dates.map((d) => d.getTime()));
const end = Math.max(...dates.map((d) => d.getTime()));
const start = Math.min(...dates.map((d) => d.getTime()));
query = {
gte: resetHours(new Date(start)),
lt: resetHours(addDays(end, 1))

6
apps/api/src/services/data-provider/data-provider.service.ts

@ -475,7 +475,7 @@ export class DataProviderService {
}
response[symbol] = dataProviderResponse;
let quotesCacheTTL =
const quotesCacheTTL =
this.getAppropriateCacheTTL(dataProviderResponse);
this.redisCacheService.set(
@ -573,8 +573,8 @@ export class DataProviderService {
if (dataProviderResponse.dataSource === 'MANUAL') {
quotesCacheTTL = 14400; // 4h Cache for Manual Service
} else if (dataProviderResponse.marketState === 'closed') {
let date = new Date();
let dayOfWeek = date.getDay();
const date = new Date();
const dayOfWeek = date.getDay();
if (dayOfWeek === 0 || dayOfWeek === 6) {
quotesCacheTTL = 14400;
} else if (date.getHours() > 16) {

1
apps/api/src/services/market-data/market-data.service.ts

@ -3,7 +3,6 @@ import { DateQuery } from '@ghostfolio/api/app/portfolio/interfaces/date-query.i
import { DateQueryHelper } from '@ghostfolio/api/helper/dateQueryHelper';
import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { BatchPrismaClient } from '@ghostfolio/common/chunkhelper';
import { resetHours } from '@ghostfolio/common/helper';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';

2
apps/api/src/services/queues/data-gathering/data-gathering.processor.ts

@ -211,7 +211,7 @@ export class DataGatheringProcessor {
step: 1
}
);
dates = dates.filter((d) => !marketData.some((md) => isEqual(md,d)));
dates = dates.filter((d) => !marketData.some((md) => isEqual(md, d)));
const historicalData = await this.dataProviderService.getHistoricalRaw({
dataGatheringItems: [{ dataSource, symbol }],

4
apps/api/src/services/symbol-profile/symbol-profile-overwrite.service.ts

@ -47,7 +47,7 @@ export class SymbolProfileOverwriteService {
Symbol: string,
datasource: DataSource
): Promise<string> {
let SymbolProfileId = await this.prismaService.symbolProfile
const SymbolProfileId = await this.prismaService.symbolProfile
.findFirst({
where: {
symbol: Symbol,
@ -56,7 +56,7 @@ export class SymbolProfileOverwriteService {
})
.then((s) => s.id);
let symbolProfileIdSaved = await this.prismaService.symbolProfileOverrides
const symbolProfileIdSaved = await this.prismaService.symbolProfileOverrides
.findFirst({
where: {
symbolProfileId: SymbolProfileId

4
apps/client/src/app/components/header/header.component.ts

@ -174,9 +174,9 @@ export class HeaderComponent implements OnChanges {
const userSetting: UpdateUserSettingDto = {};
for (const filter of filters) {
let filtersType = this.getFilterType(filter.type);
const filtersType = this.getFilterType(filter.type);
let userFilters = filters
const userFilters = filters
.filter((f) => f.type === filter.type && filter.id)
.map((f) => f.id);

2
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts

@ -15,7 +15,6 @@ import { translate } from '@ghostfolio/ui/i18n';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { SymbolProfile } from '@prisma/client';
import { Big } from 'big.js';
import { differenceInDays } from 'date-fns';
import { isNumber, sortBy } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector';
@ -249,7 +248,6 @@ export class AnalysisPageComponent implements OnDestroy, OnInit {
netPerformanceInPercentageWithCurrencyEffect,
totalInvestmentValueWithCurrencyEffect,
valueInPercentage,
timeWeightedPerformance,
valueWithCurrencyEffect
}
] of chart.entries()) {

6
libs/ui/src/lib/assistant/assistant.component.ts

@ -322,21 +322,21 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
}
public onApplyFilters() {
let accountFilters =
const accountFilters =
this.filterForm
.get('account')
.value?.reduce(
(arr, val) => [...arr, { id: val, type: 'ACCOUNT' }],
[]
) ?? [];
let assetClassFilters =
const assetClassFilters =
this.filterForm
.get('assetClass')
.value?.reduce(
(arr, val) => [...arr, { id: val, type: 'ASSET_CLASS' }],
[]
) ?? [];
let tagFilters =
const tagFilters =
this.filterForm
.get('tag')
.value?.reduce((arr, val) => [...arr, { id: val, type: 'TAG' }], []) ??

Loading…
Cancel
Save