chore: strengthen backend eslint profile

This commit is contained in:
2026-09-28 16:37:01 +03:00
committed by ksv741
parent 53b2794963
commit a970eaaf7a
179 changed files with 4485 additions and 2716 deletions
@@ -1,4 +1,5 @@
import { InvestmentReadQueryDto } from '../../../investment-resource.dto';
import type { Request } from 'express';
import {
Controller,
Get,
@@ -9,24 +10,25 @@ import {
UseGuards,
} from '@nestjs/common';
import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger';
import type { Request } from 'express';
import { ApiProblemResponses } from '../../../../../common/decorators/api-safe-error-response.decorator';
import { AccessPayload, JwtAuthGuard } from '../../../../auth/auth.api';
import { InvestmentReadQueryDto } from '../../../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 {
BondCandlesResourceDto,
BondCandlesQueryDto,
BondCandlesResourceDto,
BondCouponsResourceDto,
BondResourceDto,
BondMetricsResourceDto,
BondPositionResourceDto,
BondQuoteResourceDto,
BondResourceDto,
BondSearchQueryDto,
BondSearchResourceDto,
BondTickerParamsDto,
} from './bond.dto';
import { BondCatalogService } from '../application/bond-catalog.service';
@ApiTags('bonds')
@ApiProblemResponses()
@@ -39,6 +41,7 @@ export class BondController {
private readonly market: BondMarketService,
private readonly income: BondIncomeService,
) {}
@Get(':uid/metrics')
@ApiOkResponse({ type: BondMetricsResourceDto })
metrics(
@@ -48,6 +51,7 @@ export class BondController {
) {
return this.income.metrics(request.user.sub, uid, query.sync === 'observe');
}
@Get()
@ApiOkResponse({ type: BondSearchResourceDto })
search(
@@ -60,6 +64,7 @@ export class BondController {
query.sync === 'observe',
);
}
@Get('by-ticker/:ticker')
@ApiOkResponse({ type: BondResourceDto })
getByTicker(
@@ -73,6 +78,7 @@ export class BondController {
query.sync === 'observe',
);
}
@Get(':uid')
@ApiOkResponse({ type: BondResourceDto })
get(
@@ -82,6 +88,7 @@ export class BondController {
) {
return this.bonds.get(request.user.sub, uid, query.sync === 'observe');
}
@Get(':uid/quote')
@ApiOkResponse({ type: BondQuoteResourceDto })
quote(
@@ -91,6 +98,7 @@ export class BondController {
) {
return this.market.quote(request.user.sub, uid, query.sync === 'observe');
}
@Get(':uid/candles')
@ApiOkResponse({ type: BondCandlesResourceDto })
candles(
@@ -105,6 +113,7 @@ export class BondController {
query.sync === 'observe',
);
}
@Get(':uid/position')
@ApiOkResponse({ type: BondPositionResourceDto })
position(
@@ -118,6 +127,7 @@ export class BondController {
query.sync === 'observe',
);
}
@Get(':uid/coupons')
@ApiOkResponse({ type: BondCouponsResourceDto })
coupons(
@@ -1,7 +1,7 @@
import { InvestmentResourceMetaDto } from '../../../investment-resource.dto';
import { ApiProperty } from '@nestjs/swagger';
import { MoneyDto } from '../../../../../common/money.dto';
import { MoneyDto } from '../../../../../common/money.dto';
import { InvestmentResourceMetaDto } from '../../../investment-resource.dto';
import {
StockCandlesDto,
StockCandlesQueryDto,
@@ -20,44 +20,61 @@ export class BondDto {
description: 'Unambiguous ticker URL segment, or the exact instrument UID.',
})
declare slug: string;
@ApiProperty() declare name: string;
@ApiProperty({ type: String, nullable: true }) declare isin: string | null;
@ApiProperty({ type: String, nullable: true }) declare isin: null | string;
@ApiProperty({ type: String, nullable: true }) declare classCode:
string | null;
null | string;
@ApiProperty({ type: String, nullable: true }) declare realExchange:
string | null;
null | string;
@ApiProperty({ type: Boolean, nullable: true }) declare apiTradeAvailable:
boolean | null;
@ApiProperty({ type: String, nullable: true }) declare ticker: string | null;
@ApiProperty({ type: String, nullable: true }) declare ticker: null | string;
@ApiProperty({ type: String, nullable: true }) declare logoName:
string | null;
null | string;
@ApiProperty({ type: String, nullable: true }) declare currency:
string | null;
@ApiProperty({ type: String, nullable: true }) declare sector: string | null;
@ApiProperty({ type: Number, nullable: true }) declare lot: number | null;
null | string;
@ApiProperty({ type: String, nullable: true }) declare sector: null | string;
@ApiProperty({ type: Number, nullable: true }) declare lot: null | number;
@ApiProperty({ type: String, nullable: true, format: 'date-time' })
declare historyFrom: string | null;
declare historyFrom: null | string;
@ApiProperty({ type: MoneyDto, nullable: true })
declare nominal: MoneyDto | null;
@ApiProperty({ type: MoneyDto, nullable: true })
declare initialNominal: MoneyDto | null;
@ApiProperty({ type: MoneyDto, nullable: true }) declare aci: MoneyDto | null;
@ApiProperty({ type: String, nullable: true }) declare maturityDate:
string | null;
null | string;
@ApiProperty({ type: String, nullable: true }) declare callDate:
string | null;
null | string;
@ApiProperty({ type: String, nullable: true }) declare bondType:
string | null;
null | string;
@ApiProperty({ type: String, nullable: true }) declare riskLevel:
string | null;
null | string;
@ApiProperty({ type: Number, nullable: true }) declare couponQuantityPerYear:
number | null;
null | number;
@ApiProperty({ type: Boolean, nullable: true }) declare floatingCoupon:
boolean | null;
@ApiProperty({ type: Boolean, nullable: true }) declare perpetual:
boolean | null;
@ApiProperty({ type: Boolean, nullable: true }) declare amortization:
boolean | null;
@ApiProperty({ type: Boolean, nullable: true }) declare subordinated:
boolean | null;
}
@@ -68,13 +85,15 @@ export class BondSearchResultDto extends BondDto {
nullable: true,
description: 'Clean price in percent of nominal, not money.',
})
declare pricePercent: string | null;
declare pricePercent: null | string;
@ApiProperty({ type: String, nullable: true, format: 'date-time' })
declare priceAt: string | null;
declare priceAt: null | string;
}
export class BondQuoteDto {
@ApiProperty({ type: String, nullable: true }) declare pricePercent:
string | null;
null | string;
@ApiProperty({
type: MoneyDto,
nullable: true,
@@ -82,6 +101,7 @@ export class BondQuoteDto {
'Indicative clean value at the current nominal; no FX conversion.',
})
declare cleanPrice: MoneyDto | null;
@ApiProperty({ type: MoneyDto, nullable: true }) declare aci: MoneyDto | null;
@ApiProperty({
type: MoneyDto,
@@ -90,41 +110,53 @@ export class BondQuoteDto {
'Indicative clean value plus current accrued interest, excluding fees.',
})
declare dirtyPrice: MoneyDto | null;
@ApiProperty({ type: String, nullable: true })
declare changePercentagePoints: string | null;
declare changePercentagePoints: null | string;
@ApiProperty({ type: String, nullable: true }) declare previousCloseDate:
string | null;
null | string;
@ApiProperty({ type: String, nullable: true }) declare tradingStatus:
string | null;
null | string;
@ApiProperty({ type: String, nullable: true, format: 'date-time' })
declare priceAt: string | null;
@ApiProperty({ type: [String] }) declare unavailable: string[];
declare priceAt: null | string;
@ApiProperty({ type: String, isArray: true }) declare unavailable: string[];
@ApiProperty({ format: 'date-time' }) declare observedAt: string;
}
export class BondCouponDto {
@ApiProperty({ type: String, nullable: true }) declare number: string | null;
@ApiProperty({ type: String, nullable: true }) declare number: null | string;
@ApiProperty({ type: String, nullable: true }) declare paymentDate:
string | null;
null | string;
@ApiProperty({ type: String, nullable: true }) declare recordDate:
string | null;
null | string;
@ApiProperty({ type: String, nullable: true }) declare couponType:
string | null;
null | string;
@ApiProperty({ type: Number, nullable: true }) declare periodDays:
number | null;
null | number;
@ApiProperty({ type: MoneyDto, nullable: true })
declare perBond: MoneyDto | null;
@ApiProperty({ type: MoneyDto, nullable: true })
declare estimatedAmount: MoneyDto | null;
@ApiProperty({ enum: ['upcoming', 'past', 'undated'] }) declare timing:
'upcoming' | 'past' | 'undated';
'past' | 'undated' | 'upcoming';
}
export class BondCouponsDto {
@ApiProperty({ type: [BondCouponDto] }) declare coupons: BondCouponDto[];
@ApiProperty({ type: BondCouponDto, isArray: true }) declare coupons: BondCouponDto[];
@ApiProperty() declare from: string;
@ApiProperty() declare to: string;
@ApiProperty() declare observedAt: string;
@ApiProperty({ type: String, nullable: true }) declare positionAt:
string | null;
null | string;
@ApiProperty() declare estimateUnavailable: boolean;
@ApiProperty() declare positionIsStale: boolean;
}
@@ -132,6 +164,7 @@ export class BondCouponsDto {
export class BondYieldDto {
@ApiProperty({ description: 'MOEX effective annual yield in percent.' })
declare value: string;
@ApiProperty() declare pricePercent: string;
@ApiProperty({ format: 'date' }) declare date: string;
@ApiProperty({
@@ -139,14 +172,16 @@ export class BondYieldDto {
nullable: true,
description: 'MOEX yield target, e.g. MATDATE or OFFERDATE.',
})
declare dateType: string | null;
declare dateType: null | string;
@ApiProperty({ format: 'date-time' }) declare tradeAt: string;
}
export class BondCreditRatingDto {
@ApiProperty({ enum: ['NCR'] }) declare agency: 'NCR';
@ApiProperty({ type: String, nullable: true }) declare value: string | null;
@ApiProperty({ type: String, nullable: true }) declare value: null | string;
@ApiProperty({ enum: ['active', 'withdrawn'] }) declare status:
'active' | 'withdrawn';
@ApiProperty({ format: 'date' }) declare date: string;
@ApiProperty({ format: 'uri' }) declare sourceUrl: string;
@ApiProperty({ format: 'date-time' }) declare observedAt: string;
@@ -154,39 +189,50 @@ export class BondCreditRatingDto {
export class BondMetricsDto {
@ApiProperty({ type: BondCreditRatingDto, nullable: true })
declare creditRating: BondCreditRatingDto | null;
@ApiProperty({ type: MoneyDto, nullable: true })
declare coupon: MoneyDto | null;
@ApiProperty({ type: String, nullable: true, format: 'date' })
declare couponDate: string | null;
declare couponDate: null | string;
@ApiProperty({ type: String, nullable: true }) declare couponType:
string | null;
null | string;
@ApiProperty({ type: Number, nullable: true }) declare couponPeriodDays:
number | null;
null | number;
@ApiProperty({
type: String,
nullable: true,
description:
'Next coupon × 365 / period days / indicative clean price × 100. Not yield to maturity.',
})
declare couponYieldPercent: string | null;
declare couponYieldPercent: null | string;
@ApiProperty({ type: String, nullable: true, format: 'date-time' })
declare couponYieldPriceAt: string | null;
declare couponYieldPriceAt: null | string;
@ApiProperty({ type: BondYieldDto, nullable: true })
declare effectiveYield: BondYieldDto | null;
@ApiProperty({ type: [String] }) declare unavailable: string[];
@ApiProperty({ type: String, isArray: true }) declare unavailable: string[];
@ApiProperty({ format: 'date-time' }) declare observedAt: string;
}
export class BondPositionResourceDto {
@ApiProperty({ type: BondPositionDto, nullable: true })
declare data: BondPositionDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
export class BondSearchResourceDto {
// eslint-disable-next-line @darraghor/nestjs-typed/api-property-returning-array-should-set-array -- Nullable array union requires isArray in the explicit wire schema.
@ApiProperty({ type: BondSearchResultDto, isArray: true, nullable: true })
declare data: BondSearchResultDto[] | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
@@ -200,6 +246,7 @@ export class BondResourceDto {
export class BondQuoteResourceDto {
@ApiProperty({ type: BondQuoteDto, nullable: true })
declare data: BondQuoteDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
@@ -207,6 +254,7 @@ export class BondQuoteResourceDto {
export class BondMetricsResourceDto {
@ApiProperty({ type: BondMetricsDto, nullable: true })
declare data: BondMetricsDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
@@ -214,6 +262,7 @@ export class BondMetricsResourceDto {
export class BondCandlesResourceDto {
@ApiProperty({ type: BondCandlesDto, nullable: true })
declare data: BondCandlesDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}
@@ -221,6 +270,7 @@ export class BondCandlesResourceDto {
export class BondCouponsResourceDto {
@ApiProperty({ type: BondCouponsDto, nullable: true })
declare data: BondCouponsDto | null;
@ApiProperty({ type: InvestmentResourceMetaDto })
declare meta: InvestmentResourceMetaDto;
}