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,7 +1,9 @@
import { Injectable } from '@nestjs/common';
import type { InvestmentResourceMetaDto } from '../../investment-resource.dto';
import { tbankSourceNeedsRefresh } from '../../../../integrations/tbank/tbank.api';
import { investmentResourceMeta } from '../../investment-resource.mapper';
import type { InvestmentResourceMetaDto } from '../../investment-resource.dto';
import {
ForecastRepository,
type ForecastSourceVersion,
@@ -12,16 +14,16 @@ export class ForecastService {
constructor(private readonly repository: ForecastRepository) {}
async result<T extends object>(input: {
userId: string;
revision: string;
membershipRevision: number;
scopeKey: string;
portfolio: InvestmentResourceMetaDto;
sources: {
version: ForecastSourceVersion | null;
meta: InvestmentResourceMetaDto;
}[];
candidate?: T;
membershipRevision: number;
portfolio: InvestmentResourceMetaDto;
revision: string;
scopeKey: string;
sources: {
meta: InvestmentResourceMetaDto;
version: ForecastSourceVersion | null;
}[];
userId: string;
}) {
const dependencies = [
input.portfolio,
@@ -31,8 +33,8 @@ export class ForecastService {
...input,
portfolioProjection: input.portfolio.dataRevision,
portfolios: (input.portfolio.dependencies ?? []).flatMap((dependency) =>
dependency.resourceKey.startsWith('portfolio/')
? [
dependency.resourceKey.startsWith('portfolio/') ?
[
{
accountId: decodeURIComponent(
dependency.resourceKey.slice('portfolio/'.length),
@@ -41,65 +43,65 @@ export class ForecastService {
(dependency as InvestmentResourceMetaDto).dataRevision,
),
},
]
: [],
] :
[],
),
sources: input.sources.flatMap((source) =>
source.version ? [source.version] : [],
),
timestamps: dependencies.flatMap((dependency) =>
dependency.lastSuccessfulAt
? [
dependency.lastSuccessfulAt ?
[
{
resourceKey: dependency.resourceKey,
at: dependency.lastSuccessfulAt,
},
]
: [],
] :
[],
),
});
const timestamps = stored?.sourceTimestamps as
{ resourceKey: string; at: string }[] | undefined;
undefined | { at: string; resourceKey: string }[];
const first = timestamps?.map((entry) => entry.at).sort()[0];
const work =
dependencies
.map((dependency) => dependency.sync)
.find((sync) => sync.state === 'running') ??
dependencies
.map((dependency) => dependency.sync)
.find((sync) => sync.state === 'failed');
dependencies
.map((dependency) => dependency.sync)
.find((sync) => sync.state === 'failed');
const payload = stored ? (stored.payload as T) : null;
const data =
payload &&
'positionIsStale' in payload &&
'positionAt' in payload &&
typeof payload.positionAt === 'string'
? {
typeof payload.positionAt === 'string' ?
{
...payload,
positionIsStale: tbankSourceNeedsRefresh(
'portfolio',
new Date(payload.positionAt),
new Date(Date.now()),
),
}
: payload;
} :
payload;
return {
data,
meta: investmentResourceMeta({
resourceKey: input.scopeKey,
dataRevision: String(stored?.dataRevision ?? 0),
availability: stored
? 'complete'
: dependencies.some(
(dependency) => dependency.availability !== 'missing',
)
? 'partial'
: 'missing',
availability: stored ?
'complete' :
dependencies.some(
(dependency) => dependency.availability !== 'missing',
) ?
'partial' :
'missing',
fetchedAt: first ? new Date(first) : null,
freshForMs:
data && 'positionIsStale' in data && data.positionIsStale === true
? 0
: Number.POSITIVE_INFINITY,
data && 'positionIsStale' in data && data.positionIsStale === true ?
0 :
Number.POSITIVE_INFINITY,
work: work?.id ? { ...work, id: work.id } : null,
dependencies,
}),