Необхідно створити клас який би реалізовував даний сценарій:
- фільтр у вигляді рядка (fastapi Query поле filter = 'field_name__eq=3|other_field__ilike=text&field_some__eq=dfdf')
- підтримка операцій й '& - and | - or' (групування)
- підтримка __eq __ilike __gt[lt,gte,lte] і т.д. також '__in' (оператори)
- підтрика __not_eq, __not__ilike і т.д. всі операції повинні підтримувати "not" (додаткові оператори)
Якщо є щось вже готове, готовий розглянути і адаптувати.
Деталі:
- модуль обовʼязково повинен включати unit-testи
- клас ініціалізується як Dependency або наприклад так (є прикладом псевдоком, розгяну ваші варіанти):
user_filter_service = FilterService(USER_TABLE, fields=('name, 'id'), field_operations={'name': ['eq']})
(a)api.get('/user')
async def get_user(filters = Query(default=''), db=sqlalchemy_connection):
query = user_filter_service.apply(db, filters) <- gen query for filters string
db.execute(query)
- таблиця sqlalchemy TABLE_NAME = db.Table(... column... column) [підтримати основні поля, str, integer, decimal, text, enum, array[int], array[enum], array[decimal], array[str],.. по можливості ще пару на ваш вибір) основні операції (in, lt, gt, lte, gte, eq, exclude, ilike='*name*', like, startswith, endswith, contains)
- налаштування які поля треба взяти з таблиці [field1, field2, field3] які поля можна використати для філтрів (якщо таких полів немає то видасти помилку)
- налаштування операцій для поля: [список операцій які можна робити 'eq', 'like' і т.д.] - це потрібно якщо тількі певні операції дозволити, в іншому випадку всі операції дозволені
- на виході маємо slqlachemy core query в якій підготовлені запити на основі рядка з фільтрами
- також підтримати можливість додати метод get_<field_name>_exact__and__<field_name>_gt(self, **kwargs): -> відповідно щоб можна було реалізувати, окремий метод під набір фільтрів
Якщо у вас є питання, вітаю в обговоренні, бюджет та час виконання ваші.
На час виконання отримуєте (+) підписку фріланс хант безкоштовно від мене.