Асинхронний підпроект: prozorro_cdb
Стек: aiohttp + motor (async pymongo) + pydantic.
Новий асинхронний API, що розробляється паралельно з openprocurement.
Коренева директорія: src/prozorro_cdb/
Note
Підпроект є функціональним дзеркалом openprocurement.
При внесенні глобальних змін (БД, фід, auth, middleware) — їх треба вносити в обидва підпроекти.
Інфраструктурний пакет api/
Файл / директорія |
Призначення |
|---|---|
|
Ініціалізація aiohttp-додатку; підключення middleware і routes |
|
|
|
Pydantic-схеми для документів у MongoDB: |
|
Контекст запиту на базі |
|
Автентифікація брокерів і сервісних токенів (async) |
|
|
|
Pydantic-схеми для запитів і відповідей: |
|
Серіалізатори відповідей ( |
|
|
|
aiohttp-middleware (таймінги, логування, сесія БД) |
|
Утиліти для написання міграцій |
|
Конфігурація додатку (читається з env / ini) |
|
Завантаження документів у Document Storage |
Глобальні pytest-фікстури (при появі тестів): src/prozorro_cdb/conftest.py
Доменні пакети
Кожен домен — окремий пакет: tender/, contracting/, framework/, violation_report/.
Структура всередині кожного домену:
<domain>/
├── core/
│ ├── database.py # BaseCollection для домену (колекція, індекси)
│ └── initialize.py # Реєстрація колекції в MongodbStore при старті
├── handlers/ # aiohttp handlers (GET list, GET item, POST, PATCH)
│ └── schema/ # Pydantic-схеми вхідних/вихідних даних
├── database/ # (якщо потрібні додаткові схеми або helpers)
│ └── schema/
├── serializers/ # серіалізатори відповідей
├── state/ # бізнес-логіка переходів станів
└── migrations/ # міграції даних (нумеровані, 0001_…)
Note
violation_report — найбільш повно реалізований домен і є зразком для нових доменів.
Відповідності з openprocurement
|
|
Різниця |
|---|---|---|
|
|
async/motor |
|
|
PydanticView замість Pyramid |
|
|
розділені DB-схема і API-схема |
|
|
async методи |
|
|
аналогічно |
|
|
аналогічна логіка offset/пагінації |
Правила розміщення коду
Бізнес-логіка →
state/; state-класи не роблять запити до БД напрямуЗапити до БД → лише з
handlers/(черезMongodbStore.get_instance().<collection>)Схема вхідних даних (API) →
handlers/schema/(pydantic)Схема документа в БД →
database/schema/(pydantic)Серіалізація відповіді →
serializers/Реєстрація колекції →
<domain>/core/initialize.py(викликається при старті aiohttp)Зміна схеми / даних у БД →
migrations/(нумеровані файли)