Путь к уменьшению сложности один - декомпозиция.
Выносить все лишнее в отдельные классы и модули.
Скажем, стоит выносить логику валидации запросов из контроллера в отдельные классы, оставляя в контроллере только абстрактное: валидировать. логировать. передать на обработку. вернуть результат.
Тоже самое в сервисах: выносить логику обращения к БД, обращения к внешним сервисам и т.д., оставляя только то что относится непосредственно к ответственности сервиса
См. книгу
Р. Мартин "Чистая архитектура", вот
статья об этом на хабре