Данный проект это небольшой пример реализации REST API сервиса, в котором можно увидеть:
- Реализацию аутентификации и авторизации (JWT)
- Генерацию swagger документации
- Генерацию sql запросов и выполнение их к базе данных
- Логирование
- Метрики
- Использование контейнеризации
- И что то еще по мелочи, вроде реализации graceful shutdown, запуск приложения для dev и prod окружения...
Для реализации основной логики использовался фреймворк Gin, но для следующих версий API можно безболезненно брать другие библиотеки.
Пользователь может зарегистрироваться под ролью user, войти в свой аккаунт, и обновить Access Token при помощи Refresh Token. За это отвечают следующие методы:
// @Router /auth/sign-up [post]
func (o *UserHandler) CreateUser(c *gin.Context) {...}
// @Router /auth/sign-in [post]
func (o *UserHandler) AuthenticationUser(c *gin.Context) {...}
// @Router /auth/refresh [post]
func (o *UserHandler) RefreshTokenUser(c *gin.Context) {...}
Далее авторизованный пользователь может создавать и просматривать свой Content:
// @Router /lk/content [POST]
func (o *UserContent) CreateContent(c *gin.Context) {...}
// @Router /lk/content/{id} [GET]
func (o *UserContent) ShowContent(c *gin.Context) {...}
и у данного сервиса есть свой Blog, который может посмотреть каждый:
// @Router /blog/{id} [GET]
func (o *SiteBlog) ShowBlog(c *gin.Context) {...}
Но создавать данные записи может только юзер с правами admin
// @Router /lk/blog [POST]
func (o *SiteBlog) CreateBlog(c *gin.Context) {
middlewares.CheckAccessRights(c, consts.RoleAdmin)
...}
Все основные команды можно увидеть в Makefile.
Для быстрого запуска выполните команду docker-compose up
и перейдите к swagger документации: http://localhost:8081/swagger/index.html,
для логина под ролью admin войдите как: email: admin, password: admin
на порту 8081 расположен debag сервер:
-
Профилировщик: http://localhost:8081/pprof/
-
Метрики для Prometheus: http://localhost:8081/metrics/
-
Информация о сборке: http://localhost:8081/
Так же вы можете запустить для данного сервиса frontend часть: https://github.com/Dsmit05/metida-ui. И посмотреть полноценную реализацию аутентификации и авторизации.
Для отображения метрик и логов вы можете запустить и настроить Grafana и ELK из папки env-apps
- для production версии все настройки надо брать из защищенного места(к примеру consul)
- для работы с postrgre использовать пул и выполнить более качественную обработку ошибок
- использовать кеш для частых запросов к бд
- не использовать в контейнерах network_mode: host
- оставлять более подробные комментарии к функциям
В папке scripts приложен пример по работе с миграциями, т.к. подходов для миграций много(к примеру через консольные приложения) включать это в основное приложение я посчитал не нужным. Данный проект носит ознакомительный характер, используйте его на свой страх и риск.