# README
Note service
Микросервис, предназначенный для работы с заметками пользователей. Он предоставляет API для создания, чтения, обновления и удаления заметок, а также для аутентификации и регистрации пользователей. Особенностью этого сервиса является интеграция с сервисом Яндекс.Спеллер для автоматической проверки орфографических ошибок в заметках перед их сохранением и изменением.
Используемые технологии:
- PostgreSQL (в качестве хранилища данных)
- Docker (для запуска сервиса)
- Swagger (для документации API)
- Chi (веб фреймворк)
- Redis (для кеширования)
- uber-go/zap (для логирования)
- golang-migrate/migrate (для миграций БД)
- pgx (драйвер для работы с PostgreSQL)
- golang/mock, testify (для тестирования)
Сервис разработан с использованием современных технологий и следует принципам Clean Architecture, что обеспечивает легкость расширения функционала и тестирования. Также был реализован Graceful Shutdown для корректного завершения работы сервиса.
Getting Started
Для запуска сервиса достаточно заполнить файл .env, расположенный в корневой директории.
Usage
Запустить сервис можно с помощью команды make compose-up
Документацию после завпуска сервиса можно посмотреть по адресу http://localhost:8080/swagger/index.html
с портом 8080 по умолчанию
Для запуска тестов необходимо выполнить команду make test
, для запуска тестов с покрытием make cover
и make cover-html
для получения отчёта в html формате
Для запуска линтера необходимо выполнить команду make linter-golangci
Examples
Некоторые примеры запросов
- Регистрация
- Аутентификация
- Создание заметки
- Получение заметки
- Получение всех заметок
- Обновление заметки
- Удаление заметки
Регистрация
Регистрация пользователя:
curl --location --request POST 'http://localhost:8080/api/auth/sign-up' \
--header 'Content-Type: application/json' \
--data-raw '{
"login":"[email protected]",
"password":"Qwerty123!"
}'
Пример ответа:
{
"status": "success"
}
Аутентификация
Аутентификация пользователя для получения токена доступа:
curl --location --request POST 'http://localhost:8080/api/auth/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"login":"userlogin",
"password":"Qwerty123!"
}'
Пример ответа:
{
"status": "success",
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJldVhzNzRiUnNqNHZKS2RWck4vT0tpOWxyRjZpT3NPZFNwMDNVT0U9In0.GvsuCvrPxq7EbGZE1zHMgvMZiKZymo6FF7m6xt-zIXw"
}
}
Создание заметки
Создание заметки пользователем:
curl --location --request POST 'http://localhost:8080/api/note/create' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJldVhzNzRiUnNqNHZKS2RWck4vT0tpOWxyRjZpT3NPZFNwMDNVT0U9In0.GvsuCvrPxq7EbGZE1zHMgvMZiKZymo6FF7m6xt-zIXw' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "Заголовок заметки 1",
"content": "Содержание заметки 1"
}'
Пример ответа:
{
"status": "success"
}
Получение заметки
Получение одной заметки пользователем:
curl --location --request GET 'http://localhost:8080/api/note/get/1' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJldVhzNzRiUnNqNHZKS2RWck4vT0tpOWxyRjZpT3NPZFNwMDNVT0U9In0.GvsuCvrPxq7EbGZE1zHMgvMZiKZymo6FF7m6xt-zIXw'
Пример ответа:
{
"status": "success",
"data": {
"id": 1,
"title": "Заголовок заметки 1",
"content": "Содержание заметки 1"
}
}
Получение всех заметок
Получение всех заметок пользователя:
curl --location --request GET 'http://localhost:8080/api/note/get-all' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJldVhzNzRiUnNqNHZKS2RWck4vT0tpOWxyRjZpT3NPZFNwMDNVT0U9In0.GvsuCvrPxq7EbGZE1zHMgvMZiKZymo6FF7m6xt-zIXw'
Пример ответа:
{
"status": "success",
"data": [
{
"id": 1,
"title": "Заголовок заметки 1",
"content": "Содержание заметки 1"
},
{
"id": 2,
"title": "Заголовок заметки 2",
"content": "Содержание заметки 2"
}
]
}
Обновление заметки
Обновление заметки пользователя:
curl --location --request PUT 'http://localhost:8080/api/note/update/1' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJldVhzNzRiUnNqNHZKS2RWck4vT0tpOWxyRjZpT3NPZFNwMDNVT0U9In0.GvsuCvrPxq7EbGZE1zHMgvMZiKZymo6FF7m6xt-zIXw' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "Новый заголовок",
"content": "Новое содержание"
}'
Пример ответа:
{
"status": "success"
}
Удаление заметки
Удаление заметки пользователя:
curl --location --request DELETE 'http://localhost:8080/api/note/delete/1' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJldVhzNzRiUnNqNHZKS2RWck4vT0tpOWxyRjZpT3NPZFNwMDNVT0U9In0.GvsuCvrPxq7EbGZE1zHMgvMZiKZymo6FF7m6xt-zIXw' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "Новый заголовок",
"content": "Новое содержание"
}'
Пример ответа:
{
"status": "success"
}