avicenna/service/app-hub/dashboard/src/app/pages/control-center/anomalies.service.ts

122 lines
3.1 KiB
TypeScript

import { EventEmitter, Injectable } from '@angular/core';
import { HotToastService } from '@ngxpert/hot-toast';
import { catchError, delay, EMPTY, map, Observable, take, tap } from 'rxjs';
import {
GetAnomaliesGQL,
GetGroupedAnomaliesGQL,
SetAnomalyToSleepGQL,
AcceptAnomalyGQL,
GetUpcomingToursGQL,
PaginatedAnomaly,
PaginatedAnomalyGroup,
} from '../../core/data-access/graphql/generated/generated';
@Injectable()
export class AnomaliesService {
anomaliesRefresh$ = new EventEmitter<void>();
upcomingToursQuery;
upcomingTours$;
constructor(
private readonly getAnomaliesGql: GetAnomaliesGQL,
private readonly getGroupedAnomaliesGql: GetGroupedAnomaliesGQL,
private readonly setAnomalyToSleepGql: SetAnomalyToSleepGQL,
private readonly acceptAnomalyGql: AcceptAnomalyGQL,
private readonly upcomingToursGql: GetUpcomingToursGQL,
private readonly toast: HotToastService
) {
this.upcomingToursQuery = this.upcomingToursGql.watch(
{},
{ pollInterval: 60 * 1000 }
);
this.upcomingTours$ = this.upcomingToursQuery.valueChanges;
}
getAnomaliesByPage(
cursor: string,
take: number = 10
): Observable<PaginatedAnomaly> {
return this.getAnomaliesGql
.fetch(
{ cursor, take },
{
fetchPolicy: 'no-cache',
}
)
.pipe(
map((queryResult) => queryResult.data.anomalies),
catchError((err) => {
console.error(err);
return EMPTY;
})
);
}
getGroupedAnomaliesByPage(
cursor: string,
take: number = 10
): Observable<PaginatedAnomalyGroup> {
return this.getGroupedAnomaliesGql
.fetch(
{ cursor, take },
{
fetchPolicy: 'no-cache',
}
)
.pipe(
map(
(queryResult) =>
queryResult.data
.groupedAnomalies as unknown as PaginatedAnomalyGroup
),
catchError((err) => {
console.error(err);
return EMPTY;
})
);
}
setAnomalyToSleep(anomalyId: string): void {
this.setAnomalyToSleepGql
.mutate({ id: anomalyId })
.pipe(
take(1),
tap(() => this.anomaliesRefresh$.emit()),
tap((mutationResult) => {
if (mutationResult.errors) {
this.toast.error(
'Leider ist etwas schief gelaufen, versuchen Sie es bitte nochmal'
);
} else {
this.toast.success(
'Die Anomalie wurde für eine Stunde stummgeschaltet!'
);
}
})
)
.subscribe();
}
acceptAnomaly(anomalyId: string): void {
this.acceptAnomalyGql
.mutate({ id: anomalyId })
.pipe(
take(1),
delay(10),
tap(() => this.anomaliesRefresh$.emit()),
tap((mutationResult) => {
if (mutationResult.errors) {
this.toast.error(
'Leider ist etwas schief gelaufen, versuchen Sie es bitte nochmal'
);
} else {
this.toast.success('Die Anomalie wurde akzeptiert!');
}
})
)
.subscribe();
}
}