feat: add stock screener
This commit is contained in:
@@ -1,15 +1,21 @@
|
||||
import type { Request } from 'express';
|
||||
|
||||
import {
|
||||
BadRequestException,
|
||||
Body,
|
||||
Controller,
|
||||
Get,
|
||||
HttpCode,
|
||||
HttpStatus,
|
||||
Param,
|
||||
ParseUUIDPipe,
|
||||
Post,
|
||||
Query,
|
||||
Req,
|
||||
UseGuards,
|
||||
ValidationPipe,
|
||||
} from '@nestjs/common';
|
||||
import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger';
|
||||
import { ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
|
||||
|
||||
import { ApiProblemResponses } from '../../../../../common/decorators/api-safe-error-response.decorator';
|
||||
import { AccessPayload, JwtAuthGuard } from '../../../../auth/auth.api';
|
||||
@@ -18,6 +24,7 @@ import { GetStockCompanyUseCase } from '../application/get-stock-company.use-cas
|
||||
import { StockCatalogService } from '../application/stock-catalog.service';
|
||||
import { StockIncomeService } from '../application/stock-income.service';
|
||||
import { StockMarketService } from '../application/stock-market.service';
|
||||
import { StockScreenerService } from '../application/stock-screener.service';
|
||||
import {
|
||||
StockCandlesQueryDto,
|
||||
StockCandlesResourceDto,
|
||||
@@ -26,6 +33,9 @@ import {
|
||||
StockPositionResourceDto,
|
||||
StockQuoteResourceDto,
|
||||
StockResourceDto,
|
||||
StockScreenerCriteriaDto,
|
||||
StockScreenerPageDto,
|
||||
StockScreenerPageQueryDto,
|
||||
StockSearchQueryDto,
|
||||
StockSearchResourceDto,
|
||||
StockTickerParamsDto,
|
||||
@@ -42,6 +52,7 @@ export class StockController {
|
||||
private readonly market: StockMarketService,
|
||||
private readonly income: StockIncomeService,
|
||||
private readonly companyInfo: GetStockCompanyUseCase,
|
||||
private readonly screener: StockScreenerService,
|
||||
) {}
|
||||
|
||||
@Get()
|
||||
@@ -71,6 +82,33 @@ export class StockController {
|
||||
);
|
||||
}
|
||||
|
||||
@Post('screener/search')
|
||||
@HttpCode(HttpStatus.OK)
|
||||
@ApiOperation({ operationId: 'createStockScreenerSearch' })
|
||||
@ApiOkResponse({ type: StockScreenerPageDto })
|
||||
searchScreener(
|
||||
@Req() request: Request & { user: AccessPayload },
|
||||
@Body(new ValidationPipe({ forbidNonWhitelisted: true, forbidUnknownValues: true, whitelist: true }))
|
||||
criteria: StockScreenerCriteriaDto,
|
||||
) {
|
||||
const allowed = new Set(['countryOfRisk', 'currency', 'maxLot', 'query', 'realExchange', 'sector', 'shareType']);
|
||||
if (Object.keys(request.body as object).some((key) => !allowed.has(key))) {
|
||||
throw new BadRequestException();
|
||||
}
|
||||
return this.screener.search(request.user.sub, criteria);
|
||||
}
|
||||
|
||||
@Get('screener/search/:searchId')
|
||||
@ApiOperation({ operationId: 'readStockScreenerPage' })
|
||||
@ApiOkResponse({ type: StockScreenerPageDto })
|
||||
pageScreener(
|
||||
@Req() request: Request & { user: AccessPayload },
|
||||
@Param('searchId') searchId: string,
|
||||
@Query() query: StockScreenerPageQueryDto,
|
||||
) {
|
||||
return this.screener.page(request.user.sub, searchId, query.page);
|
||||
}
|
||||
|
||||
@Get(':uid')
|
||||
@ApiOkResponse({ type: StockResourceDto })
|
||||
get(
|
||||
|
||||
Reference in New Issue
Block a user