import { type IActivity, type IEither, IMetric, type ITraceable, JsonResponse, LogLevel, type Mapper, Metric, type PenguenoRequest, type ServerTrace, TraceUtil, } from '@emprespresso/pengueno'; export enum HealthCheckInput { CHECK, } export enum HealthCheckOutput { YAASSSLAYQUEEN, } export interface IHealthCheckActivity { checkHealth: IActivity; } const healthCheckMetric: IMetric = Metric.fromName('Health'); export interface HealthChecker extends Mapper, Promise>> {} export class HealthCheckActivityImpl implements IHealthCheckActivity { constructor(private readonly check: HealthChecker) {} public checkHealth(req: ITraceable) { return req .bimap(TraceUtil.withFunctionTrace(this.checkHealth)) .bimap(TraceUtil.withMetricTrace(healthCheckMetric)) .flatMap((r) => r.move(HealthCheckInput.CHECK).map((input) => this.check(input))) .peek( TraceUtil.promiseify((h) => h.get().fold(({ isLeft, value }) => { if (!isLeft) { h.trace.trace(healthCheckMetric.success); return; } h.trace.trace(healthCheckMetric.failure); h.trace.addTrace(LogLevel.ERROR).trace(value); }), ), ) .map( TraceUtil.promiseify((h) => h .get() .mapBoth( () => 'oh no, i need to eat more vegetables (。•́︿•̀。)...', () => 'think im healthy!! (✿˘◡˘) ready to do work~', ) .fold( ({ isLeft, value: message }) => new JsonResponse(req, message, { status: isLeft ? 500 : 200, }), ), ), ) .get(); } }