Browse Source

introduce filters in acount endpoint

pull/3763/head
Shaunak Das 12 months ago
parent
commit
460d908b60
  1. 13
      apps/api/src/app/account/account.controller.ts
  2. 2
      apps/api/src/app/account/account.module.ts
  3. 21
      apps/api/src/app/portfolio/portfolio.service.ts

13
apps/api/src/app/account/account.controller.ts

@ -3,6 +3,7 @@ import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.servic
import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator';
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard';
import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.interceptor';
import { ApiService } from '@ghostfolio/api/services/api/api.service';
import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service';
import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config';
import {
@ -26,6 +27,7 @@ import {
Param,
Post,
Put,
Query,
UseGuards,
UseInterceptors
} from '@nestjs/common';
@ -44,6 +46,7 @@ export class AccountController {
public constructor(
private readonly accountBalanceService: AccountBalanceService,
private readonly accountService: AccountService,
private readonly apiService: ApiService,
private readonly impersonationService: ImpersonationService,
private readonly portfolioService: PortfolioService,
@Inject(REQUEST) private readonly request: RequestWithUser
@ -85,12 +88,20 @@ export class AccountController {
@UseGuards(AuthGuard('jwt'), HasPermissionGuard)
@UseInterceptors(RedactValuesInResponseInterceptor)
public async getAllAccounts(
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId,
@Query('dataSource') filterByDataSource?: string,
@Query('symbol') filterBySymbol?: string
): Promise<Accounts> {
const impersonationUserId =
await this.impersonationService.validateImpersonationId(impersonationId);
const filters = this.apiService.buildFiltersFromQueryParams({
filterByDataSource,
filterBySymbol
});
return this.portfolioService.getAccountsWithAggregations({
filters,
userId: impersonationUserId || this.request.user.id,
withExcludedAccounts: true
});

2
apps/api/src/app/account/account.module.ts

@ -1,6 +1,7 @@
import { AccountBalanceModule } from '@ghostfolio/api/app/account-balance/account-balance.module';
import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module';
import { RedactValuesInResponseModule } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.module';
import { ApiModule } from '@ghostfolio/api/services/api/api.module';
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module';
@ -16,6 +17,7 @@ import { AccountService } from './account.service';
exports: [AccountService],
imports: [
AccountBalanceModule,
ApiModule,
ConfigurationModule,
ExchangeRateDataModule,
ImpersonationModule,

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

@ -119,6 +119,27 @@ export class PortfolioService {
return type === 'ACCOUNT';
});
const dataSourceFilter = filters?.find(({ type }) => {
return type === 'DATA_SOURCE';
});
const symbolFilter = filters?.find(({ type }) => {
return type === 'SYMBOL';
});
if (dataSourceFilter && symbolFilter) {
where.Order = {
some: {
SymbolProfile: {
AND: [
{ dataSource: <DataSource>dataSourceFilter.id },
{ symbol: symbolFilter.id }
]
}
}
};
}
if (accountFilter) {
where.id = accountFilter.id;
}

Loading…
Cancel
Save