refactor: change apiService to abstract

This commit is contained in:
2024-06-05 21:43:36 +03:00
parent ad0940c087
commit 5ff24d49b5
2 changed files with 158 additions and 110 deletions

View File

@ -1,110 +0,0 @@
import {Injectable} from '@angular/core';
import {catchError, mergeMap, Observable, retryWhen, throwError, timer} from "rxjs";
import {HttpClient} from "@angular/common/http";
import {NotifyColor, OpenNotifyService} from "@service/open-notify.service";
import {environment} from "@/config/environment";
export function retryWithInterval<T>(): (source: Observable<T>) => Observable<T> {
return (source: Observable<T>) =>
source.pipe(
retryWhen((errors: Observable<any>) =>
errors.pipe(
mergeMap((error, index) => {
if (index < (environment.maxRetry < 0 ? Infinity : environment.maxRetry - 1) && !error.status.toString().startsWith('4')) {
console.log(`Retrying after ${environment.retryDelay}ms...`);
return timer(environment.retryDelay);
} else {
console.error(`Exceeded maximum retries (${environment.maxRetry})`);
return throwError(error);
}
})
)
)
);
}
@Injectable({
providedIn: 'root'
})
export class ApiService {
constructor(private http: HttpClient, private notify: OpenNotifyService) {
}
private urlApi = environment.apiUrl;
get<Type>(endpoint: string): Observable<Type> {
return this.http.get<Type>(this.urlApi + endpoint).pipe(
retryWithInterval<Type>(),
catchError(error => {
this.handleError(error);
return throwError(error);
})
);
}
post<Type>(endpoint: string, data: any): Observable<Type> {
return this.http.post<Type>(this.urlApi + endpoint, data).pipe(
retryWithInterval<Type>(),
catchError(error => {
this.handleError(error);
return throwError(error);
})
);
}
put<Type>(endpoint: string, data: any): Observable<Type> {
return this.http.put<Type>(this.urlApi + endpoint, data).pipe(
retryWithInterval<Type>(),
catchError(error => {
this.handleError(error);
return throwError(error);
})
);
}
delete<Type>(endpoint: string): Observable<Type> {
return this.http.delete<Type>(this.urlApi + endpoint).pipe(
retryWithInterval<Type>(),
catchError(error => {
this.handleError(error);
return throwError(error);
})
);
}
private handleError(error: any): void {
let message: string;
if (error.error instanceof ErrorEvent) {
message = `Произошла ошибка: ${error.error.message}`;
} else {
switch (error.status) {
case 0:
message = 'Неизвестная ошибка. Пожалуйста, попробуйте позже.';
break;
case 400:
message = 'Ошибка запроса. Пожалуйста, проверьте отправленные данные.';
break;
case 401:
message = 'Ошибка авторизации. Пожалуйста, выполните вход с правильными учетными данными.';
break;
case 403:
message = 'Отказано в доступе. У вас нет разрешения на выполнение этого действия.';
break;
case 404:
message = 'Запрашиваемый ресурс не найден.';
break;
case 500:
message = 'Внутренняя ошибка сервера. Пожалуйста, попробуйте позже.';
break;
default:
message = `Сервер вернул код ошибки: ${error.status}`;
break;
}
if (error.error?.Error) {
message += ` ${error.error.Error}`;
}
}
this.notify.open(message, NotifyColor.Danger);
}
}