From eda6ca4b1a25bd90b0f7bd724046b4abc84809f5 Mon Sep 17 00:00:00 2001 From: Polianin Nikita Date: Sun, 22 Dec 2024 07:17:21 +0300 Subject: [PATCH] refactor: use RFC 7807 standard for error handling --- src/api/api.service.ts | 66 ++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/api/api.service.ts b/src/api/api.service.ts index fe1084e..fb44476 100644 --- a/src/api/api.service.ts +++ b/src/api/api.service.ts @@ -158,7 +158,7 @@ export default abstract class ApiService { private handleError(error: HttpErrorResponse): void { // todo: change to Retry-After condition - if (error.error && error.error.toString().includes("setup")) { + if (error.error && error.error.detail.includes("setup")) { this.router.navigate(['/setup/']).then(); return; } @@ -168,38 +168,40 @@ export default abstract class ApiService { if (error.error instanceof ErrorEvent) { title = `Произошла ошибка: ${error.error.message}`; } else { - switch (error.status) { - case 0: - title = 'Неизвестная ошибка. Пожалуйста, попробуйте позже.'; - break; - case 400: - title = 'Ошибка запроса. Пожалуйста, проверьте отправленные данные.'; - break; - case 401: - this.router.navigate(['/login/']).then(); - title = 'Ошибка авторизации. Пожалуйста, выполните вход с правильными учетными данными.'; - break; - case 403: - title = 'Отказано в доступе. У вас нет разрешения на выполнение этого действия.'; - break; - case 404: - title = 'Запрашиваемый ресурс не найден.'; - break; - case 500: - title = 'Внутренняя ошибка сервера. Пожалуйста, попробуйте позже.'; - break; - case 503: - title = 'Сервер на обслуживании. Пожалуйста, попробуйте позже.'; - break; - default: - title = `Сервер вернул код ошибки: ${error.status}`; - break; + if (error.error && error.error.type && error.error.title) { + title = error.error.title || `Ошибка с кодом ${error.status}`; + message = error.error.detail || 'Неизвестная ошибка'; + } else { + switch (error.status) { + case 0: + title = 'Неизвестная ошибка. Пожалуйста, попробуйте позже.'; + break; + case 400: + title = 'Ошибка запроса. Пожалуйста, проверьте отправленные данные.'; + break; + case 401: + this.router.navigate(['/login/']).then(); + title = 'Ошибка авторизации. Пожалуйста, выполните вход с правильными учетными данными.'; + break; + case 403: + title = 'Отказано в доступе. У вас нет разрешения на выполнение этого действия.'; + break; + case 404: + title = 'Запрашиваемый ресурс не найден.'; + break; + case 500: + title = 'Внутренняя ошибка сервера. Пожалуйста, попробуйте позже.'; + break; + case 503: + title = 'Сервер на обслуживании. Пожалуйста, попробуйте позже.'; + break; + default: + title = `Сервер вернул код ошибки: ${error.status}`; + break; + } } - if (error.error?.Error) - message = error.error.Error; - else if (error.error instanceof String) - message = error.error.toString(); - else + + if (!message) message = error.error.statusMessage; } this.notify.error(message == '' ? undefined : message, title);