feat: reconcile hourly investment resource states

This commit is contained in:
2026-10-09 23:10:50 +03:00
committed by ksv741
parent 5d857de7a5
commit 323b83b582
25 changed files with 445 additions and 86 deletions
@@ -106,7 +106,7 @@ export class CandleService {
true,
['detail'],
);
if (detail.meta.availability === 'complete' && !detail.instrument) {
if (detail.meta.completeness === 'complete' && !detail.instrument) {
throw new NotFoundException();
}
const now = new Date();
@@ -114,8 +114,7 @@ export class CandleService {
? rangeFor(input, detail.instrument, now)
: null;
const saved = range ? await this.repository.read(input.uid, range) : null;
const gaps = range && saved ? candleGaps(range, saved.coverage, now) : [];
if (!observe && (!saved || gaps.length)) {
if (!observe && !saved) {
await this.request(userId, revision, input, now);
}
const work = await this.repository.work(userId, revision, scope(input));
@@ -121,7 +121,7 @@ export class CatalogDiscoveryService {
availability:
discovery.data === null
? 'missing'
: sources.every((source) => source.meta.availability === 'complete')
: sources.every((source) => source.meta.completeness === 'complete')
? 'complete'
: 'partial',
fetchedAt: discovery.meta.lastSuccessfulAt
@@ -173,7 +173,7 @@ export class CatalogDiscoveryService {
['detail'],
);
const source = sources[0];
if (source.meta.availability === 'complete' && !source.instrument) {
if (source.meta.completeness === 'complete' && !source.instrument) {
throw new NotFoundException();
}
const instrument = source.instrument;
@@ -288,7 +288,7 @@ export class CatalogEnrichmentService {
kinds,
);
const first = sources[0];
if (first.meta.availability === 'complete' && !first.instrument) {
if (first.meta.completeness === 'complete' && !first.instrument) {
throw new NotFoundException();
}
const values = sources.reduce<CatalogPayload>(
@@ -297,7 +297,7 @@ export class CatalogEnrichmentService {
);
const dependencies = sources.map((source) => source.meta);
const complete = dependencies.every(
(dependency) => dependency.availability === 'complete',
(dependency) => dependency.completeness === 'complete',
);
const meta = investmentResourceMeta({
resourceKey: `${instrumentType}/${section}/${uid}`,
@@ -322,7 +322,7 @@ export class CatalogEnrichmentService {
unavailable: sources
.filter(
(source) =>
source.meta.availability !== 'complete' ||
source.meta.completeness !== 'complete' ||
source.meta.sync.state === 'failed',
)
.map((source) => source.input.kind),