Browse Source

Task/split type and symbol imports w/ linter support

Ensure that types are always imported with `import type {}` and actual
symbols used by code have separate definitions.

This useful for style, as well as type stripping where type imports are
erased entirely and symbol imports need to be "clean" from types.
pull/8066/head
Szymon Łągiewka 1 week ago
parent
commit
711f736b95
Failed to extract signature
  1. 2
      apps/api/src/app/account/interfaces/cash-details.interface.ts
  2. 19
      apps/api/src/app/activities/activities.service.spec.ts
  3. 8
      apps/api/src/app/app.module.spec.ts
  4. 4
      apps/api/src/app/auth/interfaces/interfaces.ts
  5. 3
      apps/api/src/app/auth/oidc.strategy.ts
  6. 11
      apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.spec.ts
  7. 7
      apps/api/src/app/endpoints/mcp/mcp.controller.spec.ts
  8. 14
      apps/api/src/app/endpoints/mcp/mcp.service.spec.ts
  9. 2
      apps/api/src/app/endpoints/mcp/mcp.test-utils.ts
  10. 4
      apps/api/src/app/endpoints/mcp/types/activity-to-import.type.ts
  11. 23
      apps/api/src/app/import/import.service.spec.ts
  12. 2
      apps/api/src/app/import/interfaces/asset-profile-to-create.interface.ts
  13. 8
      apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts
  14. 6
      apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts
  15. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
  16. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts
  17. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts
  18. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts
  19. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts
  20. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts
  21. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts
  22. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts
  23. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts
  24. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts
  25. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-with-market-price-between-chart-dates.spec.ts
  26. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts
  27. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts
  28. 5
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts
  29. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts
  30. 16
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
  31. 8
      apps/api/src/app/portfolio/calculator/roi/portfolio-calculator.ts
  32. 8
      apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts
  33. 6
      apps/api/src/app/portfolio/current-rate.service.mock.ts
  34. 16
      apps/api/src/app/portfolio/current-rate.service.spec.ts
  35. 2
      apps/api/src/app/portfolio/interfaces/accumulated-values.interface.ts
  36. 2
      apps/api/src/app/portfolio/interfaces/get-value-object.interface.ts
  37. 7
      apps/api/src/app/portfolio/interfaces/get-values-object.interface.ts
  38. 6
      apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts
  39. 4
      apps/api/src/app/portfolio/interfaces/holding-balance.interface.ts
  40. 2
      apps/api/src/app/portfolio/interfaces/holding-balances-at-date.interface.ts
  41. 4
      apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts
  42. 4
      apps/api/src/app/portfolio/interfaces/holding-valuation-item.interface.ts
  43. 4
      apps/api/src/app/portfolio/interfaces/holding-valuation.interface.ts
  44. 4
      apps/api/src/app/portfolio/interfaces/portfolio-calculator-activity-item.interface.ts
  45. 2
      apps/api/src/app/portfolio/interfaces/portfolio-calculator-activity.interface.ts
  46. 2
      apps/api/src/app/portfolio/interfaces/portfolio-calculator-holding.interface.ts
  47. 11
      apps/api/src/app/portfolio/portfolio.service.spec.ts
  48. 2
      apps/api/src/app/portfolio/types/performance-percentages.type.ts
  49. 4
      apps/api/src/app/redis-cache/redis-cache.service.mock.ts
  50. 2
      apps/api/src/decorators/impersonation.decorator.ts
  51. 2
      apps/api/src/decorators/requires-scope-of-access.decorator.ts
  52. 2
      apps/api/src/decorators/requires-scope.decorator.ts
  53. 2
      apps/api/src/events/asset-profile-changed.event.ts
  54. 5
      apps/api/src/guards/impersonation-write.guard.spec.ts
  55. 2
      apps/api/src/guards/impersonation.guard.spec.ts
  56. 6
      apps/api/src/guards/oauth-callback.guard.ts
  57. 5
      apps/api/src/guards/scope.guard.spec.ts
  58. 2
      apps/api/src/helper/account.helper.ts
  59. 2
      apps/api/src/helper/activity.helper.ts
  60. 2
      apps/api/src/helper/data-source.helper.spec.ts
  61. 5
      apps/api/src/helper/data-source.helper.ts
  62. 2
      apps/api/src/helper/execution-context.helper.ts
  63. 2
      apps/api/src/helper/interfaces/table-parameters.interface.ts
  64. 2
      apps/api/src/helper/markdown-table.helper.spec.ts
  65. 2
      apps/api/src/helper/markdown-table.helper.ts
  66. 2
      apps/api/src/helper/object.helper.spec.ts
  67. 4
      apps/api/src/helper/portfolio.helper.ts
  68. 2
      apps/api/src/helper/redis.helper.ts
  69. 2
      apps/api/src/helper/sector.helper.ts
  70. 2
      apps/api/src/helper/security-headers.helper.spec.ts
  71. 2
      apps/api/src/helper/security-headers.helper.ts
  72. 7
      apps/api/src/main.ts
  73. 2
      apps/api/src/middlewares/language-redirect.middleware.ts
  74. 4
      apps/api/src/middlewares/mcp-authorization.middleware.ts
  75. 4
      apps/api/src/models/interfaces/rule.interface.ts
  76. 10
      apps/api/src/models/rule.ts
  77. 13
      apps/api/src/models/rules/account-cluster-risk/current-investment.ts
  78. 9
      apps/api/src/models/rules/account-cluster-risk/single-account.ts
  79. 9
      apps/api/src/models/rules/asset-class-cluster-risk/equity.ts
  80. 9
      apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts
  81. 9
      apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
  82. 9
      apps/api/src/models/rules/currency-cluster-risk/current-investment.ts
  83. 6
      apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts
  84. 6
      apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts
  85. 6
      apps/api/src/models/rules/emergency-fund/emergency-fund-coverage.ts
  86. 6
      apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts
  87. 6
      apps/api/src/models/rules/fees/fee-ratio-total-investment-volume.ts
  88. 6
      apps/api/src/models/rules/liquidity/buying-power.ts
  89. 6
      apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts
  90. 6
      apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts
  91. 6
      apps/api/src/models/rules/regional-market-cluster-risk/europe.ts
  92. 2
      apps/api/src/models/rules/regional-market-cluster-risk/interfaces/rule-settings.interface.ts
  93. 6
      apps/api/src/models/rules/regional-market-cluster-risk/japan.ts
  94. 6
      apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts
  95. 6
      apps/api/src/models/rules/rule-settings.ts
  96. 2
      apps/api/src/models/types/x-ray-rule-key.type.ts
  97. 5
      apps/api/src/services/asset-profile-split/asset-profile-split.helper.spec.ts
  98. 4
      apps/api/src/services/asset-profile-split/asset-profile-split.helper.ts
  99. 5
      apps/api/src/services/asset-profile-split/asset-profile-split.service.spec.ts
  100. 2
      apps/api/src/services/benchmark/interfaces/benchmark-value.interface.ts

