feat: reconcile hourly investment resource states
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
|
||||
import { TbankSyncRepository } from './tbank-sync.repository';
|
||||
|
||||
@Module({
|
||||
providers: [TbankSyncRepository],
|
||||
exports: [TbankSyncRepository],
|
||||
})
|
||||
export class TbankSyncRepositoryModule {}
|
||||
@@ -22,6 +22,7 @@ import {
|
||||
} from 'class-validator';
|
||||
|
||||
import { MAX_INSTRUMENT_QUERY_LENGTH, MIN_INSTRUMENT_QUERY_LENGTH } from '../instrument-query';
|
||||
import { InvestmentAttemptProblemDto } from '../investment-resource.dto';
|
||||
import { operationCategories } from '../operations/operations.api';
|
||||
|
||||
const MIN_ACCOUNT_ID_LENGTH = 1;
|
||||
@@ -267,6 +268,6 @@ export class HourlySyncStatusDto {
|
||||
@ApiProperty({ type: String, nullable: true, format: 'date-time' })
|
||||
declare finishedAt: null | string;
|
||||
|
||||
@ApiProperty({ type: HourlySyncSectionDto, isArray: true })
|
||||
declare sections: HourlySyncSectionDto[];
|
||||
@ApiProperty({ type: InvestmentAttemptProblemDto, isArray: true })
|
||||
declare problems: InvestmentAttemptProblemDto[];
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@ import { OperationsModule } from '../operations/operations.module';
|
||||
import { PortfolioModule } from '../portfolio/portfolio.module';
|
||||
import { UpcomingEventsModule } from '../upcoming-events/upcoming-events.module';
|
||||
import { TbankHourlyScheduler } from './tbank-hourly.scheduler';
|
||||
import { TbankSyncRepositoryModule } from './tbank-sync-repository.module';
|
||||
import { TbankSyncController } from './tbank-sync.controller';
|
||||
import { TbankSyncRepository } from './tbank-sync.repository';
|
||||
import { TbankSyncService } from './tbank-sync.service';
|
||||
@Module({
|
||||
imports: [
|
||||
@@ -18,9 +18,10 @@ import { TbankSyncService } from './tbank-sync.service';
|
||||
OperationsModule,
|
||||
InstrumentSourcesModule,
|
||||
UpcomingEventsModule,
|
||||
TbankSyncRepositoryModule,
|
||||
],
|
||||
controllers: [TbankSyncController],
|
||||
providers: [TbankSyncService, TbankSyncRepository, TbankHourlyScheduler],
|
||||
exports: [TbankHourlyScheduler, TbankSyncRepository],
|
||||
providers: [TbankSyncService, TbankHourlyScheduler],
|
||||
exports: [TbankHourlyScheduler],
|
||||
})
|
||||
export class TbankSyncModule {}
|
||||
|
||||
@@ -3,6 +3,7 @@ import { randomUUID } from 'node:crypto';
|
||||
|
||||
import type { Prisma } from '../../../../generated/prisma/client';
|
||||
import type { TbankSyncAttempt } from '../../../integrations/tbank/tbank.api';
|
||||
import type { InvestmentAttemptDto } from '../investment-resource.dto';
|
||||
import type { InvestmentScreenDto } from './tbank-sync.dto';
|
||||
|
||||
import { PrismaService } from '../../../prisma/prisma.service';
|
||||
@@ -21,6 +22,40 @@ export type HourlyProgress = {
|
||||
result?: 'failed' | 'partial' | 'succeeded';
|
||||
sections: HourlySection[];
|
||||
};
|
||||
type HourlyAttempt = {
|
||||
finishedAt: Date | null;
|
||||
sections: HourlySection[];
|
||||
startedAt: Date;
|
||||
state: 'cancelled' | 'failed' | 'partial' | 'running' | 'succeeded';
|
||||
};
|
||||
|
||||
export function hourlyAttempt(
|
||||
hourly: HourlyAttempt | null,
|
||||
section: HourlySection['section'],
|
||||
accountId?: string,
|
||||
): InvestmentAttemptDto {
|
||||
if (!hourly) {
|
||||
return { state: 'none', startedAt: null, finishedAt: null, problems: [] };
|
||||
}
|
||||
const problems = hourly.sections
|
||||
.filter(
|
||||
(entry) =>
|
||||
entry.section === section &&
|
||||
(accountId === undefined || entry.accountId === accountId),
|
||||
)
|
||||
.map((entry) => ({
|
||||
section: entry.section,
|
||||
accountId: entry.accountId ?? null,
|
||||
errorCode: entry.errorCode,
|
||||
}));
|
||||
return {
|
||||
state: hourly.state === 'cancelled' ? 'failed' : hourly.state,
|
||||
startedAt: hourly.startedAt.toISOString(),
|
||||
finishedAt: hourly.finishedAt?.toISOString() ?? null,
|
||||
problems,
|
||||
};
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class TbankSyncRepository {
|
||||
constructor(private readonly prisma: PrismaService) {}
|
||||
|
||||
Reference in New Issue
Block a user