import { UiDeploymentsCountsByFlow } from '@/models/api/UiDeploymentsCountsByFlow' import { UiFlowRunHistoryResponse } from '@/models/api/UiFlowRunHistoryResponse' import { UiTaskRunCountsByStateResponse } from '@/models/api/UiTaskRunCountsByStateResponse' import { FlowRunsFilter, TaskRunsFilter } from '@/models/Filters' import { NextFlowRun } from '@/models/NextFlowRun' import { UiFlowRunHistory } from '@/models/UiFlowRunHistory' import { UiNextFlowRunByFlow } from '@/models/UiNextFlowRunByFlow' import { UiNextFlowRunByFlowResponse } from '@/models/UiNextFlowRunByFlowResponse' import { UiTaskRunCountsByState } from '@/models/UiTaskRunCountsByState' import { BatchProcessor } from '@/services/BatchProcessor' import { mapper } from '@/services/Mapper' import { WorkspaceApi } from '@/services/WorkspaceApi' export interface IUiApi { getFlowRunHistory: (filter: FlowRunsFilter) => Promise, } export class UiApi extends WorkspaceApi implements IUiApi { protected override routePrefix = '/ui' private readonly nextRunsBatcher = new BatchProcessor(async ids => { const runs = await this.getNextRunsByFlow(ids) return new Map(Object.entries(runs)) }, { maxBatchSize: 200 }) public async getFlowRunHistory(filter: FlowRunsFilter): Promise { const request = mapper.map('FlowRunsFilter', filter, 'FlowRunsFilterRequest') const { data } = await this.post('/flow_runs/history', request) return mapper.map('UiFlowRunHistoryResponse', data, 'UiFlowRunHistory') } public async getTaskRunsCountByState(filter: TaskRunsFilter): Promise { const request = mapper.map('TaskRunsFilter', filter, 'TaskRunsFilterRequest') const { data } = await this.post('/task_runs/count', request) return mapper.map('UiTaskRunCountsByStateResponse', data, 'UiTaskRunCountsByState') } public async getDeploymentsCountByFlow(flowIds: string[]): Promise { const request = { 'flow_ids': flowIds } const { data } = await this.post('/flows/count-deployments', request) return data } public async getNextRunsByFlow(flowIds: string[]): Promise { const request = { 'flow_ids': flowIds } const { data } = await this.post('/flows/next-runs', request) const runs = mapper.map('UiNextFlowRunByFlowResponse', data, 'UiNextFlowRunByFlow') return runs } public getNextRunByFlow(flowId: string): Promise { return this.nextRunsBatcher.batch(flowId) } public async getFlowRunTaskCounts(flowRunIds: string[]): Promise> { // not worth writing a mapper for this // eslint-disable-next-line camelcase const { data } = await this.post>('/flow_runs/count-task-runs', { flow_run_ids: flowRunIds }) return data } private readonly getFlowRunTaskCountBatcher = new BatchProcessor(async flowRunIds => { const response = await this.getFlowRunTaskCounts(flowRunIds) return (flowRunId) => response[flowRunId] }, { maxBatchSize: 200 }) public getFlowRunTaskCount(flowRunId: string): Promise { return this.getFlowRunTaskCountBatcher.batch(flowRunId) } }