Files
backend/src/modules/investments/instruments/bonds/presentation/bond.controller.ts
T
ksv741 e7f75ebda1
Backend verify / commits (pull_request) Successful in 1m28s
Backend verify / security (pull_request) Canceled after 0s
Backend verify / verify (pull_request) Canceled after 0s
refactor: replace deep imports with native node aliases (WealthLedger/backend#165)
2026-11-04 14:28:52 +03:00

137 lines
3.8 KiB
TypeScript

import type { Request } from 'express';
import {
Controller,
Get,
Param,
ParseUUIDPipe,
Query,
Req,
UseGuards,
} from '@nestjs/common';
import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger';
import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator';
import { AccessPayload, JwtAuthGuard } from '#src/modules/auth/auth.api';
import { InvestmentReadQueryDto } from '#src/modules/investments/investment-resource.dto';
import { BondCatalogService } from '../application/bond-catalog.service';
import { BondIncomeService } from '../application/bond-income.service';
import { BondMarketService } from '../application/bond-market.service';
import {
BondCandlesQueryDto,
BondCandlesResourceDto,
BondCouponsResourceDto,
BondMetricsResourceDto,
BondPositionResourceDto,
BondQuoteResourceDto,
BondResourceDto,
BondSearchQueryDto,
BondSearchResourceDto,
BondTickerParamsDto,
} from './bond.dto';
@ApiTags('bonds')
@ApiProblemResponses()
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@Controller('bonds')
export class BondController {
constructor(
private readonly bonds: BondCatalogService,
private readonly market: BondMarketService,
private readonly income: BondIncomeService,
) {}
@Get(':uid/metrics')
@ApiOkResponse({ type: BondMetricsResourceDto })
metrics(
@Req() request: Request & { user: AccessPayload },
@Param('uid', new ParseUUIDPipe()) uid: string,
@Query() query: InvestmentReadQueryDto,
) {
return this.income.metrics(request.user.sub, uid, query.sync === 'observe');
}
@Get()
@ApiOkResponse({ type: BondSearchResourceDto })
search(
@Req() request: Request & { user: AccessPayload },
@Query() query: BondSearchQueryDto,
) {
return this.bonds.search(
request.user.sub,
query.query,
query.sync === 'observe',
);
}
@Get('by-ticker/:ticker')
@ApiOkResponse({ type: BondResourceDto })
getByTicker(
@Req() request: Request & { user: AccessPayload },
@Param() params: BondTickerParamsDto,
@Query() query: InvestmentReadQueryDto,
) {
return this.bonds.getByTicker(
request.user.sub,
params.ticker,
query.sync === 'observe',
);
}
@Get(':uid')
@ApiOkResponse({ type: BondResourceDto })
get(
@Req() request: Request & { user: AccessPayload },
@Param('uid', new ParseUUIDPipe()) uid: string,
@Query() query: InvestmentReadQueryDto,
) {
return this.bonds.get(request.user.sub, uid, query.sync === 'observe');
}
@Get(':uid/quote')
@ApiOkResponse({ type: BondQuoteResourceDto })
quote(
@Req() request: Request & { user: AccessPayload },
@Param('uid', new ParseUUIDPipe()) uid: string,
@Query() query: InvestmentReadQueryDto,
) {
return this.market.quote(request.user.sub, uid, query.sync === 'observe');
}
@Get(':uid/candles')
@ApiOkResponse({ type: BondCandlesResourceDto })
candles(
@Req() request: Request & { user: AccessPayload },
@Param('uid', new ParseUUIDPipe()) uid: string,
@Query() query: BondCandlesQueryDto,
) {
return this.market.candles(
request.user.sub,
uid,
query.period,
query.sync === 'observe',
);
}
@Get(':uid/position')
@ApiOkResponse({ type: BondPositionResourceDto })
position(
@Req() request: Request & { user: AccessPayload },
@Param('uid', new ParseUUIDPipe()) uid: string,
) {
return this.income.readPosition(request.user.sub, uid);
}
@Get(':uid/coupons')
@ApiOkResponse({ type: BondCouponsResourceDto })
coupons(
@Req() request: Request & { user: AccessPayload },
@Param('uid', new ParseUUIDPipe()) uid: string,
@Query() query: InvestmentReadQueryDto,
) {
return this.income.coupons(request.user.sub, uid, query.sync === 'observe');
}
}