refactor: check persisted json payload shape instead of double casts (#152) (#154)
Backend verify / commits (push) Skipped
Backend verify / security (push) Successful in 59s
Backend verify / verify (push) Failing after 6m3s

This commit was merged in pull request #154.
This commit is contained in:
2026-11-02 07:31:24 +03:00
parent a18d9dbdc8
commit a80bbbf1e2
6 changed files with 70 additions and 21 deletions
@@ -4,6 +4,8 @@ import {
} from '@nestjs/common';
import { randomUUID } from 'node:crypto';
import type { Prisma } from '../../../../../generated/prisma/client';
import { StructuredLogger } from '../../../../common/logging/structured-logger.service';
import { isTbankErrorCode, TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code';
import {
@@ -26,6 +28,7 @@ import { sumMoneyByCurrency } from '../domain/portfolio-totals';
import {
portfolioFreshForMs,
PortfolioRepository,
portfolioSnapshot,
portfolioWorkKey,
} from '../infrastructure/portfolio.repository';
import { mapPortfolio } from '../infrastructure/tbank-portfolio.mapper';
@@ -88,18 +91,7 @@ export class PortfolioService {
type: account.type,
openedOn: account.openedOn,
snapshot: account.portfolio
? {
...(account.portfolio.payload as unknown as PortfolioDto),
positions: (account.portfolio.payload as unknown as PortfolioDto).positions.map((position) => ({
...position,
sector: position.sector ?? null,
issuer: position.issuer ?? null,
})),
lastSuccessfulAt: account.portfolio.fetchedAt.toISOString(),
isStale:
Date.now() - account.portfolio.fetchedAt.valueOf() >=
portfolioFreshForMs,
}
? savedSnapshot(account.portfolio)
: null,
meta: investmentResourceMeta({
resourceKey: `portfolio/${encodeURIComponent(account.accountId)}`,
@@ -326,3 +318,17 @@ export class PortfolioService {
return mapPortfolio(upstream, money, savedMetadata, lastSuccessfulAt, classifications);
}
}
function savedSnapshot(saved: { fetchedAt: Date; payload: Prisma.JsonValue }): PortfolioDto {
const snapshot = portfolioSnapshot(saved.payload);
return {
...snapshot,
positions: snapshot.positions.map((position) => ({
...position,
sector: position.sector ?? null,
issuer: position.issuer ?? null,
})),
lastSuccessfulAt: saved.fetchedAt.toISOString(),
isStale: Date.now() - saved.fetchedAt.valueOf() >= portfolioFreshForMs,
};
}