visible/visible

View on GitHub
packages/@visi/web-server/src/interfaces/controllers/stats-controller.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { toAsyncIterator } from '@visi/prelude';
import { inject, injectable } from 'inversify';
import { map } from 'rxjs/operators';

import {
  FindStatsUseCase,
  SubscribeStatsUseCase,
} from '../../application/use-cases';
import { TYPES } from '../../types';
import { API, StatsPresenter } from '../presenters';

@injectable()
export class StatsController {
  constructor(
    @inject(TYPES.FindStatsUseCase)
    private readonly findStats: FindStatsUseCase,

    @inject(TYPES.SubscribeStatsUseCase)
    private readonly subscribeStats: SubscribeStatsUseCase,

    @inject(StatsPresenter)
    private readonly presenter: StatsPresenter,
  ) {}

  async find(): Promise<API.Stats> {
    const data = await this.findStats.run();
    return this.presenter.run(data.stats);
  }

  subscribe(): AsyncIterableIterator<{ stats: API.Stats }> {
    const stream$ = this.subscribeStats.run().pipe(
      map((stats) => this.presenter.run(stats)),
      map((stats) => ({ stats })),
    );

    return toAsyncIterator(stream$);
  }
}