2
apps/api/src/app/account/interfaces/cash-details.interface.ts

@ -1,4 +1,4 @@
import { AccountWithBalance } from '@ghostfolio/common/types';
import type { AccountWithBalance } from '@ghostfolio/common/types';
export interface CashDetails {
accounts: AccountWithBalance[];

19
apps/api/src/app/activities/activities.service.spec.ts

@ -1,25 +1,22 @@
import { AccountService } from '@ghostfolio/api/app/account/account.service';
import type { AccountService } from '@ghostfolio/api/app/account/account.service';
import {
activityDummyData,
assetProfileDummyData
} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
import { WHERE_ACTIVITY_NOT_DRAFT } from '@ghostfolio/api/helper/activity.helper';
import { AssetProfileSplitService } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import type { AssetProfileSplitService } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.service';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import type { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import {
INVESTMENT_ACTIVITY_TYPES,
NON_INVESTMENT_ACTIVITY_TYPES
} from '@ghostfolio/common/config';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity, Filter } from '@ghostfolio/common/interfaces';
import type { Activity, Filter } from '@ghostfolio/common/interfaces';
import {
AssetProfileSplit,
DataSource,
Type as ActivityType
} from '@prisma/client';
import type { AssetProfileSplit } from '@prisma/client';
import { DataSource, Type as ActivityType } from '@prisma/client';
import { Big } from 'big.js';
import { ActivitiesService } from './activities.service';

8
apps/api/src/app/app.module.spec.ts

