Тестовый проект, реализующий логику добавления пользователями отзывов к сущностям с возможностью прикрепить фотографии. Добавленный отзыв возвращается с ссылками на загруженные фотографии.
Приложение имеет микросервисную архитектуру с отдельным сервисом для загрузки фотографий. Фотографии сохраняются на облачное хранилище S3 Yandex Object Storage, используя AWS SDK.
Проект реализовывался на основе идеи из моего веб-приложения Explore With Me.
Клиент: RestTemplate
Сервер: Java 11, Spring Boot, Maven, Hibernate, PostgreSQL, Lombok, Docker, AWS SDK, Java Concurrency
Для развертывания приложения:
- Склонируйте репозиторий на локальный компьютер
- В docker-compose.yml укажите ваши данные для доступа к Yandex Object Storage в переменных окружения
BUCKET_NAME
,ACCESS_KEY_ID
,SECRET_KEY
- Соберите проект:
mvn clean package
docker compose up
- Хранение и доступ к фотографиям из S3 с использованием AWS SDK
- Загрузка каждой фотографии в отдельном потоке для увеличения производительности
Ниже описаны основные запросы для проверки реализации проекта.
Header: application/json
POST /users
Параметр | Тип | Описание |
---|---|---|
name |
String |
Данные добавляемого пользователя |
Пример тела запроса:
{
"name": "Nick"
}
Header: multipart/form-data
POST /comments/users/{userId}
Параметр | Тип | Описание |
---|---|---|
userId |
Long |
ID пользователя |
text |
String |
Required. Текст отзыва (от 50 до 2000 символов) |
rating |
int |
Required. Рейтинг, поставленный в отзыве (от 1 до 5) |
photos |
List<MultipartFile> |
Фотографии, прикрепленные к отзыву |
Пример тела успешного ответа при добавлении отзыва с фотографиями:
{
"id": 9,
"authorName": "Nick",
"text": "Отличное заведение. Мне все понравилось, обязательно приду еще раз и покушаю булочек.",
"created": "2023-09-19 15:43:48",
"rating": 5,
"photos": [
"https://your-bucket.storage.yandexcloud.net/your-file-name",
"https://your-bucket.storage.yandexcloud.net/your-file-name",
"https://your-bucket.storage.yandexcloud.net/your-file-name",
]
}
Эндпоинт используется только для внутренних запросов от основного сервиса через Upload Client.
Header: application/json
POST /upload
Параметр | Тип | Описание |
---|---|---|
photos |
List<byte[]> |
Список фотографий в байтах |
Полученные ссылки на фотографии сохраняются в БД, прикрепляясь к отзыву. При отправке GET запроса на получение отзыва или списка всех отзывов, ссылки подтягиваются прямо из БД без обращения в облако.
- Реализовать функционал удаления фотографий из S3 при удалении отзыва