Browse Source
Task/migrate app to prisma-client generated code
pull/8052/head
Szymon Łągiewka
2 weeks ago
Failed to extract signature
111 changed files with
222 additions and
201 deletions
-
apps/api/eslint.config.cjs
-
apps/api/src/app/access/access.controller.ts
-
apps/api/src/app/access/access.service.ts
-
apps/api/src/app/account-balance/account-balance.controller.ts
-
apps/api/src/app/account-balance/account-balance.service.ts
-
apps/api/src/app/account/account.controller.ts
-
apps/api/src/app/account/account.service.ts
-
apps/api/src/app/activities/activities-filter.dto.ts
-
apps/api/src/app/activities/activities.controller.ts
-
apps/api/src/app/activities/activities.service.spec.ts
-
apps/api/src/app/activities/activities.service.ts
-
apps/api/src/app/activities/get-activities.dto.ts
-
apps/api/src/app/admin/admin.controller.ts
-
apps/api/src/app/admin/admin.service.ts
-
apps/api/src/app/asset/asset.controller.ts
-
apps/api/src/app/auth-device/auth-device.service.ts
-
apps/api/src/app/auth/google.strategy.ts
-
apps/api/src/app/auth/interfaces/interfaces.ts
-
apps/api/src/app/auth/oidc.strategy.ts
-
apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts
-
apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.spec.ts
-
apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts
-
apps/api/src/app/endpoints/asset-profiles/get-asset-profiles.dto.ts
-
apps/api/src/app/endpoints/benchmarks/benchmarks.controller.ts
-
apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts
-
apps/api/src/app/endpoints/market-data/market-data.controller.ts
-
apps/api/src/app/endpoints/mcp/mcp.schemas.spec.ts
-
apps/api/src/app/endpoints/mcp/mcp.schemas.ts
-
apps/api/src/app/endpoints/mcp/mcp.service.spec.ts
-
apps/api/src/app/endpoints/mcp/mcp.test-utils.ts
-
apps/api/src/app/endpoints/public/public.service.ts
-
apps/api/src/app/endpoints/tags/tags.controller.ts
-
apps/api/src/app/endpoints/watchlist/watchlist.controller.ts
-
apps/api/src/app/endpoints/watchlist/watchlist.service.ts
-
apps/api/src/app/export/export.service.ts
-
apps/api/src/app/health/health.controller.ts
-
apps/api/src/app/health/health.service.ts
-
apps/api/src/app/import/import-data.dto.spec.ts
-
apps/api/src/app/import/import.controller.ts
-
apps/api/src/app/import/import.service.spec.ts
-
apps/api/src/app/import/import.service.ts
-
apps/api/src/app/import/interfaces/asset-profile-to-create.interface.ts
-
apps/api/src/app/info/info.service.ts
-
apps/api/src/app/logo/logo.controller.ts
-
apps/api/src/app/logo/logo.service.ts
-
apps/api/src/app/platform/platform.controller.ts
-
apps/api/src/app/platform/platform.service.ts
-
apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
-
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts
-
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-stock-split.spec.ts
-
apps/api/src/app/portfolio/current-rate.service.mock.ts
-
apps/api/src/app/portfolio/current-rate.service.spec.ts
-
apps/api/src/app/portfolio/interfaces/holding-balance.interface.ts
-
apps/api/src/app/portfolio/portfolio.controller.ts
-
apps/api/src/app/portfolio/portfolio.service.spec.ts
-
apps/api/src/app/portfolio/portfolio.service.ts
-
apps/api/src/app/portfolio/update-holding-tags.dto.ts
-
apps/api/src/app/subscription/subscription.service.ts
-
apps/api/src/app/symbol/symbol.controller.ts
-
apps/api/src/app/user/user.controller.ts
-
apps/api/src/app/user/user.service.ts
-
apps/api/src/dependencies.ts
-
apps/api/src/dtos/filter.dto.ts
-
apps/api/src/helper/account.helper.ts
-
apps/api/src/helper/activity.helper.ts
-
apps/api/src/helper/data-source.helper.spec.ts
-
apps/api/src/helper/data-source.helper.ts
-
apps/api/src/helper/portfolio.helper.ts
-
apps/api/src/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor.ts
-
apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts
-
apps/api/src/models/rules/account-cluster-risk/current-investment.ts
-
apps/api/src/services/asset-profile-split/asset-profile-split.helper.spec.ts
-
apps/api/src/services/asset-profile-split/asset-profile-split.helper.ts
-
apps/api/src/services/asset-profile-split/asset-profile-split.service.spec.ts
-
apps/api/src/services/asset-profile-split/asset-profile-split.service.ts
-
apps/api/src/services/benchmark/benchmark.service.ts
-
apps/api/src/services/configuration/configuration.service.ts
-
apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts
-
apps/api/src/services/data-provider/coingecko/coingecko.service.ts
-
apps/api/src/services/data-provider/data-enhancer/data-enhancer.service.ts
-
apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts
-
apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts
-
apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
-
apps/api/src/services/data-provider/data-provider.service.ts
-
apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
-
apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
-
apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts
-
apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts
-
apps/api/src/services/data-provider/interfaces/data-enhancer.interface.ts
-
apps/api/src/services/data-provider/interfaces/data-provider.interface.ts
-
apps/api/src/services/data-provider/manual/manual.service.spec.ts
-
apps/api/src/services/data-provider/manual/manual.service.ts
-
apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts
-
apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts
-
apps/api/src/services/impersonation/impersonation.service.spec.ts
-
apps/api/src/services/impersonation/impersonation.service.ts
-
apps/api/src/services/market-data/market-data.service.ts
-
apps/api/src/services/portfolio-table/interfaces/holdings-table-context.interface.ts
-
apps/api/src/services/portfolio-table/portfolio-table.service.spec.ts
-
apps/api/src/services/portfolio-table/portfolio-table.service.ts
|
|
|
@ -21,10 +21,7 @@ module.exports = [ |
|
|
|
{ |
|
|
|
files: ['**/*.ts', '**/*.tsx'], |
|
|
|
// Override or add rules here |
|
|
|
rules: { |
|
|
|
// TODO: Remove once the API uses the code generated by the new prisma-client generator |
|
|
|
'@typescript-eslint/no-restricted-imports': 'off' |
|
|
|
} |
|
|
|
rules: {} |
|
|
|
}, |
|
|
|
{ |
|
|
|
files: ['**/*.js', '**/*.jsx'], |
|
|
|
|
|
|
|
@ -12,6 +12,7 @@ import { Access, AccessSettings } from '@ghostfolio/common/interfaces'; |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import { getScopesOfAccess } from '@ghostfolio/common/scopes'; |
|
|
|
import type { RequestWithUser } from '@ghostfolio/common/types'; |
|
|
|
import type { Access as AccessModel } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -27,7 +28,6 @@ import { |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { Access as AccessModel } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
import { AccessService } from './access.service'; |
|
|
|
|
|
|
|
@ -1,9 +1,9 @@ |
|
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
|
import { AccessSettings, Filter } from '@ghostfolio/common/interfaces'; |
|
|
|
import { AccessWithGranteeUser } from '@ghostfolio/common/types'; |
|
|
|
import type { Access, Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { Access, Prisma } from '@prisma/client'; |
|
|
|
import { isBefore, isToday, isValid } from 'date-fns'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
|
|
|
|
@ -7,6 +7,7 @@ import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos'; |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import { scopes } from '@ghostfolio/common/scopes'; |
|
|
|
import type { ImpersonationContext } from '@ghostfolio/common/types'; |
|
|
|
import type { AccountBalance } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { |
|
|
|
Controller, |
|
|
|
@ -17,7 +18,6 @@ import { |
|
|
|
Param, |
|
|
|
UseInterceptors |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { AccountBalance } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
import { AccountBalanceService } from './account-balance.service'; |
|
|
|
|
|
|
|
@ -18,10 +18,10 @@ import { |
|
|
|
Filter, |
|
|
|
HistoricalDataItem |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { AccountBalance, Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { EventEmitter2 } from '@nestjs/event-emitter'; |
|
|
|
import { AccountBalance, Prisma } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { endOfToday, format, min, parseISO } from 'date-fns'; |
|
|
|
import { groupBy } from 'lodash-es'; |
|
|
|
|
|
|
|
@ -19,6 +19,7 @@ import { |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import { scopes } from '@ghostfolio/common/scopes'; |
|
|
|
import type { ImpersonationContext } from '@ghostfolio/common/types'; |
|
|
|
import type { Account as AccountModel } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -32,7 +33,6 @@ import { |
|
|
|
Query, |
|
|
|
UseInterceptors |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { Account as AccountModel } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
import { AccountService } from './account.service'; |
|
|
|
|
|
|
|
@ -14,10 +14,7 @@ import { |
|
|
|
} from '@ghostfolio/common/helper'; |
|
|
|
import { Filter } from '@ghostfolio/common/interfaces'; |
|
|
|
import { AccountWithBalance } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { EventEmitter2 } from '@nestjs/event-emitter'; |
|
|
|
import { |
|
|
|
import type { |
|
|
|
Account, |
|
|
|
AccountBalance, |
|
|
|
Order, |
|
|
|
@ -25,7 +22,10 @@ import { |
|
|
|
Prisma, |
|
|
|
SymbolProfile, |
|
|
|
Tag |
|
|
|
} from '@prisma/client'; |
|
|
|
} from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { EventEmitter2 } from '@nestjs/event-emitter'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { format } from 'date-fns'; |
|
|
|
import { groupBy, isNil } from 'lodash-es'; |
|
|
|
|
|
|
|
@ -1,8 +1,8 @@ |
|
|
|
import { DATE_RANGE_PATTERN } from '@ghostfolio/api/dtos/date-range-filter.dto'; |
|
|
|
import { FilterDto } from '@ghostfolio/api/dtos/filter.dto'; |
|
|
|
import { DateRange } from '@ghostfolio/common/types'; |
|
|
|
import { Type as ActivityType } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Type as ActivityType } from '@prisma/client'; |
|
|
|
import { Transform, TransformFnParams } from 'class-transformer'; |
|
|
|
import { IsEnum, IsOptional, Matches } from 'class-validator'; |
|
|
|
import { isString } from 'lodash-es'; |
|
|
|
|
|
|
|
@ -22,6 +22,7 @@ import { |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import { scopes } from '@ghostfolio/common/scopes'; |
|
|
|
import type { ImpersonationContext } from '@ghostfolio/common/types'; |
|
|
|
import type { Order, Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -35,7 +36,6 @@ import { |
|
|
|
Query, |
|
|
|
UseInterceptors |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { Order } from '@prisma/client'; |
|
|
|
import { parseISO } from 'date-fns'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
|
|
|
|
@ -14,12 +14,9 @@ import { |
|
|
|
} from '@ghostfolio/common/config'; |
|
|
|
import { parseDate } from '@ghostfolio/common/helper'; |
|
|
|
import { Activity, Filter } from '@ghostfolio/common/interfaces'; |
|
|
|
import type { AssetProfileSplit } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource, Type as ActivityType } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
AssetProfileSplit, |
|
|
|
DataSource, |
|
|
|
Type as ActivityType |
|
|
|
} from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
|
|
|
|
import { ActivitiesService } from './activities.service'; |
|
|
|
|
|
|
|
@ -47,18 +47,16 @@ import { |
|
|
|
Filter |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { OrderWithAccount } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { EventEmitter2 } from '@nestjs/event-emitter'; |
|
|
|
import type { Order, Prisma, Tag } from '@ghostfolio/prisma/client'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource, |
|
|
|
Order, |
|
|
|
Prisma, |
|
|
|
Tag, |
|
|
|
Type as ActivityType |
|
|
|
} from '@prisma/client'; |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { EventEmitter2 } from '@nestjs/event-emitter'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { groupBy, omit, uniqBy } from 'lodash-es'; |
|
|
|
import { randomUUID } from 'node:crypto'; |
|
|
|
|
|
|
|
@ -1,4 +1,5 @@ |
|
|
|
import { Prisma } from '@prisma/client'; |
|
|
|
import { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Type } from 'class-transformer'; |
|
|
|
import { IsIn, IsInt, IsOptional, Min } from 'class-validator'; |
|
|
|
|
|
|
|
|
|
|
|
@ -36,6 +36,12 @@ import type { |
|
|
|
PropertyKey, |
|
|
|
RequestWithUser |
|
|
|
} from '@ghostfolio/common/types'; |
|
|
|
import type { |
|
|
|
MarketData, |
|
|
|
Prisma, |
|
|
|
SymbolProfile |
|
|
|
} from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { |
|
|
|
@ -57,7 +63,6 @@ import { |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { DataSource, MarketData, Prisma, SymbolProfile } from '@prisma/client'; |
|
|
|
import { isDate, parseISO } from 'date-fns'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
|
|
|
|
@ -29,6 +29,16 @@ import { |
|
|
|
EnhancedAssetProfile |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { PropertyKey } from '@ghostfolio/common/types'; |
|
|
|
import { |
|
|
|
Prisma, |
|
|
|
type Property, |
|
|
|
type SymbolProfile |
|
|
|
} from '@ghostfolio/prisma/client'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
BadRequestException, |
|
|
|
@ -39,14 +49,6 @@ import { |
|
|
|
Logger, |
|
|
|
NotFoundException |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource, |
|
|
|
Prisma, |
|
|
|
Property, |
|
|
|
SymbolProfile |
|
|
|
} from '@prisma/client'; |
|
|
|
import { differenceInDays } from 'date-fns'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
import { randomUUID } from 'node:crypto'; |
|
|
|
|
|
|
|
@ -2,9 +2,9 @@ import { AssetProfilesService } from '@ghostfolio/api/app/endpoints/asset-profil |
|
|
|
import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; |
|
|
|
import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; |
|
|
|
import type { AssetResponse } from '@ghostfolio/common/interfaces'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Controller, Get, Param, UseInterceptors } from '@nestjs/common'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { pick } from 'lodash-es'; |
|
|
|
|
|
|
|
@Controller('asset') |
|
|
|
|
|
|
|
@ -1,7 +1,7 @@ |
|
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
|
import type { AuthDevice, Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { AuthDevice, Prisma } from '@prisma/client'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
export class AuthDeviceService { |
|
|
|
|
|
|
|
@ -1,8 +1,8 @@ |
|
|
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; |
|
|
|
import { Provider } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { PassportStrategy } from '@nestjs/passport'; |
|
|
|
import { Provider } from '@prisma/client'; |
|
|
|
import { DoneCallback } from 'passport'; |
|
|
|
import { Profile, Strategy } from 'passport-google-oauth20'; |
|
|
|
|
|
|
|
|
|
|
|
@ -1,6 +1,5 @@ |
|
|
|
import { AuthDeviceDto } from '@ghostfolio/common/dtos'; |
|
|
|
|
|
|
|
import { Provider } from '@prisma/client'; |
|
|
|
import type { Provider } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
export interface AuthDeviceDialogParams { |
|
|
|
authDevice: AuthDeviceDto; |
|
|
|
|
|
|
|
@ -1,6 +1,7 @@ |
|
|
|
import { Provider } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
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'; |
|
|
|
|
|
|
|
|
|
|
|
@ -18,6 +18,8 @@ import { |
|
|
|
import { hasPermission } from '@ghostfolio/common/permissions'; |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import type { RequestWithUser } from '@ghostfolio/common/types'; |
|
|
|
import type { AssetProfileSplit } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -35,7 +37,6 @@ import { |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { AssetProfileSplit, DataSource } from '@prisma/client'; |
|
|
|
import { parseISO } from 'date-fns'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
|
|
|
|
@ -2,10 +2,11 @@ import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.ser |
|
|
|
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 { AssetProfileSplit } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { NotFoundException } from '@nestjs/common'; |
|
|
|
import { EventEmitter2 } from '@nestjs/event-emitter'; |
|
|
|
import { AssetProfileSplit, DataSource } from '@prisma/client'; |
|
|
|
|
|
|
|
import { AssetProfilesService } from './asset-profiles.service'; |
|
|
|
|
|
|
|
|
|
|
|
@ -25,10 +25,15 @@ import { |
|
|
|
Filter |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { MarketDataPreset } from '@ghostfolio/common/types'; |
|
|
|
import { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, Logger, NotFoundException } from '@nestjs/common'; |
|
|
|
import { EventEmitter2 } from '@nestjs/event-emitter'; |
|
|
|
import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client'; |
|
|
|
import { groupBy } from 'lodash-es'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
|
|
|
|
@ -1,7 +1,7 @@ |
|
|
|
import { SEARCH_QUERY_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; |
|
|
|
import { MarketDataPreset } from '@ghostfolio/common/types'; |
|
|
|
import type { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Prisma } from '@prisma/client'; |
|
|
|
import { Type } from 'class-transformer'; |
|
|
|
import { |
|
|
|
IsIn, |
|
|
|
|
|
|
|
@ -16,6 +16,7 @@ import type { |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import { scopes } from '@ghostfolio/common/scopes'; |
|
|
|
import type { ImpersonationContext } from '@ghostfolio/common/types'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -30,7 +31,6 @@ import { |
|
|
|
UseInterceptors |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
import { BenchmarksService } from './benchmarks.service'; |
|
|
|
|
|
|
|
@ -35,9 +35,10 @@ import { |
|
|
|
QuotesResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { UserWithSettings } from '@ghostfolio/common/types'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { addMilliseconds, isBefore } from 'date-fns'; |
|
|
|
import { isEmpty } from 'lodash-es'; |
|
|
|
|
|
|
|
@ -9,6 +9,8 @@ import { getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper'; |
|
|
|
import { MarketDataOfMarketsResponse } from '@ghostfolio/common/interfaces'; |
|
|
|
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import type { RequestWithUser } from '@ghostfolio/common/types'; |
|
|
|
import type { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -24,7 +26,6 @@ import { |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { DataSource, Prisma } from '@prisma/client'; |
|
|
|
import { parseISO } from 'date-fns'; |
|
|
|
import { getReasonPhrase, StatusCodes } from 'http-status-codes'; |
|
|
|
|
|
|
|
|
|
|
|
@ -7,8 +7,7 @@ import { |
|
|
|
SEARCH_QUERY_MINIMUM_LENGTH, |
|
|
|
SYMBOL_MAXIMUM_LENGTH |
|
|
|
} from '@ghostfolio/common/config'; |
|
|
|
|
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
GET_ACCOUNTS_PARAMETERS, |
|
|
|
|
|
|
|
@ -14,8 +14,12 @@ import { |
|
|
|
isValidCurrencyCode, |
|
|
|
isValidDateAfter1970 |
|
|
|
} from '@ghostfolio/common/helper'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
DataSource, |
|
|
|
Type as ActivityType |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { AssetClass, DataSource, Type as ActivityType } from '@prisma/client'; |
|
|
|
import { z } from 'zod'; |
|
|
|
|
|
|
|
const DATA_SOURCE_PARAMETER_ERROR = `Invalid option: expected one of ${Object.values(DataSource).join('|')} or a data source as given by a tool`; |
|
|
|
|
|
|
|
@ -13,14 +13,14 @@ import { |
|
|
|
import { Activity, Filter } from '@ghostfolio/common/interfaces'; |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import type { UserWithSettings } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
import { HttpException } from '@nestjs/common'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource, |
|
|
|
Type as ActivityType |
|
|
|
} from '@prisma/client'; |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { HttpException } from '@nestjs/common'; |
|
|
|
|
|
|
|
import { McpService } from './mcp.service'; |
|
|
|
import { createActivity } from './mcp.test-utils'; |
|
|
|
|
|
|
|
@ -1,4 +1,4 @@ |
|
|
|
import { Type as ActivityType } from '@prisma/client'; |
|
|
|
import { Type as ActivityType } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { ActivityToImport } from './types/activity-to-import.type'; |
|
|
|
|
|
|
|
|
|
|
|
@ -11,9 +11,9 @@ import { |
|
|
|
AccessSettings, |
|
|
|
PublicPortfolioResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { Type as ActivityType } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { HttpException, Injectable } from '@nestjs/common'; |
|
|
|
import { Type as ActivityType } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
|
|
|
|
@ -6,6 +6,7 @@ import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos'; |
|
|
|
import { isSystemTag } from '@ghostfolio/common/helper'; |
|
|
|
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import type { RequestWithUser } from '@ghostfolio/common/types'; |
|
|
|
import type { Tag } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -21,7 +22,6 @@ import { |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { Tag } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
@AllowDuringImpersonation() |
|
|
|
|
|
|
|
@ -8,6 +8,7 @@ import { WatchlistResponse } from '@ghostfolio/common/interfaces'; |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import { scopes } from '@ghostfolio/common/scopes'; |
|
|
|
import type { ImpersonationContext } from '@ghostfolio/common/types'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -19,7 +20,6 @@ import { |
|
|
|
Post, |
|
|
|
UseInterceptors |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
import { WatchlistService } from './watchlist.service'; |
|
|
|
|
|
|
|
@ -10,9 +10,9 @@ import { |
|
|
|
AssetProfileIdentifier, |
|
|
|
WatchlistResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { BadRequestException, Injectable } from '@nestjs/common'; |
|
|
|
import { Prisma } from '@prisma/client'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
export class WatchlistService { |
|
|
|
|
|
|
|
@ -8,9 +8,10 @@ import { |
|
|
|
Filter, |
|
|
|
UserSettings |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { Platform, Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
import { Type as ActivityType } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { Platform, Prisma, Type as ActivityType } from '@prisma/client'; |
|
|
|
import { groupBy, uniqBy } from 'lodash-es'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
|
|
|
|
@ -6,6 +6,7 @@ import { |
|
|
|
DataProviderHealthResponse, |
|
|
|
LivenessHealthResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
Controller, |
|
|
|
@ -17,7 +18,6 @@ import { |
|
|
|
Res, |
|
|
|
UseInterceptors |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { Response } from 'express'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
|
|
|
|
@ -3,9 +3,9 @@ import { DataEnhancerService } from '@ghostfolio/api/services/data-provider/data |
|
|
|
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; |
|
|
|
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; |
|
|
|
import { PROPERTY_CURRENCIES } from '@ghostfolio/common/config'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
export class HealthService { |
|
|
|
|
|
|
|
@ -1,5 +1,6 @@ |
|
|
|
import { DataSource, Type } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { BadRequestException, ValidationPipe } from '@nestjs/common'; |
|
|
|
import { DataSource, Type } from '@prisma/client'; |
|
|
|
import { readFileSync } from 'node:fs'; |
|
|
|
import { join } from 'node:path'; |
|
|
|
|
|
|
|
|
|
|
|
@ -5,6 +5,7 @@ import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interc |
|
|
|
import { ImportResponse } from '@ghostfolio/common/interfaces'; |
|
|
|
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import type { RequestWithUser } from '@ghostfolio/common/types'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -21,7 +22,6 @@ import { |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
import { ImportDataDto } from './import-data.dto'; |
|
|
|
|
|
|
|
@ -13,8 +13,9 @@ import { |
|
|
|
AssetProfileIdentifier |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { UserWithSettings } from '@ghostfolio/common/types'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
|
import { parseISO } from 'date-fns'; |
|
|
|
|
|
|
|
import { ImportService } from './import.service'; |
|
|
|
|
|
|
|
@ -41,9 +41,10 @@ import { |
|
|
|
OrderWithAccount, |
|
|
|
UserWithSettings |
|
|
|
} from '@ghostfolio/common/types'; |
|
|
|
import { type Account, Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { Account, DataSource, Prisma } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { isISIN } from 'class-validator'; |
|
|
|
import { isSameSecond, parseISO } from 'date-fns'; |
|
|
|
|
|
|
|
@ -1,4 +1,4 @@ |
|
|
|
import { Prisma } from '@prisma/client'; |
|
|
|
import type { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
export interface AssetProfileToCreate { |
|
|
|
assetProfile: Prisma.SymbolProfileCreateInput; |
|
|
|
|
|
|
|
@ -21,10 +21,10 @@ import { |
|
|
|
} from '@ghostfolio/common/config'; |
|
|
|
import { InfoItem, Statistics } from '@ghostfolio/common/interfaces'; |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import type { MarketData } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { JwtService } from '@nestjs/jwt'; |
|
|
|
import { MarketData } from '@prisma/client'; |
|
|
|
import { subDays } from 'date-fns'; |
|
|
|
import { isNil } from 'lodash-es'; |
|
|
|
|
|
|
|
|
|
|
|
@ -1,4 +1,5 @@ |
|
|
|
import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
Controller, |
|
|
|
@ -9,7 +10,6 @@ import { |
|
|
|
Res, |
|
|
|
UseInterceptors |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { Response } from 'express'; |
|
|
|
import ms from 'ms'; |
|
|
|
|
|
|
|
|
|
|
|
@ -2,9 +2,9 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con |
|
|
|
import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; |
|
|
|
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; |
|
|
|
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { HttpException, Injectable } from '@nestjs/common'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
|
|
|
|
@ -3,6 +3,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat |
|
|
|
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; |
|
|
|
import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; |
|
|
|
import { permissions } from '@ghostfolio/common/permissions'; |
|
|
|
import type { Platform } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -16,7 +17,6 @@ import { |
|
|
|
UseGuards |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { Platform } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
import { PlatformService } from './platform.service'; |
|
|
|
|
|
|
|
@ -1,7 +1,7 @@ |
|
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
|
import type { Platform, Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { Platform, Prisma } from '@prisma/client'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
export class PlatformService { |
|
|
|
|
|
|
|
@ -49,9 +49,9 @@ import { |
|
|
|
} from '@ghostfolio/common/models'; |
|
|
|
import { GroupBy } from '@ghostfolio/common/types'; |
|
|
|
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; |
|
|
|
import { AssetSubClass, DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Logger } from '@nestjs/common'; |
|
|
|
import { AssetSubClass, DataSource } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { plainToClass } from 'class-transformer'; |
|
|
|
import { |
|
|
|
|
|
|
|
@ -21,8 +21,8 @@ import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/po |
|
|
|
import { parseDate } from '@ghostfolio/common/helper'; |
|
|
|
import { PortfolioSnapshotHolding } from '@ghostfolio/common/models'; |
|
|
|
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { eachDayOfInterval } from 'date-fns'; |
|
|
|
import { randomUUID } from 'node:crypto'; |
|
|
|
|
|
|
|
@ -16,8 +16,9 @@ import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/po |
|
|
|
import { parseDate } from '@ghostfolio/common/helper'; |
|
|
|
import { Activity } from '@ghostfolio/common/interfaces'; |
|
|
|
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; |
|
|
|
import type { AssetProfileSplit } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { AssetProfileSplit, DataSource } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
|
|
|
|
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { |
|
|
|
|
|
|
|
@ -1,6 +1,6 @@ |
|
|
|
import { parseDate, resetHours } from '@ghostfolio/common/helper'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { |
|
|
|
addDays, |
|
|
|
eachDayOfInterval, |
|
|
|
|
|
|
|
@ -4,13 +4,9 @@ import { MarketDataService } from '@ghostfolio/api/services/market-data/market-d |
|
|
|
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; |
|
|
|
import { resetHours } from '@ghostfolio/common/helper'; |
|
|
|
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; |
|
|
|
import type { MarketData, Order } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource, Type as ActivityType } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
DataSource, |
|
|
|
MarketData, |
|
|
|
Order, |
|
|
|
Type as ActivityType |
|
|
|
} from '@prisma/client'; |
|
|
|
import { addDays, subDays } from 'date-fns'; |
|
|
|
|
|
|
|
import { CurrentRateService } from './current-rate.service'; |
|
|
|
|
|
|
|
@ -1,4 +1,6 @@ |
|
|
|
import { AssetSubClass, DataSource, Tag } from '@prisma/client'; |
|
|
|
import type { Tag } from '@ghostfolio/prisma/client'; |
|
|
|
import type { AssetSubClass, DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Big } from 'big.js'; |
|
|
|
|
|
|
|
export interface HoldingBalance { |
|
|
|
|
|
|
|
@ -32,6 +32,7 @@ import type { |
|
|
|
ImpersonationContext, |
|
|
|
RequestWithUser |
|
|
|
} from '@ghostfolio/common/types'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -46,7 +47,6 @@ import { |
|
|
|
Version |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
|
|
|
|
|
|
|
|
@ -23,8 +23,9 @@ import { |
|
|
|
PortfolioSummary |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { AccountWithBalance } from '@ghostfolio/common/types'; |
|
|
|
import { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
import { AssetClass, DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { AssetClass, DataSource, Prisma } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { randomUUID } from 'node:crypto'; |
|
|
|
|
|
|
|
|
|
|
|
@ -77,20 +77,17 @@ import { |
|
|
|
UserWithSettings |
|
|
|
} from '@ghostfolio/common/types'; |
|
|
|
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { Inject, Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import type { Order, Platform, Prisma, Tag } from '@ghostfolio/prisma/client'; |
|
|
|
import { |
|
|
|
Type as ActivityType, |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource, |
|
|
|
Order, |
|
|
|
Platform, |
|
|
|
Prisma, |
|
|
|
Tag |
|
|
|
} from '@prisma/client'; |
|
|
|
DataSource |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { Inject, Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { |
|
|
|
differenceInDays, |
|
|
|
|
|
|
|
@ -1,4 +1,5 @@ |
|
|
|
import { Tag } from '@prisma/client'; |
|
|
|
import type { Tag } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { IsArray } from 'class-validator'; |
|
|
|
|
|
|
|
export class UpdateHoldingTagsDto { |
|
|
|
|
|
|
|
@ -16,9 +16,9 @@ import { |
|
|
|
SubscriptionOfferKey, |
|
|
|
UserWithSettings |
|
|
|
} from '@ghostfolio/common/types'; |
|
|
|
import { Prisma, type Subscription } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { BadRequestException, Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { Prisma, Subscription } from '@prisma/client'; |
|
|
|
import { addMilliseconds, isBefore } from 'date-fns'; |
|
|
|
import ms, { StringValue } from 'ms'; |
|
|
|
import Stripe from 'stripe'; |
|
|
|
|
|
|
|
@ -7,6 +7,7 @@ import { |
|
|
|
SymbolItem |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { RequestWithUser } from '@ghostfolio/common/types'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { |
|
|
|
@ -22,7 +23,6 @@ import { |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { REQUEST } from '@nestjs/core'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { isValid, parseISO } from 'date-fns'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
import { isEmpty } from 'lodash-es'; |
|
|
|
|
|
|
|
@ -32,6 +32,7 @@ import type { |
|
|
|
ImpersonationContext, |
|
|
|
RequestWithUser |
|
|
|
} from '@ghostfolio/common/types'; |
|
|
|
import type { User as UserModel } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { |
|
|
|
Body, |
|
|
|
@ -51,7 +52,6 @@ import { REQUEST } from '@nestjs/core'; |
|
|
|
import { JwtService } from '@nestjs/jwt'; |
|
|
|
import { AuthGuard } from '@nestjs/passport'; |
|
|
|
import { Throttle } from '@nestjs/throttler'; |
|
|
|
import { User as UserModel } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
import { merge, size } from 'lodash-es'; |
|
|
|
|
|
|
|
|
|
|
|
@ -40,11 +40,12 @@ import { |
|
|
|
import { getScopesOfAccess } from '@ghostfolio/common/scopes'; |
|
|
|
import { UserWithSettings } from '@ghostfolio/common/types'; |
|
|
|
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; |
|
|
|
import { Prisma, type User } from '@ghostfolio/prisma/client'; |
|
|
|
import { Role } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { EventEmitter2 } from '@nestjs/event-emitter'; |
|
|
|
import { InjectThrottlerStorage, ThrottlerStorage } from '@nestjs/throttler'; |
|
|
|
import { Prisma, Role, User } from '@prisma/client'; |
|
|
|
import { differenceInDays, subDays } from 'date-fns'; |
|
|
|
import { isNil, without } from 'lodash-es'; |
|
|
|
import { createHmac } from 'node:crypto'; |
|
|
|
|
|
|
|
@ -1,3 +1,4 @@ |
|
|
|
// Dependencies required by .config/prisma.ts in Docker container
|
|
|
|
// Dependencies required by Prisma-generated code and .config/prisma.ts in Docker container
|
|
|
|
import '@prisma/client/runtime/client'; |
|
|
|
import 'dotenv'; |
|
|
|
import 'dotenv-expand'; |
|
|
|
|
|
|
|
@ -1,6 +1,6 @@ |
|
|
|
import { SYMBOL_MAXIMUM_LENGTH } from '@ghostfolio/common/config'; |
|
|
|
import { AssetClass, DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { AssetClass, DataSource } from '@prisma/client'; |
|
|
|
import { Transform, TransformFnParams } from 'class-transformer'; |
|
|
|
import { |
|
|
|
IsEnum, |
|
|
|
|
|
|
|
@ -1,7 +1,7 @@ |
|
|
|
import { TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; |
|
|
|
import { getStartOfUtcDateOfTomorrow } from '@ghostfolio/common/helper'; |
|
|
|
import type { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Prisma } from '@prisma/client'; |
|
|
|
import { isAfter } from 'date-fns'; |
|
|
|
|
|
|
|
export const WHERE_ACCOUNT_NOT_EXCLUDED: Prisma.AccountWhereInput = { |
|
|
|
|
|
|
|
@ -2,8 +2,9 @@ import { |
|
|
|
NON_INVESTMENT_ACTIVITY_TYPES, |
|
|
|
TAG_ID_DRAFT |
|
|
|
} from '@ghostfolio/common/config'; |
|
|
|
import type { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
import { Type as ActivityType } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Prisma, Type as ActivityType } from '@prisma/client'; |
|
|
|
import { endOfToday, isAfter } from 'date-fns'; |
|
|
|
import { uniqBy } from 'lodash-es'; |
|
|
|
|
|
|
|
|
|
|
|
@ -1,6 +1,5 @@ |
|
|
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; |
|
|
|
|
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
encodeDataSource, |
|
|
|
|
|
|
|
@ -1,6 +1,7 @@ |
|
|
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; |
|
|
|
import type { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { DataSource, Prisma } from '@prisma/client'; |
|
|
|
import { isEmpty } from 'lodash-es'; |
|
|
|
import { createHash } from 'node:crypto'; |
|
|
|
|
|
|
|
|
|
|
|
@ -1,6 +1,5 @@ |
|
|
|
import { PortfolioDetails } from '@ghostfolio/common/interfaces'; |
|
|
|
|
|
|
|
import { Type as ActivityType } from '@prisma/client'; |
|
|
|
import { Type as ActivityType } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
export function convertValuesToPercentages({ |
|
|
|
accounts, |
|
|
|
|
|
|
|
@ -3,6 +3,7 @@ import { |
|
|
|
transformDataSourceInRequest |
|
|
|
} from '@ghostfolio/api/helper/data-source.helper'; |
|
|
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
CallHandler, |
|
|
|
@ -10,7 +11,6 @@ import { |
|
|
|
Injectable, |
|
|
|
NestInterceptor |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { Observable } from 'rxjs'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
|
|
|
|
@ -6,6 +6,7 @@ import { |
|
|
|
import { redactPaths } from '@ghostfolio/api/helper/object.helper'; |
|
|
|
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; |
|
|
|
import { hasRole } from '@ghostfolio/common/permissions'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { |
|
|
|
CallHandler, |
|
|
|
@ -13,7 +14,6 @@ import { |
|
|
|
Injectable, |
|
|
|
NestInterceptor |
|
|
|
} from '@nestjs/common'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { Observable } from 'rxjs'; |
|
|
|
import { map } from 'rxjs/operators'; |
|
|
|
|
|
|
|
|
|
|
|
@ -2,8 +2,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 { PortfolioDetails, RuleSettings } from '@ghostfolio/common/interfaces'; |
|
|
|
|
|
|
|
import { Account } from '@prisma/client'; |
|
|
|
import type { Account } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
export class AccountClusterRiskCurrentInvestment extends Rule<Settings> { |
|
|
|
private accounts: PortfolioDetails['accounts']; |
|
|
|
|
|
|
|
@ -5,8 +5,9 @@ import { |
|
|
|
import * as commonHelper from '@ghostfolio/common/helper'; |
|
|
|
import { parseDate } from '@ghostfolio/common/helper'; |
|
|
|
import { Activity } from '@ghostfolio/common/interfaces'; |
|
|
|
import type { AssetProfileSplit } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { AssetProfileSplit, DataSource } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
|
|
|
|
import { adjustActivityBySplits } from './asset-profile-split.helper'; |
|
|
|
|
|
|
|
@ -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 { AssetProfileSplit } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { AssetProfileSplit } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { isBefore } from 'date-fns'; |
|
|
|
|
|
|
|
|
|
|
|
@ -1,6 +1,6 @@ |
|
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
|
|
|
|
|
import { AssetProfileSplit, DataSource } from '@prisma/client'; |
|
|
|
import type { AssetProfileSplit } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { AssetProfileSplitService } from './asset-profile-split.service'; |
|
|
|
|
|
|
|
|
|
|
|
@ -1,9 +1,9 @@ |
|
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
|
import { resetHours } from '@ghostfolio/common/helper'; |
|
|
|
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; |
|
|
|
import type { AssetProfileSplit } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { AssetProfileSplit } from '@prisma/client'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
export class AssetProfileSplitService { |
|
|
|
|
|
|
|
@ -18,9 +18,9 @@ import { |
|
|
|
BenchmarkProperty, |
|
|
|
BenchmarkResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { SymbolProfile } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { addHours, isPast, subDays } from 'date-fns'; |
|
|
|
import { round, uniqBy } from 'lodash-es'; |
|
|
|
|
|
|
|
@ -10,9 +10,9 @@ import { |
|
|
|
DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY, |
|
|
|
DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT |
|
|
|
} from '@ghostfolio/common/config'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { |
|
|
|
bool, |
|
|
|
cleanEnv, |
|
|
|
|
|
|
|
@ -15,9 +15,10 @@ import { |
|
|
|
DataProviderResponse, |
|
|
|
LookupResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, OnModuleInit } from '@nestjs/common'; |
|
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
|
import Alphavantage from 'alphavantage'; |
|
|
|
import { format, isAfter, isBefore, parse } from 'date-fns'; |
|
|
|
|
|
|
|
|
|
|
|
@ -17,15 +17,15 @@ import { |
|
|
|
LookupItem, |
|
|
|
LookupResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource, |
|
|
|
SymbolProfile |
|
|
|
} from '@prisma/client'; |
|
|
|
DataSource |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; |
|
|
|
import { format, fromUnixTime, getUnixTime } from 'date-fns'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
|
|
|
|
@ -1,7 +1,7 @@ |
|
|
|
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; |
|
|
|
import type { Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { HttpException, Inject, Injectable } from '@nestjs/common'; |
|
|
|
import { Prisma } from '@prisma/client'; |
|
|
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |
|
|
|
import ms from 'ms'; |
|
|
|
|
|
|
|
|
|
|
|
@ -2,9 +2,9 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con |
|
|
|
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; |
|
|
|
import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; |
|
|
|
import { parseSymbol } from '@ghostfolio/common/helper'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { SymbolProfile } from '@prisma/client'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
export class OpenFigiDataEnhancerService implements DataEnhancerInterface { |
|
|
|
@ -24,12 +24,10 @@ export class OpenFigiDataEnhancerService implements DataEnhancerInterface { |
|
|
|
response: Partial<SymbolProfile>; |
|
|
|
symbol: string; |
|
|
|
}): Promise<Partial<SymbolProfile>> { |
|
|
|
if ( |
|
|
|
!( |
|
|
|
response.assetClass === 'EQUITY' && |
|
|
|
(response.assetSubClass === 'ETF' || response.assetSubClass === 'STOCK') |
|
|
|
) |
|
|
|
) { |
|
|
|
if (!( |
|
|
|
response.assetClass === 'EQUITY' && |
|
|
|
(response.assetSubClass === 'ETF' || response.assetSubClass === 'STOCK') |
|
|
|
)) { |
|
|
|
return response; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -7,9 +7,9 @@ import { Holding } from '@ghostfolio/common/interfaces'; |
|
|
|
import { Country } from '@ghostfolio/common/interfaces/country.interface'; |
|
|
|
import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; |
|
|
|
import { SectorName } from '@ghostfolio/common/types'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { SymbolProfile } from '@prisma/client'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
export class TrackinsightDataEnhancerService implements DataEnhancerInterface { |
|
|
|
|
|
|
|
@ -9,15 +9,14 @@ import { |
|
|
|
} from '@ghostfolio/common/config'; |
|
|
|
import { isCurrencySymbol } from '@ghostfolio/common/helper'; |
|
|
|
import { SectorName } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import type { Prisma, SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource, |
|
|
|
Prisma, |
|
|
|
SymbolProfile |
|
|
|
} from '@prisma/client'; |
|
|
|
DataSource |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { isISIN } from 'class-validator'; |
|
|
|
import YahooFinance from 'yahoo-finance2'; |
|
|
|
import type { Price } from 'yahoo-finance2/modules/quoteSummary-iface'; |
|
|
|
|
|
|
|
@ -36,10 +36,15 @@ import { |
|
|
|
MarketDataOfMarketsResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { Granularity, UserWithSettings } from '@ghostfolio/common/types'; |
|
|
|
import { |
|
|
|
type MarketData, |
|
|
|
Prisma, |
|
|
|
type SymbolProfile |
|
|
|
} from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common'; |
|
|
|
import { DataSource, MarketData, Prisma, SymbolProfile } from '@prisma/client'; |
|
|
|
import { Big } from 'big.js'; |
|
|
|
import { eachDayOfInterval, format, isValid } from 'date-fns'; |
|
|
|
import { groupBy, isEmpty, isNumber, omit, uniqWith } from 'lodash-es'; |
|
|
|
|
|
|
|
@ -22,14 +22,14 @@ import { |
|
|
|
LookupResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { MarketState } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource, |
|
|
|
SymbolProfile |
|
|
|
} from '@prisma/client'; |
|
|
|
DataSource |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; |
|
|
|
import { addDays, format, isSameDay, isToday } from 'date-fns'; |
|
|
|
import { isNumber } from 'lodash-es'; |
|
|
|
|
|
|
|
|
|
|
|
@ -29,14 +29,14 @@ import { |
|
|
|
LookupResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { MarketState } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource, |
|
|
|
SymbolProfile |
|
|
|
} from '@prisma/client'; |
|
|
|
DataSource |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; |
|
|
|
import { isISIN } from 'class-validator'; |
|
|
|
import { |
|
|
|
addDays, |
|
|
|
|
|
|
|
@ -28,9 +28,10 @@ import { |
|
|
|
QuotesResponse, |
|
|
|
SymbolItem |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
|
import { format } from 'date-fns'; |
|
|
|
import { StatusCodes } from 'http-status-codes'; |
|
|
|
|
|
|
|
|
|
|
|
@ -16,9 +16,10 @@ import { |
|
|
|
DataProviderResponse, |
|
|
|
LookupResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
|
import { format } from 'date-fns'; |
|
|
|
import { GoogleSpreadsheet } from 'google-spreadsheet'; |
|
|
|
|
|
|
|
|
|
|
|
@ -1,4 +1,4 @@ |
|
|
|
import { SymbolProfile } from '@prisma/client'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
export interface DataEnhancerInterface { |
|
|
|
enhance({ |
|
|
|
|
|
|
|
@ -6,8 +6,8 @@ import { |
|
|
|
MarketDataOfMarketsResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { Granularity } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import type { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
export interface DataProviderInterface { |
|
|
|
canHandle(symbol: string): boolean; |
|
|
|
|
|
|
|
@ -1,8 +1,7 @@ |
|
|
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
|
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; |
|
|
|
import { EnhancedAssetProfile } from '@ghostfolio/common/interfaces'; |
|
|
|
|
|
|
|
import { DataSource } from '@prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { ManualService } from './manual.service'; |
|
|
|
|
|
|
|
|
|
|
|
@ -23,10 +23,11 @@ import { |
|
|
|
LookupResponse, |
|
|
|
ScraperConfiguration |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
|
import * as cheerio from 'cheerio'; |
|
|
|
import { addDays, format, isBefore } from 'date-fns'; |
|
|
|
|
|
|
|
|
|
|
|
@ -19,10 +19,11 @@ import { |
|
|
|
DataProviderResponse, |
|
|
|
LookupResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
|
import { format } from 'date-fns'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
|
|
|
|
@ -18,10 +18,11 @@ import { |
|
|
|
LookupItem, |
|
|
|
LookupResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import type { SymbolProfile } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { utc } from '@date-fns/utc'; |
|
|
|
import { Injectable, Logger } from '@nestjs/common'; |
|
|
|
import { DataSource, SymbolProfile } from '@prisma/client'; |
|
|
|
import { addDays, format, isSameDay } from 'date-fns'; |
|
|
|
import { ReasonPhrases, StatusCodes } from 'http-status-codes'; |
|
|
|
import { uniqBy } from 'lodash-es'; |
|
|
|
|
|
|
|
@ -11,8 +11,8 @@ import { |
|
|
|
scopes |
|
|
|
} from '@ghostfolio/common/scopes'; |
|
|
|
import type { UserWithSettings } from '@ghostfolio/common/types'; |
|
|
|
import type { Access } from '@ghostfolio/prisma/client'; |
|
|
|
|
|
|
|
import { Access } from '@prisma/client'; |
|
|
|
import { addDays, subDays } from 'date-fns'; |
|
|
|
|
|
|
|
import { ImpersonationService } from './impersonation.service'; |
|
|
|
|
|
|
|
@ -14,9 +14,10 @@ import type { |
|
|
|
ImpersonationContext, |
|
|
|
UserWithSettings |
|
|
|
} from '@ghostfolio/common/types'; |
|
|
|
import type { Access } from '@ghostfolio/prisma/client'; |
|
|
|
import { AccessType } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { Access, AccessType } from '@prisma/client'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
export class ImpersonationService { |
|
|
|
|
|
|
|
@ -4,14 +4,10 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
|
|
|
import { DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_TIMEOUT } from '@ghostfolio/common/config'; |
|
|
|
import { resetHours } from '@ghostfolio/common/helper'; |
|
|
|
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; |
|
|
|
import type { MarketData, Prisma } from '@ghostfolio/prisma/client'; |
|
|
|
import { DataSource, MarketDataState } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { |
|
|
|
DataSource, |
|
|
|
MarketData, |
|
|
|
MarketDataState, |
|
|
|
Prisma |
|
|
|
} from '@prisma/client'; |
|
|
|
|
|
|
|
@Injectable() |
|
|
|
export class MarketDataService { |
|
|
|
|
|
|
|
@ -1,4 +1,4 @@ |
|
|
|
import { AssetClass, AssetSubClass } from '@prisma/client'; |
|
|
|
import type { AssetClass, AssetSubClass } from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { DataSourceTableContext } from './data-source-table-context.interface'; |
|
|
|
|
|
|
|
|
|
|
|
@ -17,8 +17,11 @@ import { |
|
|
|
WatchlistResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { AccountWithValue } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { PortfolioTableService } from './portfolio-table.service'; |
|
|
|
|
|
|
|
|
|
|
|
@ -18,14 +18,14 @@ import { |
|
|
|
WatchlistResponse |
|
|
|
} from '@ghostfolio/common/interfaces'; |
|
|
|
import { AccountWithValue, DateRange } from '@ghostfolio/common/types'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { |
|
|
|
AssetClass, |
|
|
|
AssetSubClass, |
|
|
|
DataSource, |
|
|
|
Type as ActivityType |
|
|
|
} from '@prisma/client'; |
|
|
|
} from '@ghostfolio/prisma/enums'; |
|
|
|
|
|
|
|
import { Injectable } from '@nestjs/common'; |
|
|
|
import { format } from 'date-fns'; |
|
|
|
|
|
|
|
import { DataSourceTableContext } from './interfaces/data-source-table-context.interface'; |
|
|
|
|