Додавання генерації POST-методів для пошуку даних
| 🌐 Цей документ доступний українською та англійською мовами. Використовуйте перемикач у правому верхньому куті, щоб змінити версію. | 
1. Загальний опис
При поточній реалізації з виконанням GET-запитів для пошуку даних, виникли проблеми з пошуком по типу IN/NOT_IN.
Вони пов’язані з неможливістю коректно обробити випадок, коли приходить запит типу GET /search?inParam=value1,value2 , де параметр inParam є єдиним значенням value1,value2, а не масивом значень ["value1", "value2"]. Подібні структури в запиті Spring Web фреймворк парсить саме як масив [value1, value2].
В якості воркераунду можливим виявилось формувати запит у форматі GET /search?inParam=value1,value2&inParam=. В такому випадку Spring формує параметри у масив ["value1,value2", ""], що є коректним для пошуку за типом IN/NOT_IN.
Проте використання подібного воркераунду є можливим тільки для випадків, де клієнт може явно сконфігурувати запит HTTP-запит з необхідними пошуковими параметрами у правильному форматі.
Такими сценаріями є:
- 
Інтеграція через UI-форми 
Проте для сценаріїв, де запити пошуку даних формуються програмно всередині мікросервісів системи, таких як:
- 
виставлення ендпоінтів пошуку даних через Трембіту (через soap-api) 
- 
використання ендпоінтів пошуку даних через делегати у бізнес-процесах (через bpms) 
наявний воркераунд використати неможливо або це створить суттєві проблеми для розробки та підтримки такого рішення, що в майбутньому може призвести до блокуючих проблем у команд розробки.
Як вирішення таких проблем було вирішено додатково до генерації GET-інтерфейсу для пошуку даних також генерувати і POST-інтерфейс, при використанні якого необхідні пошукові параметри будуть формуватись у тілі запиту формату JSON, який дозволяє коректно відрізняти окремі одиночні значення від масивів.
2. Загальні принципи та положення
- 
GET і POST ендпоінти мають генеруватись разом 
- 
Для внутрішніх інтеграцій всередині системи перейти на використання POST 
- 
Використання GET методів залишається для зворотньої сумісності при використанні клієнтами сценаріїв Пошук з UI-форм, Публічний API та Інтеграція з зовнішніми системами 
- 
Використання POST-методів для сценаріїв Публічний API та Інтеграція з зовнішніми системами стане можливим 
- 
Використання POST-запитів для пошуку даних не впливає на сценарії модифікації даних, де також використовується метод POST (залишаються актуальними усі Network Policy, а також перевірка HTTP-заголовків при збереженні даних) 
- 
Перехід UI-форм на використання POST методу наразі не потребується та є поза скоупом 
3. Високорівневий план розробки
3.1. Приклад
Для критерію пошуку
<changeSet author="registry owner" id="create SC registration_equal_laboratory_id_solution">
    <ext:createSearchCondition name="some_sc">
        <ext:table name="some_table" alias="r">
            <ext:column name="some_id" />
            <ext:column name="some_equal_column" searchType="equal"/>
            <ext:column name="some_in_column" searchType="in"/>
        </ext:table>
    </ext:createSearchCondition>
</changeSet>разом з існуючим GET-ендпоінтом повинен згенеруватись POST
Новий API
3.3. План розробки
| Компонент | Необхідне розширення | Мета | 
| service-generation-utility | додати генерацію POST ендпоінтів пошуку даних | виклик нових ендпоінтів з soap-api та bpms | 
| service-generation-utility | змінити генерацію коду soap-api на відправку запитів до rest-api, перейти на POST | уникнути проблем з виставленням SC з пошуком через IN/NOT_IN через Трембіту | 
| service-generation-utility | змінити AuthPolicy для зовнішніх інтеграцій з rest-api-ext, дозволити обробку POST для ендпоінтів пошуку даних (не має впливати на ендпоінти модифікації даних) | можливість викликати POST ендпоінт для сценарію Пошук даних без Трембіта | 
| rest-api-core-base-image | для пошукових POST запитів прибрати валідацію специфічних заголовків (X-Digital-Signature, X-Source-Business-Process etc.) | у поточній реалізації валідація заголовків налаштована за HTTP-методом, а не за викликаним ендпоінтом, внаслідок чого всі POST-запити валідуються. З новим підходом цю логіку необхідно змінити | 
| bpms | змінити делегати пошуку (DataFactoryConnectorSearchDelegate, RegistryDataFactoryConnectorSearchDelegate), додавши можливість приймати як параметр пошуку Map<String, Object> (зараз - Map<String, String>) | для коректного пошуку за типом IN у POST запиті необхідно буде передати список допустимих значень, вони відправляться з bpms як string ключ - list значення. Не має виникнути проблем зі зворотньою сумісністю, оскільки Map<String, Object> є ширшим, ніж поточне Map<String, String> | 
| ddm-data-factory-client | оновити Feign-клієнти, які використовуються делегатами, на POST метод | використання в bpms клієнту | 
| platform-gateway | додати обробку POST-запитів пошуку замість GET | оскільки сценарій пошуку без Трембіти перемикається на POST метод, у проксі-сервісі platform-gateway теж необхідно перемкнутись на обробку запитів саме цього методу | 
Також важливим є документування функціональності:
- 
Задокументувати особливості використання GET-методів при пошуку з IN/NOT_IN 
- 
Задокументувати рекомендації щодо формування тіла POST запиту (особливо при пошуку IN/NOT_IN)