refactor: share prisma json codec and check progress shape (WealthLedger/backend#170) (#191)
Backend verify / commits (push) Skipped
Backend verify / security (push) Successful in 1m5s
Backend verify / verify (push) Failing after 7m21s

This commit was merged in pull request #191.
This commit is contained in:
2026-11-04 22:28:11 +03:00
parent cd78b43783
commit 85a71967fa
10 changed files with 196 additions and 59 deletions
@@ -12,6 +12,7 @@ import {
type TbankSyncAttempt,
} from '../../../../integrations/tbank/tbank.api';
import { PrismaService } from '../../../../prisma/prisma.service';
import { toJson } from '../../../../prisma/to-json';
import {
type CandleRange,
confirmedCandleCoverage,
@@ -118,7 +119,7 @@ export class CandleRepository {
processRunId: runId,
state: 'running',
priority,
intent: JSON.parse(JSON.stringify(intent)) as Prisma.InputJsonObject,
intent: toJson(intent),
progress: {},
errorCode: null,
};
@@ -176,9 +177,7 @@ export class CandleRepository {
sourceKey: 'candles',
itemKey: key,
};
const payload = JSON.parse(
JSON.stringify({ range, candles: rows, fetchedAt }),
) as Prisma.InputJsonObject;
const payload = toJson({ range, candles: rows, fetchedAt });
await tx.tbankSyncStage.upsert({
where: { workId_attemptId_sourceKey_itemKey: identity },
create: { ...identity, payload },
@@ -2,12 +2,11 @@ import { Injectable } from '@nestjs/common';
import { randomUUID } from 'node:crypto';
import { isDeepStrictEqual } from 'node:util';
import type { Prisma } from '../../../../../generated/prisma/client';
import { TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code';
import { claimSyncWork, lockConnectionGeneration } from '../../../../integrations/tbank/tbank-sync-claim';
import { isJoinableRunningAttempt, type TbankBond, type TbankShare, type TbankSyncAttempt } from '../../../../integrations/tbank/tbank.api';
import { PrismaService } from '../../../../prisma/prisma.service';
import { toJson } from '../../../../prisma/to-json';
const UNCHANGED_REVISION_INCREMENT = 0;
const REVISION_INCREMENT = 1;
@@ -172,9 +171,7 @@ export class CatalogDiscoveryRepository {
progress: {},
});
if (!claimed) return false;
const payload = JSON.parse(
JSON.stringify(value),
) as Prisma.InputJsonObject;
const payload = toJson(value);
const identity = { provider, uid: input.uid };
await tx.tbankInstrument.upsert({
where: { provider_uid: identity },
@@ -197,12 +194,10 @@ export class CatalogDiscoveryRepository {
const previous = await tx.tbankInstrument.findUniqueOrThrow({
where: { provider_uid: identity },
});
const metadata = JSON.parse(
JSON.stringify({
...instrument,
instrumentType: input.instrumentType,
}),
) as Prisma.InputJsonObject;
const metadata = toJson({
...instrument,
instrumentType: input.instrumentType,
});
await tx.tbankInstrument.update({
where: { provider_uid: identity },
data: {
@@ -341,22 +336,20 @@ export class CatalogDiscoveryRepository {
for (const instrument of instruments) {
// Discovery can create a minimal identity, but cannot overwrite verified metadata.
const identity = { provider, uid: instrument.uid };
const payload = JSON.parse(
JSON.stringify({
uid: instrument.uid,
figi: instrument.figi,
ticker: instrument.ticker,
name: instrument.name,
isin: instrument.isin,
classCode: instrument.classCode,
instrumentKind: instrument.instrumentKind,
apiTradeAvailableFlag: instrument.apiTradeAvailableFlag,
currency: instrument.currency,
brand: instrument.brand
? { logoName: instrument.brand.logoName }
: undefined,
}),
) as Prisma.InputJsonObject;
const payload = toJson({
uid: instrument.uid,
figi: instrument.figi,
ticker: instrument.ticker,
name: instrument.name,
isin: instrument.isin,
classCode: instrument.classCode,
instrumentKind: instrument.instrumentKind,
apiTradeAvailableFlag: instrument.apiTradeAvailableFlag,
currency: instrument.currency,
brand: instrument.brand
? { logoName: instrument.brand.logoName }
: undefined,
});
await tx.tbankInstrument.upsert({
where: { provider_uid: identity },
update: {},