Структура директории. В примере вверху src, но может быть что угодно, зависит от вашей системы. На скриншоте — контроллер веб-запросов, выделенный в отдельную директорию. Потому что под контроллерами, особенно в современных архитектурах, подразумевают не только веб, но и много чего другого. Поэтому важно отделить веб от всего остального. Далее иерархично уходят контроллеры внешнего и внутреннего API.
Важно понимать, что внутренние\внешние API — это не правило, а особенность построения архитектуры в Skyeng. В других компаниях наверняка есть такая же система, но важно оговориться, что это и зачем.
Внешний API — через который взаимодействуют клиенты, веб-клиенты, мобильные приложения, используются разные методы аутентификации. Внутренний API — с помощью которого взаимодействуют наши микросервисы. Этот API работает в локальной сети, там максимально простая авторизация через http. Безопасность гарантируется тем, что всё доступно только изнутри. Соответственно, домены для внешнего и для внутреннего API — разные.
Я попытался показать несколько вариантов, как можно организовать, в случае, если у вас есть CRUD экшены. Они, как правило, версионируются вместе, то есть GET, POST, PUT и так далее кочуют от версии к версии. Иногда у вас есть экшн на одно действие, например регистрацию, когда CRUD предоставляет полноценный create, read, update, delete. В этом случае будет POST register, т.е. POST запрос. А в случае CRUD хочется иметь одинаковый response для всего набора, а в случае одиночных экшенов — сделать всё более гибко и понятно.
Почему одиночные экшены могут существовать, откуда они берутся и почему их можно версионировать? Приведём в пример случай регистрации. Регистрация не всегда касается только внутренней системы: закинул пользователя в базу и поехали дальше. Иногда его нужно сразу куда-то поместить — например, зарегистрировать во внешней реферальной системе, CRM.
Первая версия может обеспечивать регистрацию синхронно, вторая — асинхронно. Естественно, клиенту — браузеру или пользователю API — это нужно понимать и знать. Но при этом, если в случае CRUD'ов от первой версии можно будет в какой-то момент отказаться, то в случае с регистрацией от старых версий может и не получится отказаться. Потому что нужно иметь разные способы регистрации.