/java-s3

Service for uploading photos from user comments to S3 Yandex Object Storage using AWS SDK

Primary LanguageJava

Загрузка фотографий в S3

Тестовый проект, реализующий логику добавления пользователями отзывов к сущностям с возможностью прикрепить фотографии. Добавленный отзыв возвращается с ссылками на загруженные фотографии.

Приложение имеет микросервисную архитектуру с отдельным сервисом для загрузки фотографий. Фотографии сохраняются на облачное хранилище S3 Yandex Object Storage, используя AWS SDK.

Проект реализовывался на основе идеи из моего веб-приложения Explore With Me.

Статья по проекту на Habr

Habr

Используемые технологии

Клиент: RestTemplate

Сервер: Java 11, Spring Boot, Maven, Hibernate, PostgreSQL, Lombok, Docker, AWS SDK, Java Concurrency

Инструкция по запуску

Для развертывания приложения:

  mvn clean package
  docker compose up

Фичи

  • Хранение и доступ к фотографиям из S3 с использованием AWS SDK
  • Загрузка каждой фотографии в отдельном потоке для увеличения производительности

Спецификация API

Ниже описаны основные запросы для проверки реализации проекта.

Основной сервис

Создание пользователя

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 сервис

Эндпоинт используется только для внутренних запросов от основного сервиса через Upload Client.

Загрузка фотографий

Header: application/json
POST /upload
Параметр Тип Описание
photos List<byte[]> Список фотографий в байтах

База данных

Полученные ссылки на фотографии сохраняются в БД, прикрепляясь к отзыву. При отправке GET запроса на получение отзыва или списка всех отзывов, ссылки подтягиваются прямо из БД без обращения в облако.

EWM ER-диаграмма

Планы по доработке

  • Реализовать функционал удаления фотографий из S3 при удалении отзыва