Каким паттерном лучше всего решить данную проблему?
Вы для начала не поняли зачем нужен контроллер. У вас логика "модели", то есть нашего приложения вытекла в контроллер, раз возникает дублирование. Контроллеры нужны для снижения связанности между UI (HTTP в нашем случае, шаблонизаторы и прочее) и непосредственно приложением. В вашем же случае у вас по сути нет того самого промежуточного слоя и контроллеры являются частью приложения, без которого оно не работает.
В целом при дублировании обычно все решается очень просто - общую реализацию выносим в общую зависимость. Отдельный класс который делает дела и который юзают наши контроллеры. Сервис.