Кастомная фильтрация в CRM — делаем нормальную архитектуру

Сейчас в поиске новой команды, решил рассказать про одну из задач которые запомнились.

Делали рассылки в CRM. По сути просто — клиент выбирает кому рассылать сообщения: по возрасту, полу, уровню аккаунта, посещённым услугам и так далее. Изначально это была просто передача полей на бэкенд.

Потом захотели добавить фильтр по дням рождения. Потом по мастерам. Стало понятно что каждый новый критерий — это отдельная правка и на фронте и на бэке.

Было решено сделать архитектуру более гибкой. В итоге я предложил сделать что-то вроде Lucene синтаксиса и визуальной обертки для него. Пришли к тому, что фронт собирает дерево условий в своём формате, переводит его в JsonLogic и отправляет на бэк. Каждый тип поля — отдельный класс с логикой трансформации. Новый критерий — просто новый класс, наследующийся от базового.

Теперь клиенты могли делать полноценные сложные условия вроде (родился в мае ИЛИ июне И больше 18 лет) и система стала более расширяемой.

А у вас был момент когда становилось очевидно что часть проекта пора переделывать? Как вы это поняли?