Приложение разработано в рамках прохождения учебного курса Java-разработчик от Яндекс.Практикум
Шеринг как экономика совместного использования набирает сейчас всё большую полярность. Если в 2014
году глобальный рынок шеринга оценивался всего в $15 млрд, то к 2025 может достигнуть $335 млрд.
Почему шеринг так популярен? Представьте, что на воскресной ярмарке вы купили несколько картин и
хотите повесить их дома. Но вот незадача — для этого нужна дрель, а её у вас нет. Можно, конечно,
пойти в магазин и купить, но в такой покупке мало смысла — после того, как вы повесите картины,
дрель будет просто пылиться в шкафу. Можно пригласить мастера — но за его услуги придётся заплатить.
И тут вы вспоминаете, что видели дрель у друга. Сама собой напрашивается идея — одолжить её.
Большая удача, что у вас оказался друг с дрелью и вы сразу вспомнили про него! А не то в поисках
инструмента пришлось бы писать всем друзьям и знакомым. Или вернуться к первым двум вариантам —
покупке дрели или найму мастера. Насколько было бы удобнее, если бы под рукой был сервис, где
пользователи делятся вещами! Это приложение разработано как раз для этого.
Приложение состоит из двух микросервисов.
Сервис gateway — является распределяющим "шлюзом", который проводит валидацию входящих
данных и перенаправляет запрос в сервис server.
Основной сервис server содержит всё необходимое для работы продукта. Хранение данных
осуществляется в базе данных.
Взаимодействие между сервисами осуществляется через restTemplate
.
Приложение позволяет выбрать действия для следующих категорий:
-
пользователь:
- добавление нового пользователя (данные о новом пользователе передаются в теле запроса на
эндпоинт
POST /users
) - получение списка всех пользователей (эндпоинт
GET /users
) - получение пользователя по идентификатору (идентификатор пользователя передаётся
в переменную пути
{userId}
на эндпоинтGET /users/{userId}
) - обновление пользователя (идентификатор пользователя передаётся в переменную пути
{userId}
, данные о новом пользователе передаются в теле запроса на эндпоинтPATCH /users/{userId}
) - удаление пользователя по идентификатору (идентификатор пользователя передаётся
в переменную пути
{userId}
на эндпоинтDELETE /users/{userId}
)
- добавление нового пользователя (данные о новом пользователе передаются в теле запроса на
эндпоинт
-
вещь:
- добавление новой вещи (идентификатор владельца вещи передаётся в заголовке запроса
X-Sharer-User-Id
, данные о новой вещи передаются в теле запроса на эндпоинтPOST /items
) - обновление информации о вещи (идентификатор владельца вещи передаётся в заголовке запроса
X-Sharer-User-Id
, идентификатор вещи для обновления передаётся в переменную пути{itemId}
, данные для обновления информации о вещи передаются в теле запроса на эндпоинтPATCH /items/{itemId}
) - получение информации о вещи по идентификатору (идентификатор пользователя передаётся в
заголовке запроса
X-Sharer-User-Id
, идентификатор вещи передаётся в переменную пути{itemId}
на эндпоинтGET /items/{itemId}
) - получение списка всех вещей пользователя (на эндпоинт
GET /items?from=&size=
передаются идентификатор владельца вещи в заголовке запросаX-Sharer-User-Id
и в параметрах запроса?from=&size=
с какой страницы необходимо показать список вещейfrom
и сколько вещей будет доступно для просмотра на страницеsize
. Параметры запроса?from=&size=
можно не указывать, в этом случае будут отображены первые 10 вещей из всего списка) - поиск вещи по названию или описанию (на эндпоинт
GET /items/search?text=&from=&size=
в параметрах запроса передаются текст для поискаtext
, с какой страницы необходимо показать список результатов поиска вещейfrom
и сколько вещей будет доступно для просмотра на страницеsize
. Параметры запроса?from=&size=
можно не указывать, в этом случае будут отображены первые 10 вещей из всего списка) - добавление комментария к вещи (на эндпоинт
POST /items/{itemId}/comment
передаются идентификатор пользователя в заголовке запросаX-Sharer-User-Id
, идентификатор вещи в переменной пути{itemId}
и данные о новом комментарии в теле запроса)
- добавление новой вещи (идентификатор владельца вещи передаётся в заголовке запроса
-
бронирование вещи (если вещь есть в базе данных):
- добавление нового бронирования (на эндпоинт
POST /bookings
в заголовке запросаX-Sharer-User-Id
передаётся идентификатор пользователя, который хочет забронировать вещь, в теле запроса передаётся информация о новом бронировании) - подтверждение бронирования владельцем вещи (на эндпоинт
PATCH /bookings/{bookingId}
в заголовкеX-Sharer-User-Id
передаётся идентификатор владельца вещи, в переменную пути{bookingId}
передаётся идентификатор бронирования) - получение бронирования по идентификатору (на эндпоинт
GET /bookings/{bookingId}
в заголовкеX-Sharer-User-Id
передаётся идентификатор владельца вещи или пользователя, забронировавшего вещь, в переменную пути{bookingId}
передаётся идентификатор бронирования) - получение всех бронирований пользователя (на эндпоинт
GET /bookings?state=&from=&size=
в заголовке запросаX-Sharer-User-Id
передаётся идентификатор пользователя, бронирования которого требуется получить, в параметр запросаstate=
передаётся статус бронирования ( доступны варианты ALL - все, CURRENT - текущие, PAST - прошедшие, FUTURE - будущие), в параметр запросаfrom=
передаётся номер страницы, с которой необходимо показать список бронирований, в параметр запросаsize=
- сколько вещей будет доступно для просмотра на странице. Параметры запроса?state=&from=&size=
можно не указывать, в этом случае будут отображены первые 10 бронирований из всего списка) - получение всех бронирований владельца вещей (на эндпоинт
GET /bookings/owner?state=&from=&size=
в заголовке запросаX-Sharer-User-Id
передаётся идентификатор владельца вещей, в параметр запросаstate=
передаётся статус бронирования (доступны варианты ALL - все, CURRENT - текущие, PAST - прошедшие, FUTURE - будущие), в параметр запросаfrom=
передаётся номер страницы, с которой необходимо показать список бронирований, в параметр запросаsize=
- сколько вещей будет доступно для просмотра на странице. Параметры запроса?state=&from=&size=
можно не указывать, в этом случае будут отображены первые 10 бронирований из всего списка)
- добавление нового бронирования (на эндпоинт
-
запрос на аренду вещи (если вещи нет в базе данных):
- добавление нового запроса на аренду (на эндпоинт
POST /requests
в заголовке запросаX-Sharer-User-Id
передаётся идентификатор пользователя, который создаёт запрос, в теле запроса передаётся информация о новом запросе на аренду) - получение всех запросов пользователя (на эндпоинт
GET /requests
в заголовке запросаX-Sharer-User-Id
передаётся идентификатор пользователя, который создал запросы) - получение всех имеющихся запросов на аренду (на эндпоинт
GET /requests/all?from=&size=
в заголовке запросаX-Sharer-User-Id
передаётся идентификатор пользователя, в параметр запросаfrom=
передаётся номер страницы, с которой необходимо показать список запросов на аренду, в параметр запросаsize=
- сколько запросов будет доступно для просмотра на странице. Параметры запроса?from=&size=
можно не указывать, в этом случае будут отображены первые 10 запросов из всего списка) - получение запроса на аренду по идентификатору (на эндпоинт
GET /requests/{requestId}
в заголовке запросаX-Sharer-User-Id
передаётся идентификатор пользователя, в переменную пути{requestId}
передаётся идентификатор запроса на аренду)
- добавление нового запроса на аренду (на эндпоинт
- Windows 10 - операционная
система
- Java 11 - язык программирования
- IntelliJ IDEA
2022.1.4 (Ultimate Edition) - среда разработки
- Spring Boot 2.7.2 -
используемый фреймворк
- Apache Maven 4.0.0 - управление зависимостями
- Project Lombok 1.18.24 - библиотека аннотаций для сокращения
шаблонного кода
- Hibernate 5.6.10 - ORM-фреймворк
- PostgreSQL 13.7-alpine - основная база данных
- H2 - база данных для тестирования
- Docker Desktop 20.10.17 -
платформа контейнеризации
- Docker Compose 3.8 - утилита для
развертывания нескольких контейнеров
- Postman 9.31.0 - приложение для выполнения запросов
к API.
- JUnit 5.8.2 - фреймворк для модульного тестирования программного
обеспечения на языке Java.
- Mockito 4.5.1 - фреймворк для тестирования программного
обеспечения.
На Вашем компьютере должны быть установлены соответствующие приложения из раздела "Стек технологий". Для запуска приложения необходимо:
- склонировать проект на свой компьютер
- запустить приложение Docker
- открыть склонированный проект в IntelliJ IDEA
- открыть терминал командной строки и вписать команду
mvn clean package
. Дождаться выполнения успешной сборки проекта. - далее в терминал вписать команду
docker compose up
и дождаться успешного запуска сервисов gateway и server в контейнерах Docker.
Для использования приложения необходимо открыть браузер или программу для
работы с API, например, Postman.
В адресной строке написать https://localhost:8080/
и далее необходимый эндпоинт для
подходящего действия из раздела Функционал.
Написаны модульные и интеграционные тесты (выполняются в отдельной базе данных
H2), также есть тестирование с помощью коллекции тестов и
приложения Postman, способного выполнять запросы к API.
Чтобы выполнить модульные тесты достаточно открыть склонированный проект
в IntelliJ IDEA
, перейти в директорию тестов ShareIt/gateway/src/test/ru.practicum.shareit
и выбрать из
предложенных интересующий класс для проверки (красные стрелки)
или ShareIt/server/src/test/ru.practicum.shareit
и выбрать из предложенных интересующий
класс для проверки (красные стрелки).
Внутри класса можно запустить выполнение определенного теста, нажав на зелёный треугольник слева
от названия теста
или же запустить все тесты, которые есть в данном классе.
Для запуска коллекции тестов необходимо предварительно
выполнить все инструкции из раздела "Запуск приложения", далее запустить
приложение Postman, импортировать
коллекции тестов, нажать на вкладку "Run collection".
Готово. Тесты пройдут автоматически.
Связаться с автором проекта можно в telegram (@gorden73).