...
Також можливий кейс, що АРІ поверне 403 помилку, якщо, наприклад, ЄДР змінить права доступу нашого акаунту.
...
Помилки
Коди помилок та відповідей:
Коди відповідей HTTP
Код | Текст | Пояснення |
|---|---|---|
200 | OK | Запит успішно оброблено і повернуто результат |
400 | Bad Request | Запит має помилку або не може бути оброблений. Відповідне повідомлення з поясненнями додане до відповіді. |
401 | Unauthorized | Параметри авторизації не правильні, або не вказані взагалі. |
402 | PaymentRequired | Для виконання запиту необхідна оплата. |
403 | Forbidden | Запит вірний але в обробці відмовлено. Відповідне повідомлення з поясненнями додано до відповіді. |
404 | Not Found | Адреса не правильна або ресурс до якого йде запит не існує. |
406 | Not Acceptable | Дані передані в запиті мають не зрозумілий формат. |
429 | Many Requests | API повертає таку відповідь коли вичерпано обмеження запитів до ресурсу. |
500 | Internal Server Error | Щось зламалось. |
502 | Bad Gateway | Сервіс вимкнено або проходить оновлення. |
...
{"errors":[{"message":"Invalid or expired token","code":2}]}
Перелік кодів помилок
У відповіді, окрім повідомлення з поясненням, додатково надається код помилки, який можна використовувати для автоматизованої обробки. Протягом часу, текстове повідомлення може модифікуватись, але код залишається незмінним.
Код | Текст | Пояснення |
1 | Could not authenticate you або Authentication credentials were not provided | Помилка аутентифікації. |
2 | Invalid or expired token | Недіючий або некоректний токен. |
3 | Your account is not permitted to access this resource | Відповідь надається разом із HTTP статусом 403. Користувач, з використанням токену якого було виконано аутентифікацію, не має достатніх прав для виконання запиту. |
4 | Sorry, that page does not exist | Відповідь надається разом із HTTP статусом 404. Сторінка до якої виконується запит не знайдена. |
5 | Paiment required | Відповідь надається разом із HTTP статусом 402. Недостатньо коштів для виконання платного запиту. |
6 | Parse Error або `search_date` has wrong format | Відповідь надається разом із HTTP статусом 400. Не правильний формат одного або декількох параметрів запиту. |
9 | Rate limit exceeded | Відповідь надається разом із HTTP статусом 429. Вичерпано кількість запитів, дозволених виконати протягом проміжку часу. |
10 | `code` or `passport` parameter must be provided. | У запиті не надано параметрів необхідних для виконання пошуку. |
11 | `passport` parameter has wrong value. | Один або більше параметрів запиту має невірний формат. |
20 | Internal error | Відповідь надається разом із HTTP статусом 500. |
Правила обробки помилок
| HTTP code | Retry | Зупинка інтеграції | Slack | Дія |
|---|
| 400 |
User Story 1
| Ні | Ні | Так | баг у запиті | |
| 401 | Так (1 раз) | НІ | Ні | refresh token |
| 402 | Ні | Так | Так | чекати оплату |
| 403 | Ні | Можливо | Так | перевірити доступ |
| 404 | Ні | Можливо | Ні | немає суб'єкта |
| 406 | Ні | Можливо | Так | формат |
| 429 | НІ | Так | Так | ліміт |
| 500 | Так (3 рази) | Ні | Ні | тимчасова помилка |
| 502 | Так (3 рази) | Ні | Ні | сервіс недоступний |
Сценарії роботи інтеграції з ЄДР
User Story 1
| Як | ЦБД Prozorro.Sale |
| я | |
| Як | ЦБД Prozorro.Sale |
| я хочу | автоматично отримувати та зберігати інформацію про кінцевих бенефіціарних власників (КБВ) з ЄДР при створенні award |
| щоб | забезпечити актуальність, централізацію та зменшити залежність від ручного введення даних |
USE CASE 1 — Успішне отримання та збереження КБВ
Назва | Отримання та запис КБВ з ЄДР в award |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат | award містить список КБВ (може бути декілька) |
Acceptance Criteria
1 | Given | Всі умови виконані |
When | Створюється award | |
Then | Відправляється запит до ЄДР | |
2 | Given | ЄДР повернув валідні дані |
When | Дані проходять валідацію | |
Then | Вони записуються в award.beneficiaries | |
3 | Given | Дані записані |
Then | оновлюються всі dateModified:
|
...
USE CASE 2 — Дані не можуть бути внесені
Назва | Відмова у записі КБВ |
| Актори |
|
| Передумови | Отримано HTTP код: |
| Основний сценарій |
|
| Результат | award без змін |
Acceptance Criteria
1 | Given | Дані не відповідають моделі |
When | Виконується валідація | |
Then | Дані не записуються |
...
USE CASE 3 — Retry при помилках 500 / 502
Назва | Повторна спроба отримання даних |
| Актори |
|
| Передумови | Отримано HTTP код: |
| Основний сценарій |
|
| Альтернативний сценарій | після 3 невдалих спроб → fallback |
| Результат |
|
Acceptance Criteria
1 | Given | Отримано 500/502 |
When | Виконується retry | |
Then | Система повторює запит до 3 разів | |
2 | Given | Всі retry невдалі |
Then | Записується повідомлення: |
...
USE CASE 4 — Логування помилок в Slack
Назва | Моніторинг інтеграції з ЄДР |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | Отримано помилку зі списку |
When | Обробляється відповідь | |
Then | Відправляється повідомлення в Slack |
...
USE CASE 5 — Інтеграція не запускається
Назва | Неініціювання запиту до ЄДР |
| Актори |
|
| Передумови | Будь-яка з умов НЕ виконується:
|
| Основний сценарій |
|
| Результат | Жодних запитів до ЄДР |
Acceptance Criteria
1 | Given | Умови не виконані |
When | Створюється award | |
Then | запит до ЄДР не виконується |
...
USE CASE 6 — Обробка множинних КБВ
Назва | Запис кількох бенефіціарів |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат | Збережено всі КБВ |
Acceptance Criteria
1 | Given | ЄДР повертає кілька КБВ |
When | Відбувається запис | |
Then | Всі КБВ зберігаються в масиві |
User Story 2. Зупинка запитів в разі отримання помилок 402 або 429
| Як | ЦБД Prozorro.Sale |
| я хочу | зупиняти направлення запитів до ЄДР після першого отримання помилки 402 або 429 |
| щоб | не створювати зайве навантаження на сервіс, не витрачати ліміти та уникати повторних неуспішних запитів до моменту відновлення доступу/поповнення коштів. |
| додатково | Після внесення коштів або відновлення ліміту система має відновити направлення запитів до ЄДР. |
USE CASE 7 — Зупинка запитів після отримання 402
Назва | Автоматичне призупинення інтеграції з ЄДР при помилці 402 Payment Required |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | ЦБД отримала від ЄДР відповідь 402 |
When | Система обробляє відповідь | |
Then | Інтеграція з ЄДР переходить у статус призупинення. | |
2 | Given | Інтеграція має статус призупинення через |
When | Створюється новий award, який відповідає умовам інтеграції | |
Then | ЦБД не направляє запит до ЄДР. | |
3 | Given | Отримано 402 |
| When | Система фіксує помилку | |
Then | Повідомлення надсилається в Slack канал. |
...
USE CASE 8 — Зупинка запитів після отримання 429
Назва | Автоматичне призупинення інтеграції з ЄДР при помилці 429 Many Requests |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | ЦБД отримала відповідь 429 |
When | Система обробляє відповідь | |
Then | Направлення нових запитів до ЄДР зупиняється. | |
2 | Given | Інтеграція призупинена через |
When | Створюється новий award | |
Then | ЦБД не направляє запит до ЄДР | |
3 | Given | Отримано 429 |
| When | Система обробляє помилку | |
Then | Повідомлення надсилається в Slack канал. |
...
USE CASE 9 — Відновлення запитів після внесення коштів
Назва | Ручне або автоматичне відновлення інтеграції з ЄДР після внесення коштів |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | Інтеграція призупинена через 402 |
| And | Кошти внесено | |
When | Адміністратор активує інтеграцію | |
Then | Статус інтеграції змінюється на active. | |
2 | Given | Інтеграція активна після відновлення |
When | Створюється новий award | |
Then | ЦБД направляє запит до ЄДР | |
3 | Given | ЄДР після відновлення повертає 200 |
| When | ЦБД отримує валідні дані | |
Then | Дані записуються в |
...
USE CASE 10 — Відновлення після вичерпання ліміту запитів
Назва | Відновлення інтеграції після помилки 429 |
| Актори |
|
| Передумови |
|
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | Інтеграція призупинена через 429 |
When | Ліміт запитів відновлено | |
And | Адміністратор активує інтеграцію | |
Then | ЦБД знову направляє запити до ЄДР | |
2 | Given | Інтеграція активована після |
When | Створюється award | |
Then | Запит до ЄДР виконується |
User Story 3. Обробка помилок інтеграції з ЄДР та забезпечення стабільності системи
| Як | ЦБД Prozorro.Sale |
| я хочу | коректно обробляти всі типи помилок від ЄДР (400, 401, 403, 404, 406, 500, 502) |
| щоб | забезпечити стабільну роботу системи, не втрачати дані та мати можливість відновлення інтеграції |
USE CASE 11 — Обробка 401 (Unauthorized)
...
Назва
...
- ЦБД
- ЄДР
- Slack
...
- Запит до ЄДР виконано
- Отримано
401 Unauthorized
...
- ЦБД отримує
401 - Визначає, що токен невалідний / протермінований
- Виконує запит на оновлення
access_tokenчерезrefresh_token - Отримує новий токен
- Повторює запит до ЄДР (1 раз)
- Якщо успішно → стандартний сценарій (запис даних)
...
Refresh token невалідний → перейти до помилки критичного рівня
...
Інтеграція відновлюється без втручання людини
| типи помилок від ЄДР (400, 401, 403, 404, 406, 500, 502) | |
| щоб | забезпечити стабільну роботу системи, не втрачати дані та мати можливість відновлення інтеграції |
USE CASE 11 — Обробка 401 (Unauthorized)
Назва | Автоматичне оновлення токена при помилці 401 |
Acceptance Criteria
...
1
...
When
...
Then
...
2
...
Токен оновлено
...
Then
...
3
...
Then
...
дані записуються в award
USE CASE 12 — Помилка 400 (Bad Request)
...
Назва
...
- ЦБД
- ЄДР
- Slack
...
- неправильний формат параметрів
- неправильний code
...
- ЦБД отримує
400 - Аналізує помилку
- Визначає:
- помилка у формуванні запиту
- НЕ виконує retry
- Логує помилку
- Надсилає повідомлення в Slack
...
Виправлення формату запиту (dev fix)
...
- запит не повторюється
- потрібне втручання розробника
Acceptance Criteria
1
...
When
...
Then
...
And
...
USE CASE 13 — Помилка 403 (Forbidden)
Назва | Обробка відсутності прав доступу | ||
| Актори |
| ||
| Передумови |
| ||
| Основний сценарій |
| ||
| Рішення |
| ||
| |||
| Альтернативний сценарій | Refresh token невалідний → перейти до помилки критичного рівня | ||
| Результат | Інтеграція відновлюється без втручання людини | Результат | Інтеграція не працює до виправлення |
Acceptance Criteria
1 | Given | Отримано 403 |
Then | Retry не виконується | |
And | Slack отримує повідомлення |
...
| 401 | ||
When | Токен протермінований | |
Then | Система виконує refresh token | |
2 | Given | Токен оновлено |
Then | Запит повторюється 1 раз | |
3 | Given | повторний запит успішний |
Then | дані записуються в award |
...
USE CASE 12 — Помилка 400 (Bad Request)
Назва | Обробка відсутності суб’єкта в некоректного запиту до ЄДР | ||
| Актори |
| ||
| ПередумовиЄДРПОУ не знайдено |
| ||
| Основний сценарій |
| ||
| Рішення | Виправлення формату запиту (dev fix) | ||
| Результат |
| Результат |
|
Acceptance Criteria
1 | Given | Отримано 404400 |
When | Обробляється помилка | |
Then | Retry не виконується | |
And | Записує beneficiaries тільки поле reason:
|
...
| Slack отримує повідомлення |
...
USE CASE 13 — Помилка 403 (Forbidden)
Назва | Обробка помилки формату данихвідсутності прав доступу |
| Актори |
|
| Передумови | Некоректний формат request/response |
| Передумови |
|
| Основний сценарій |
|
| Рішення |
|
| Результатінтеграція потребує доопрацювання | Інтеграція не працює до виправлення |
Acceptance Criteria
1 | Given | Отримано 406403 |
Then | Retry не виконується | |
And | Slack отримує повідомлення |
ЗВЕДЕНА ТАБЛИЦЯ
...
USE CASE 14 — Помилка 404 (Not Found)
Назва | Обробка відсутності суб’єкта в ЄДР |
| Актори |
|
|
| Передумови |
ЄДРПОУ не знайдено | |
| Основний сценарій |
|
| Результат |
|
Acceptance Criteria
1 | Given | Отримано 404 |
Then | Retry не виконується | |
And | Записує beneficiaries тільки поле reason:
|
...
USE CASE 15 — Помилка 406 (Not Acceptable)
Назва | Обробка помилки формату даних |
| Актори |
|
| Передумови | Некоректний формат request/response |
| Основний сценарій |
|
| Рішення |
|
| Результат |
|
Acceptance Criteria
1 | Given | Отримано 406 |
Then | Retry не виконується | |
And | Slack отримує повідомлення |