@ -1,9 +1,5 @@
import {
DynamicModule,
ForwardReference,
RequestMethod,
Type
} from '@nestjs/common';
import type { DynamicModule, ForwardReference, Type } from '@nestjs/common';
import { RequestMethod } from '@nestjs/common';
import {
GUARDS_METADATA,
METHOD_METADATA,

4
apps/api/src/app/auth/interfaces/interfaces.ts

@ -1,6 +1,6 @@
import { AuthDeviceDto } from '@ghostfolio/common/dtos';
import type { AuthDeviceDto } from '@ghostfolio/common/dtos';
import { Provider } from '@prisma/client';
import type { Provider } from '@prisma/client';
export interface AuthDeviceDialogParams {
authDevice: AuthDeviceDto;

3
apps/api/src/app/auth/oidc.strategy.ts

@ -2,7 +2,8 @@ import { Injectable, Logger } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Provider } from '@prisma/client';
import { Request } from 'express';
import { Strategy, type StrategyOptions } from 'passport-openidconnect';
import { Strategy } from 'passport-openidconnect';
import type { StrategyOptions } from 'passport-openidconnect';
import { AuthService } from './auth.service';
import {

11
apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.spec.ts

@ -1,11 +1,12 @@
import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service';
import type { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service';
import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.event';
import { AssetProfileSplitService } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.service';
import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import type { AssetProfileSplitService } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.service';
import type { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import { NotFoundException } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { AssetProfileSplit, DataSource } from '@prisma/client';
import type { EventEmitter2 } from '@nestjs/event-emitter';
import type { AssetProfileSplit } from '@prisma/client';
import { DataSource } from '@prisma/client';
import { AssetProfilesService } from './asset-profiles.service';

7
apps/api/src/app/endpoints/mcp/mcp.controller.spec.ts

@ -2,10 +2,10 @@ import { REQUIRES_SCOPE_KEY } from '@ghostfolio/api/decorators/requires-scope.de
import { McpToolExceptionFilter } from '@ghostfolio/api/filters/mcp-tool-exception.filter';
import { AccessGuard } from '@ghostfolio/api/guards/access.guard';
import { getMcpUserOfBearerToken } from '@ghostfolio/api/helper/bearer-token.helper';
import type { Scope } from '@ghostfolio/common/scopes';
import {
getScopesOfAccess,
getScopesOfAccessLevel,
Scope,
scopes
} from '@ghostfolio/common/scopes';
@ -13,13 +13,12 @@ import {
EXCEPTION_FILTERS_METADATA,
GUARDS_METADATA
} from '@nestjs/common/constants';
import type { AccessMatchMode, ToolMetadata } from '@rekog/mcp-nest';
import {
AccessMatchMode,
MCP_SCOPES_MATCH_METADATA_KEY,
MCP_SCOPES_METADATA_KEY,
MCP_TOOL_METADATA_KEY,
ToolAuthorizationService,
ToolMetadata
ToolAuthorizationService
} from '@rekog/mcp-nest';
import { GhostfolioMcpController } from './mcp.controller';

14
apps/api/src/app/endpoints/mcp/mcp.service.spec.ts

@ -1,16 +1,16 @@
import { ImportValidationError } from '@ghostfolio/api/app/import/errors/import-validation.error';
import { ImportService } from '@ghostfolio/api/app/import/import.service';
import { SymbolService } from '@ghostfolio/api/app/symbol/symbol.service';
import { UserService } from '@ghostfolio/api/app/user/user.service';
import type { ImportService } from '@ghostfolio/api/app/import/import.service';
import type { SymbolService } from '@ghostfolio/api/app/symbol/symbol.service';
import type { UserService } from '@ghostfolio/api/app/user/user.service';
import { encodeDataSource } from '@ghostfolio/api/helper/data-source.helper';
import { ApiService } from '@ghostfolio/api/services/api/api.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { PortfolioTableService } from '@ghostfolio/api/services/portfolio-table/portfolio-table.service';
import type { ApiService } from '@ghostfolio/api/services/api/api.service';
import type { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import type { PortfolioTableService } from '@ghostfolio/api/services/portfolio-table/portfolio-table.service';
import {
DEFAULT_LANGUAGE_CODE,
MCP_MAX_ACTIVITIES
} from '@ghostfolio/common/config';
import { Activity, Filter } from '@ghostfolio/common/interfaces';
import type { Activity, Filter } from '@ghostfolio/common/interfaces';
import { permissions } from '@ghostfolio/common/permissions';
import type { UserWithSettings } from '@ghostfolio/common/types';

2
apps/api/src/app/endpoints/mcp/mcp.test-utils.ts

@ -1,6 +1,6 @@
import { Type as ActivityType } from '@prisma/client';
import { ActivityToImport } from './types/activity-to-import.type';
import type { ActivityToImport } from './types/activity-to-import.type';
export function createActivity(
overrides: Partial<ActivityToImport> = {}

4
apps/api/src/app/endpoints/mcp/types/activity-to-import.type.ts

@ -1,6 +1,6 @@
import { z } from 'zod';
import type { z } from 'zod';
import { IMPORT_ACTIVITIES_PARAMETERS } from '../mcp.schemas';
import type { IMPORT_ACTIVITIES_PARAMETERS } from '../mcp.schemas';
export type ActivityToImport = z.infer<
typeof IMPORT_ACTIVITIES_PARAMETERS

23
apps/api/src/app/import/import.service.spec.ts

@ -1,20 +1,21 @@
import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
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 { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import { TagService } from '@ghostfolio/api/services/tag/tag.service';
import type { AccountService } from '@ghostfolio/api/app/account/account.service';
import type { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service';
import type { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import type { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import type { TagService } from '@ghostfolio/api/services/tag/tag.service';
import { NON_INVESTMENT_ACTIVITY_TYPES } from '@ghostfolio/common/config';
import { CreateOrderDto } from '@ghostfolio/common/dtos';
import type { CreateOrderDto } from '@ghostfolio/common/dtos';
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
import {
import type {
Activity,
AssetProfileIdentifier
} from '@ghostfolio/common/interfaces';
import { UserWithSettings } from '@ghostfolio/common/types';
import type { UserWithSettings } from '@ghostfolio/common/types';
import { DataSource, SymbolProfile } from '@prisma/client';
import type { SymbolProfile } from '@prisma/client';
import { DataSource } from '@prisma/client';
import { parseISO } from 'date-fns';
import { ImportService } from './import.service';

2
apps/api/src/app/import/interfaces/asset-profile-to-create.interface.ts

@ -1,4 +1,4 @@
import { Prisma } from '@prisma/client';
import type { Prisma } from '@prisma/client';
export interface AssetProfileToCreate {
assetProfile: Prisma.SymbolProfileCreateInput;

8
apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts

@ -1,8 +1,8 @@
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface';
import { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import { PortfolioSnapshot } from '@ghostfolio/common/models';
import type { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface';
import type { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type';
import type { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import type { PortfolioSnapshot } from '@ghostfolio/common/models';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
export class MwrPortfolioCalculator extends PortfolioCalculator {

6
apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts

@ -1,12 +1,12 @@
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import type { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper';
import { parseDate } from '@ghostfolio/common/helper';
import {
import type {
Activity,
ExportResponse,
HistoricalDataItem
} from '@ghostfolio/common/interfaces';
import { DateRange } from '@ghostfolio/common/types';
import type { DateRange } from '@ghostfolio/common/types';
import { readFileSync } from 'node:fs';
import { join } from 'node:path';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts

@ -13,7 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts

@ -15,7 +15,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import type { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts

@ -14,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import type { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-before-first-market-price.spec.ts

@ -13,7 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {

4
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts

@ -11,7 +11,7 @@ import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.s
import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock';
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock';
import { AssetProfileSplitService } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.service';
import type { AssetProfileSplitService } from '@ghostfolio/api/services/asset-profile-split/asset-profile-split.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
@ -19,7 +19,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { PortfolioSnapshotHolding } from '@ghostfolio/common/models';
import type { PortfolioSnapshotHolding } from '@ghostfolio/common/models';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { DataSource } from '@prisma/client';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts

@ -13,7 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts

@ -14,7 +14,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-fee-and-dividend.spec.ts

@ -14,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts

@ -13,7 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-before-first-market-price.spec.ts

@ -13,7 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-manual-buy-with-market-price-between-chart-dates.spec.ts

@ -13,7 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts

@ -13,7 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-from-two-data-sources.spec.ts

@ -14,7 +14,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

5
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts

@ -14,10 +14,11 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { AssetProfileSplit, DataSource } from '@prisma/client';
import type { AssetProfileSplit } from '@prisma/client';
import { DataSource } from '@prisma/client';
import { Big } from 'big.js';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts

@ -13,7 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

16
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts

@ -1,9 +1,9 @@
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import { AccumulatedValues } from '@ghostfolio/api/app/portfolio/interfaces/accumulated-values.interface';
import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface';
import { PortfolioCalculatorActivityItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-activity-item.interface';
import { PortfolioCalculatorHolding } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-holding.interface';
import { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type';
import type { AccumulatedValues } from '@ghostfolio/api/app/portfolio/interfaces/accumulated-values.interface';
import type { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface';
import type { PortfolioCalculatorActivityItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-activity-item.interface';
import type { PortfolioCalculatorHolding } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-calculator-holding.interface';
import type { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type';
import {
getAnnualizedPerformancePercent,
getIntervalFromDateRange
@ -13,15 +13,15 @@ import {
getAssetProfileIdentifier,
parseDate
} from '@ghostfolio/common/helper';
import {
import type {
AssetProfileIdentifier,
HistoricalDataItem
} from '@ghostfolio/common/interfaces';
import {
import type {
PortfolioSnapshot,
PortfolioSnapshotHolding
} from '@ghostfolio/common/models';
import { DateRange } from '@ghostfolio/common/types';
import type { DateRange } from '@ghostfolio/common/types';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js';

8
apps/api/src/app/portfolio/calculator/roi/portfolio-calculator.ts

@ -1,8 +1,8 @@
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface';
import { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import { PortfolioSnapshot } from '@ghostfolio/common/models';
import type { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface';
import type { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type';
import type { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import type { PortfolioSnapshot } from '@ghostfolio/common/models';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
export class RoiPortfolioCalculator extends PortfolioCalculator {

8
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts

@ -1,8 +1,8 @@
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface';
import { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import { PortfolioSnapshot } from '@ghostfolio/common/models';
import type { HoldingPerformance } from '@ghostfolio/api/app/portfolio/interfaces/holding-performance.interface';
import type { PerformancePercentages } from '@ghostfolio/api/app/portfolio/types/performance-percentages.type';
import type { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import type { PortfolioSnapshot } from '@ghostfolio/common/models';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
export class TwrPortfolioCalculator extends PortfolioCalculator {

6
apps/api/src/app/portfolio/current-rate.service.mock.ts

@ -9,9 +9,9 @@ import {
isSameDay
} from 'date-fns';
import { GetValueObject } from './interfaces/get-value-object.interface';
import { GetValuesObject } from './interfaces/get-values-object.interface';
import { GetValuesParams } from './interfaces/get-values-params.interface';
import type { GetValueObject } from './interfaces/get-value-object.interface';
import type { GetValuesObject } from './interfaces/get-values-object.interface';
import type { GetValuesParams } from './interfaces/get-values-params.interface';
function mockGetValue({
dataSource,

16
apps/api/src/app/portfolio/current-rate.service.spec.ts

@ -1,21 +1,17 @@
import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service';
import type { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { resetHours } from '@ghostfolio/common/helper';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import type { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import {
DataSource,
MarketData,
Order,
Type as ActivityType
} from '@prisma/client';
import type { MarketData, Order } from '@prisma/client';
import { DataSource, Type as ActivityType } from '@prisma/client';
import { addDays, subDays } from 'date-fns';
import { CurrentRateService } from './current-rate.service';
import { DateQuery } from './interfaces/date-query.interface';
import { GetValuesObject } from './interfaces/get-values-object.interface';
import type { DateQuery } from './interfaces/date-query.interface';
import type { GetValuesObject } from './interfaces/get-values-object.interface';
jest.mock('@ghostfolio/api/services/market-data/market-data.service', () => {
return {

2
apps/api/src/app/portfolio/interfaces/accumulated-values.interface.ts

@ -1,4 +1,4 @@
import { Big } from 'big.js';
import type { Big } from 'big.js';
export interface AccumulatedValues {
investmentValueWithCurrencyEffect: Big;

2
apps/api/src/app/portfolio/interfaces/get-value-object.interface.ts

@ -1,4 +1,4 @@
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import type { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
export interface GetValueObject extends AssetProfileIdentifier {
date: Date;

7
apps/api/src/app/portfolio/interfaces/get-values-object.interface.ts

@ -1,6 +1,9 @@
import { DataProviderInfo, ResponseError } from '@ghostfolio/common/interfaces';
import type {
DataProviderInfo,
ResponseError
} from '@ghostfolio/common/interfaces';
import { GetValueObject } from './get-value-object.interface';
import type { GetValueObject } from './get-value-object.interface';
export interface GetValuesObject {
dataProviderInfos: DataProviderInfo[];

6
apps/api/src/app/portfolio/interfaces/get-values-params.interface.ts

@ -1,7 +1,7 @@
import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import { SubscriptionType } from '@ghostfolio/common/enums';
import type { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import type { SubscriptionType } from '@ghostfolio/common/enums';
import { DateQuery } from './date-query.interface';
import type { DateQuery } from './date-query.interface';
export interface GetValuesParams {
dataGatheringItems: DataGatheringItem[];

4
apps/api/src/app/portfolio/interfaces/holding-balance.interface.ts

@ -1,5 +1,5 @@
import { AssetSubClass, DataSource, Tag } from '@prisma/client';
import { Big } from 'big.js';
import type { AssetSubClass, DataSource, Tag } from '@prisma/client';
import type { Big } from 'big.js';
export interface HoldingBalance {
activitiesCount: number;

2
apps/api/src/app/portfolio/interfaces/holding-balances-at-date.interface.ts

@ -1,4 +1,4 @@
import { HoldingBalance } from './holding-balance.interface';
import type { HoldingBalance } from './holding-balance.interface';
export interface HoldingBalancesAtDate {
date: string;

4
apps/api/src/app/portfolio/interfaces/holding-performance.interface.ts

@ -1,6 +1,6 @@
import { DateRange } from '@ghostfolio/common/types';
import type { DateRange } from '@ghostfolio/common/types';
import { Big } from 'big.js';
import type { Big } from 'big.js';
export interface HoldingPerformance {
averageInvestment: Big;

4
apps/api/src/app/portfolio/interfaces/holding-valuation-item.interface.ts

@ -1,6 +1,6 @@
import { Big } from 'big.js';
import type { Big } from 'big.js';
import { PortfolioCalculatorActivityItem } from './portfolio-calculator-activity-item.interface';
import type { PortfolioCalculatorActivityItem } from './portfolio-calculator-activity-item.interface';
export interface HoldingValuationItem extends Pick<
PortfolioCalculatorActivityItem,

4
apps/api/src/app/portfolio/interfaces/holding-valuation.interface.ts

@ -1,6 +1,6 @@
import { Big } from 'big.js';
import type { Big } from 'big.js';
import { HoldingValuationItem } from './holding-valuation-item.interface';
import type { HoldingValuationItem } from './holding-valuation-item.interface';
export interface HoldingValuation {
currentValues: { [date: string]: Big };

4
apps/api/src/app/portfolio/interfaces/portfolio-calculator-activity-item.interface.ts

@ -1,6 +1,6 @@
import { Big } from 'big.js';
import type { Big } from 'big.js';
import { PortfolioCalculatorActivity } from './portfolio-calculator-activity.interface';
import type { PortfolioCalculatorActivity } from './portfolio-calculator-activity.interface';
export interface PortfolioCalculatorActivityItem extends PortfolioCalculatorActivity {
feeInBaseCurrencyWithCurrencyEffect?: Big;

2
apps/api/src/app/portfolio/interfaces/portfolio-calculator-activity.interface.ts

@ -1,4 +1,4 @@
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
export interface PortfolioCalculatorActivity extends Pick<
Activity,

2
apps/api/src/app/portfolio/interfaces/portfolio-calculator-holding.interface.ts

@ -1,4 +1,4 @@
import { PortfolioSnapshotHolding } from '@ghostfolio/common/models';
import type { PortfolioSnapshotHolding } from '@ghostfolio/common/models';
export interface PortfolioCalculatorHolding extends PortfolioSnapshotHolding {
includeInHoldings: boolean;

11
apps/api/src/app/portfolio/portfolio.service.spec.ts

@ -1,7 +1,7 @@
import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface';
import type { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface';
import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service';
import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import type { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator';
import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory';
import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
@ -16,15 +16,16 @@ import {
UNKNOWN_KEY
} from '@ghostfolio/common/config';
import { parseDate } from '@ghostfolio/common/helper';
import {
import type {
Activity,
AssetProfileIdentifier,
Filter,
PortfolioSummary
} from '@ghostfolio/common/interfaces';
import { AccountWithBalance } from '@ghostfolio/common/types';
import type { AccountWithBalance } from '@ghostfolio/common/types';
import { AssetClass, DataSource, Prisma } from '@prisma/client';
import type { Prisma } from '@prisma/client';
import { AssetClass, DataSource } from '@prisma/client';
import { Big } from 'big.js';
import { randomUUID } from 'node:crypto';

2
apps/api/src/app/portfolio/types/performance-percentages.type.ts

@ -1,4 +1,4 @@
import { HistoricalDataItem } from '@ghostfolio/common/interfaces';
import type { HistoricalDataItem } from '@ghostfolio/common/interfaces';
export type PerformancePercentages = Required<
Pick<

4
apps/api/src/app/redis-cache/redis-cache.service.mock.ts

@ -1,5 +1,5 @@
import { Filter } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import type { Filter } from '@ghostfolio/common/interfaces';
import type { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
export const RedisCacheServiceMock = {
cache: new Map<string, string>(),

2
apps/api/src/decorators/impersonation.decorator.ts

@ -4,9 +4,9 @@ import type {
RequestWithUser
} from '@ghostfolio/common/types';
import type { ExecutionContext } from '@nestjs/common';
import {
createParamDecorator,
ExecutionContext,
InternalServerErrorException
} from '@nestjs/common';

2
apps/api/src/decorators/requires-scope-of-access.decorator.ts

@ -1,7 +1,7 @@
import { REQUIRES_SCOPE_KEY } from '@ghostfolio/api/decorators/requires-scope.decorator';
import { AccessGuard } from '@ghostfolio/api/guards/access.guard';
import { ScopeGuard } from '@ghostfolio/api/guards/scope.guard';
import { Scope } from '@ghostfolio/common/scopes';
import type { Scope } from '@ghostfolio/common/scopes';
import { applyDecorators, SetMetadata, UseGuards } from '@nestjs/common';
import { ToolScopes } from '@rekog/mcp-nest';

2
apps/api/src/decorators/requires-scope.decorator.ts

@ -1,7 +1,7 @@
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard';
import { ImpersonationGuard } from '@ghostfolio/api/guards/impersonation.guard';
import { ScopeGuard } from '@ghostfolio/api/guards/scope.guard';
import { Scope } from '@ghostfolio/common/scopes';
import type { Scope } from '@ghostfolio/common/scopes';
import { applyDecorators, SetMetadata, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

2
apps/api/src/events/asset-profile-changed.event.ts

@ -1,4 +1,4 @@
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import type { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
export class AssetProfileChangedEvent {
public constructor(

5
apps/api/src/guards/impersonation-write.guard.spec.ts

@ -1,10 +1,11 @@
import { ALLOW_DURING_IMPERSONATION_KEY } from '@ghostfolio/api/decorators/allow-during-impersonation.decorator';
import { REQUIRES_SCOPE_KEY } from '@ghostfolio/api/decorators/requires-scope.decorator';
import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config';
import { Scope, scopes } from '@ghostfolio/common/scopes';
import type { Scope } from '@ghostfolio/common/scopes';
import { scopes } from '@ghostfolio/common/scopes';
import { HttpException } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import type { Reflector } from '@nestjs/core';
import { ExecutionContextHost } from '@nestjs/core/helpers/execution-context-host';
import { ImpersonationWriteGuard } from './impersonation-write.guard';

2
apps/api/src/guards/impersonation.guard.spec.ts

@ -1,4 +1,4 @@
import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service';
import type { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service';
import {
HEADER_KEY_IMPERSONATION,
HTTP_RESPONSE_MESSAGE_IMPERSONATION_UNRESOLVED

6
apps/api/src/guards/oauth-callback.guard.ts

@ -1,5 +1,7 @@
import { Logger, mixin, Type } from '@nestjs/common';
import { AuthGuard, IAuthGuard } from '@nestjs/passport';
import type { Type } from '@nestjs/common';
import { Logger, mixin } from '@nestjs/common';
import type { IAuthGuard } from '@nestjs/passport';
import { AuthGuard } from '@nestjs/passport';
export function OAuthCallbackGuard(strategy: string): Type<IAuthGuard> {
class OAuthCallbackGuardMixin extends AuthGuard(strategy) {

5
apps/api/src/guards/scope.guard.spec.ts

@ -1,7 +1,8 @@
import { Scope, scopes } from '@ghostfolio/common/scopes';
import type { Scope } from '@ghostfolio/common/scopes';
import { scopes } from '@ghostfolio/common/scopes';
import { HttpException } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import type { Reflector } from '@nestjs/core';
import { ExecutionContextHost } from '@nestjs/core/helpers/execution-context-host';
import { ScopeGuard } from './scope.guard';

2
apps/api/src/helper/account.helper.ts

@ -1,7 +1,7 @@
import { TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config';
import { getStartOfUtcDateOfTomorrow } from '@ghostfolio/common/helper';
import { Prisma } from '@prisma/client';
import type { Prisma } from '@prisma/client';
import { isAfter } from 'date-fns';
export const WHERE_ACCOUNT_NOT_EXCLUDED: Prisma.AccountWhereInput = {

2
apps/api/src/helper/activity.helper.ts

@ -3,7 +3,7 @@ import {
TAG_ID_DRAFT
} from '@ghostfolio/common/config';
import { Prisma, Type as ActivityType } from '@prisma/client';
import type { Prisma, Type as ActivityType } from '@prisma/client';
import { endOfToday, isAfter } from 'date-fns';
import { uniqBy } from 'lodash-es';

2
apps/api/src/helper/data-source.helper.spec.ts

@ -1,4 +1,4 @@
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import type { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataSource } from '@prisma/client';

5
apps/api/src/helper/data-source.helper.ts

@ -1,6 +1,7 @@
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import type { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataSource, Prisma } from '@prisma/client';
import type { Prisma } from '@prisma/client';
import { DataSource } from '@prisma/client';
import { isEmpty } from 'lodash-es';
import { createHash } from 'node:crypto';

2
apps/api/src/helper/execution-context.helper.ts

@ -1,4 +1,4 @@
import { ExecutionContext } from '@nestjs/common';
import type { ExecutionContext } from '@nestjs/common';
/**
* Gives the underlying HTTP request of a request of any kind. A tool of the

2
apps/api/src/helper/interfaces/table-parameters.interface.ts

@ -1,4 +1,4 @@
import { TableColumnDefinition } from './table-column-definition.interface';
import type { TableColumnDefinition } from './table-column-definition.interface';
export interface TableParameters<T, C> {
columnDefinitions: readonly TableColumnDefinition<T, C>[];

2
apps/api/src/helper/markdown-table.helper.spec.ts

@ -1,4 +1,4 @@
import { TableColumnDefinition } from './interfaces/table-column-definition.interface';
import type { TableColumnDefinition } from './interfaces/table-column-definition.interface';
import { getTableInput } from './markdown-table.helper';
interface Holding {

2
apps/api/src/helper/markdown-table.helper.ts

@ -1,4 +1,4 @@
import { TableParameters } from './interfaces/table-parameters.interface';
import type { TableParameters } from './interfaces/table-parameters.interface';
/**
* Gives the columns and the rows in the form which the renderer takes, with

2
apps/api/src/helper/object.helper.spec.ts

@ -1,5 +1,5 @@
import { DEFAULT_REDACTED_PATHS } from '@ghostfolio/common/config';
import { PortfolioDetails } from '@ghostfolio/common/interfaces';
import type { PortfolioDetails } from '@ghostfolio/common/interfaces';
import { query, redactPaths } from './object.helper';

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

@ -1,6 +1,6 @@
import { PortfolioDetails } from '@ghostfolio/common/interfaces';
import type { PortfolioDetails } from '@ghostfolio/common/interfaces';
import { Type as ActivityType } from '@prisma/client';
import type { Type as ActivityType } from '@prisma/client';
export function convertValuesToPercentages({
accounts,

2
apps/api/src/helper/redis.helper.ts

@ -1,4 +1,4 @@
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import type { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
export function getRedisConnectionOptions(
configurationService: ConfigurationService

2
apps/api/src/helper/sector.helper.ts

@ -1,5 +1,5 @@
import { SECTORS } from '@ghostfolio/common/config';
import { SectorName } from '@ghostfolio/common/types';
import type { SectorName } from '@ghostfolio/common/types';
import { Logger } from '@nestjs/common';

2
apps/api/src/helper/security-headers.helper.spec.ts

@ -1,5 +1,5 @@
import helmet from 'helmet';
import { IncomingMessage, ServerResponse } from 'node:http';
import type { IncomingMessage, ServerResponse } from 'node:http';
import { getHelmetOptions } from './security-headers.helper';

2
apps/api/src/helper/security-headers.helper.ts

@ -1,4 +1,4 @@
import { HelmetOptions } from 'helmet';
import type { HelmetOptions } from 'helmet';
export function getHelmetOptions({
isSubscriptionEnabled

7
apps/api/src/main.ts

@ -12,9 +12,9 @@ import {
SUPPORTED_LANGUAGE_CODES
} from '@ghostfolio/common/config';
import type { LogLevel } from '@nestjs/common';
import {
Logger,
LogLevel,
ShutdownSignal,
ValidationPipe,
VersioningType
@ -22,9 +22,10 @@ import {
import { ConfigService } from '@nestjs/config';
import { NestFactory } from '@nestjs/core';
import type { NestExpressApplication } from '@nestjs/platform-express';
import { MCP_STRATEGY, McpStrategy } from '@rekog/mcp-nest';
import type { McpStrategy } from '@rekog/mcp-nest';
import { MCP_STRATEGY } from '@rekog/mcp-nest';
import cookieParser from 'cookie-parser';
import { NextFunction, Request, Response } from 'express';
import type { NextFunction, Request, Response } from 'express';
import helmet from 'helmet';
import { EnvHttpProxyAgent, setGlobalDispatcher } from 'undici';

2
apps/api/src/middlewares/language-redirect.middleware.ts

@ -1,7 +1,7 @@
import { environment } from '@ghostfolio/api/environments/environment';
import { getLanguageCodeFromHeader } from '@ghostfolio/api/helper/language.helper';
import { NextFunction, Request, Response } from 'express';
import type { NextFunction, Request, Response } from 'express';
import { StatusCodes } from 'http-status-codes';
export function languageRedirectMiddleware(

4
apps/api/src/middlewares/mcp-authorization.middleware.ts

@ -1,9 +1,9 @@
import { getAccessIdOfBearerToken } from '@ghostfolio/api/helper/bearer-token.helper';
import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service';
import type { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service';
import { HEADER_KEY_TOKEN, MCP_REALM } from '@ghostfolio/common/config';
import type { ImpersonationContext } from '@ghostfolio/common/types';
import { NextFunction, Request, Response } from 'express';
import type { NextFunction, Request, Response } from 'express';
import { getReasonPhrase, StatusCodes } from 'http-status-codes';
/**

4
apps/api/src/models/interfaces/rule.interface.ts

@ -1,6 +1,6 @@
import { RuleSettings } from '@ghostfolio/common/interfaces';
import type { RuleSettings } from '@ghostfolio/common/interfaces';
import { EvaluationResult } from './evaluation-result.interface';
import type { EvaluationResult } from './evaluation-result.interface';
export interface RuleInterface<T extends RuleSettings> {
evaluate(aRuleSettings: T): EvaluationResult;

10
apps/api/src/models/rule.ts

@ -1,6 +1,6 @@
import { XRayRuleKey } from '@ghostfolio/api/models/types/x-ray-rule-key.type';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import {
import type { XRayRuleKey } from '@ghostfolio/api/models/types/x-ray-rule-key.type';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type {
PortfolioPosition,
PortfolioReportRule,
RuleSettings
@ -9,8 +9,8 @@ import {
import { Big } from 'big.js';
import { groupBy } from 'lodash-es';
import { EvaluationResult } from './interfaces/evaluation-result.interface';
import { RuleInterface } from './interfaces/rule.interface';
import type { EvaluationResult } from './interfaces/evaluation-result.interface';
import type { RuleInterface } from './interfaces/rule.interface';
export abstract class Rule<T extends RuleSettings> implements RuleInterface<T> {
protected exchangeRateDataService: ExchangeRateDataService;

13
apps/api/src/models/rules/account-cluster-risk/current-investment.ts

@ -1,9 +1,12 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { PortfolioDetails, RuleSettings } from '@ghostfolio/common/interfaces';
import { Account } from '@prisma/client';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type {
PortfolioDetails,
RuleSettings
} from '@ghostfolio/common/interfaces';
import type { Account } from '@prisma/client';
export class AccountClusterRiskCurrentInvestment extends Rule<Settings> {
private accounts: PortfolioDetails['accounts'];

9
apps/api/src/models/rules/account-cluster-risk/single-account.ts

@ -1,7 +1,10 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { PortfolioDetails, RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type {
PortfolioDetails,
RuleSettings
} from '@ghostfolio/common/interfaces';
export class AccountClusterRiskSingleAccount extends Rule<RuleSettings> {
private accounts: PortfolioDetails['accounts'];

9
apps/api/src/models/rules/asset-class-cluster-risk/equity.ts

@ -1,7 +1,10 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { PortfolioPosition, RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type {
PortfolioPosition,
RuleSettings
} from '@ghostfolio/common/interfaces';
export class AssetClassClusterRiskEquity extends Rule<Settings> {
private holdings: PortfolioPosition[];

9
apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts

@ -1,7 +1,10 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { PortfolioPosition, RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type {
PortfolioPosition,
RuleSettings
} from '@ghostfolio/common/interfaces';
export class AssetClassClusterRiskFixedIncome extends Rule<Settings> {
private holdings: PortfolioPosition[];

9
apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts

@ -1,7 +1,10 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { PortfolioPosition, RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type {
PortfolioPosition,
RuleSettings
} from '@ghostfolio/common/interfaces';
export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule<Settings> {
private holdings: PortfolioPosition[];

9
apps/api/src/models/rules/currency-cluster-risk/current-investment.ts

@ -1,7 +1,10 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { PortfolioPosition, RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type {
PortfolioPosition,
RuleSettings
} from '@ghostfolio/common/interfaces';
export class CurrencyClusterRiskCurrentInvestment extends Rule<Settings> {
private holdings: PortfolioPosition[];

6
apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts

@ -1,7 +1,7 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { RuleSettings } from '@ghostfolio/common/interfaces';
export class EconomicMarketClusterRiskDevelopedMarkets extends Rule<Settings> {
private currentValueInBaseCurrency: number;

6
apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts

@ -1,7 +1,7 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { RuleSettings } from '@ghostfolio/common/interfaces';
export class EconomicMarketClusterRiskEmergingMarkets extends Rule<Settings> {
private currentValueInBaseCurrency: number;

6
apps/api/src/models/rules/emergency-fund/emergency-fund-coverage.ts

@ -1,7 +1,7 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { RuleSettings } from '@ghostfolio/common/interfaces';
import { Big } from 'big.js';

6
apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts

@ -1,7 +1,7 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { RuleSettings } from '@ghostfolio/common/interfaces';
export class EmergencyFundSetup extends Rule<Settings> {
private emergencyFundInBaseCurrency: number;

6
apps/api/src/models/rules/fees/fee-ratio-total-investment-volume.ts

@ -1,7 +1,7 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { RuleSettings } from '@ghostfolio/common/interfaces';
export class FeeRatioTotalInvestmentVolume extends Rule<Settings> {
private fees: number;

6
apps/api/src/models/rules/liquidity/buying-power.ts

@ -1,7 +1,7 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { RuleSettings } from '@ghostfolio/common/interfaces';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { RuleSettings } from '@ghostfolio/common/interfaces';
export class BuyingPower extends Rule<Settings> {
private buyingPower: number;

6
apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts

@ -1,8 +1,8 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { Settings } from './interfaces/rule-settings.interface';
import type { Settings } from './interfaces/rule-settings.interface';
export class RegionalMarketClusterRiskAsiaPacific extends Rule<Settings> {
private asiaPacificValueInBaseCurrency: number;

6
apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts

@ -1,8 +1,8 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { Settings } from './interfaces/rule-settings.interface';
import type { Settings } from './interfaces/rule-settings.interface';
export class RegionalMarketClusterRiskEmergingMarkets extends Rule<Settings> {
private currentValueInBaseCurrency: number;

6
apps/api/src/models/rules/regional-market-cluster-risk/europe.ts

@ -1,8 +1,8 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { Settings } from './interfaces/rule-settings.interface';
import type { Settings } from './interfaces/rule-settings.interface';
export class RegionalMarketClusterRiskEurope extends Rule<Settings> {
private currentValueInBaseCurrency: number;

2
apps/api/src/models/rules/regional-market-cluster-risk/interfaces/rule-settings.interface.ts

@ -1,4 +1,4 @@
import { RuleSettings } from '@ghostfolio/common/interfaces';
import type { RuleSettings } from '@ghostfolio/common/interfaces';
export interface Settings extends RuleSettings {
baseCurrency: string;

6
apps/api/src/models/rules/regional-market-cluster-risk/japan.ts

@ -1,8 +1,8 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { Settings } from './interfaces/rule-settings.interface';
import type { Settings } from './interfaces/rule-settings.interface';
export class RegionalMarketClusterRiskJapan extends Rule<Settings> {
private currentValueInBaseCurrency: number;

6
apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts

@ -1,8 +1,8 @@
import { Rule } from '@ghostfolio/api/models/rule';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import type { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import type { I18nService } from '@ghostfolio/api/services/i18n/i18n.service';
import { Settings } from './interfaces/rule-settings.interface';
import type { Settings } from './interfaces/rule-settings.interface';
export class RegionalMarketClusterRiskNorthAmerica extends Rule<Settings> {
private currentValueInBaseCurrency: number;

6
apps/api/src/models/rules/rule-settings.ts

@ -1,7 +1,7 @@
import { RuleSettingsConfiguration } from '@ghostfolio/api/models/interfaces/rule-settings-configuration.interface';
import { XRayRuleKey } from '@ghostfolio/api/models/types/x-ray-rule-key.type';
import type { RuleSettingsConfiguration } from '@ghostfolio/api/models/interfaces/rule-settings-configuration.interface';
import type { XRayRuleKey } from '@ghostfolio/api/models/types/x-ray-rule-key.type';
import { DEFAULT_CURRENCY, DEFAULT_LOCALE } from '@ghostfolio/common/config';
import {
import type {
RuleSettings,
UserSettings,
XRayRulesSettings

2
apps/api/src/models/types/x-ray-rule-key.type.ts

@ -1,3 +1,3 @@
import { XRayRulesSettings } from '@ghostfolio/common/interfaces';
import type { XRayRulesSettings } from '@ghostfolio/common/interfaces';
export type XRayRuleKey = keyof XRayRulesSettings;

5
apps/api/src/services/asset-profile-split/asset-profile-split.helper.spec.ts

@ -4,9 +4,10 @@ import {
} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
import * as commonHelper from '@ghostfolio/common/helper';
import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { AssetProfileSplit, DataSource } from '@prisma/client';
import type { AssetProfileSplit } from '@prisma/client';
import { DataSource } from '@prisma/client';
import { Big } from 'big.js';
import { adjustActivityBySplits } from './asset-profile-split.helper';

4
apps/api/src/services/asset-profile-split/asset-profile-split.helper.ts

@ -1,8 +1,8 @@
import { INVESTMENT_ACTIVITY_TYPES } from '@ghostfolio/common/config';
import { resetHours } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import type { Activity } from '@ghostfolio/common/interfaces';
import { AssetProfileSplit } from '@prisma/client';
import type { AssetProfileSplit } from '@prisma/client';
import { Big } from 'big.js';
import { isBefore } from 'date-fns';

5
apps/api/src/services/asset-profile-split/asset-profile-split.service.spec.ts

@ -1,6 +1,7 @@
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import type { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { AssetProfileSplit, DataSource } from '@prisma/client';
import type { AssetProfileSplit } from '@prisma/client';
import { DataSource } from '@prisma/client';
import { AssetProfileSplitService } from './asset-profile-split.service';

2
apps/api/src/services/benchmark/interfaces/benchmark-value.interface.ts

@ -1,4 +1,4 @@
import { BenchmarkResponse } from '@ghostfolio/common/interfaces';
import type { BenchmarkResponse } from '@ghostfolio/common/interfaces';
export interface BenchmarkValue {
benchmarks: BenchmarkResponse['benchmarks'];

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save