Skip to content

Приложение для аренды вещей.

Notifications You must be signed in to change notification settings

Serg-Shapkin/Shareit

Repository files navigation

Shareit (сервис для шеринга вещей)

(от англ. share - "делиться")

Идея

В этом модуле вы будете создавать сервис для шеринга (от англ. share — «делиться») вещей. Шеринг как экономика совместного использования набирает сейчас всё большую полярность. Если в 2014 году глобальный рынок шеринга оценивался всего в $15 млрд, то к 2025 может достигнуть $335 млрд. Почему шеринг так популярен. Представьте, что на воскресной ярмарке вы купили несколько картин и хотите повесить их дома. Но вот незадача — для этого нужна дрель, а её у вас нет. Можно, конечно, пойти в магазин и купить, но в такой покупке мало смысла — после того, как вы повесите картины, дрель будет просто пылиться в шкафу. Можно пригласить мастера — но за его услуги придётся заплатить. И тут вы вспоминаете, что видели дрель у друга. Сама собой напрашивается идея — одолжить её. Большая удача, что у вас оказался друг с дрелью и вы сразу вспомнили про него! А не то в поисках инструмента пришлось бы писать всем друзьям и знакомым. Или вернуться к первым двум вариантам — покупке дрели или найму мастера. Насколько было бы удобнее, если бы под рукой был сервис, где пользователи делятся вещами! 328_1687267453

Задача

Сервис должен обеспечить пользователям возможность рассказывать какими вещами они готовы поделиться, находить нужную вещь и брать её в аренду на какое-то время. Сервис должен не только позволять бронировать вещь на определённые даты, но и закрывать к ней доступ на время бронирования от других желающих. На случай, если нужной вещи на сервисе нет, у пользователей должна быть возможность оставлять запросы. Вдруг древний граммофон, который странно даже предлагать к аренде, неожиданно понадобится для театральной постановки. По запросу можно будет добавлять новые вещи для шеринга.

Особенности реализации приложения

1. Приложение состоит из двух микросервисов:

  • Сервис gateway — является распределяющим шлюзом, который проводит валидацию входящих данных и перенаправляет запрос в сервис server
  • Сервис server - основной сервис, который выполняет всю реальную работу - в том числе обращается к базе данных

2. Каждое из приложений запускается как самостоятельное Java-приложение, а их общение происходит через REST

  • Чтобы сделать запуск и взаимодействие приложений более предсказуемым и удобным, сервисы размещены в Docker-контейнерах.
  • Также в Docker-контейнер вынесена база данных.

Реализованный функционал

  1. Работа с пользователями (User)
    • Добавить пользователя. Эндпоинт: POST /users
    • Получить список всех пользователей. Эндпоинт: GET /users
    • Получить пользователя по id. Эндпоинт: GET /users/{id}
      (id пользователя передается в переменную пути)
    • Обновить данные пользователя. Эндпоинт: PATCH /users/{id}
      (id пользователя передается в переменную пути)
    • Удалить пользователя по id. Эндпоинт: DELETE /users/{id}
      (id пользователя передается в переменную пути)
  2. Работа с вещью (Item)
    • Добавить вещь. Эндпоинт: POST: /items
    • Получить список всех вещей пользователя. Эндпоинт: GET /items?from=&size=
      (идентификатор владельца вещи передаётся в заголовке запроса X-Sharer-User-Id,
      в параметрах запроса ?from=&size=
      - from - с какой страницы необходимо показать список вещей;
      - size - сколько вещей будет доступно для просмотра на странице.
      Параметры запроса ?from=&size= можно не указывать, в этом случае будут отображены первые 10 вещей из всего списка)
    • Получить вещь по id. Эндпоинт: GET /items/{itemId}
      (идентификатор владельца вещи передаётся в заголовке запроса X-Sharer-User-Id,
      id вещи передается в переменную пути)
    • Обновить информацию о вещи. Эндпоинт: PATCH /items/{itemId}
      (идентификатор владельца вещи передаётся в заголовке запроса X-Sharer-User-Id,
      id вещи передается в переменную пути)
    • Поиск вещи по названию или описанию. Эндпоинт: GET /items/search?text=&from=&size=
      (идентификатор владельца вещи передаётся в заголовке запроса X-Sharer-User-Id,
      в параметрах запроса ?text=&from=&size=
      - text - текст для поиска;
      - from - с какой страницы необходимо показать список вещей;
      - size - сколько вещей будет доступно для просмотра на странице.
      Параметры запроса ?from=&size= можно не указывать, в этом случае будут отображены первые 10 вещей из всего списка)
    • Добавить комментарий к вещи. Эндпоинт: POST /items{itemId}/comment
      (идентификатор владельца вещи передаётся в заголовке запроса X-Sharer-User-Id,
      id вещи передается в переменную пути
      и данные о новом комментарии в теле запроса.)
  3. Работа с бронированием вещи (Booking)
    • Добавить бронирование. Эндпоинт: POST /bookings
      (идентификатор владельца, который хочет забронировать, передаётся в заголовке запроса X-Sharer-User-Id,
      данные о новом бронировании передаются в теле запроса.)
    • Подтверждение бронирования владельцем вещи. Эндпоинт: PATCH /bookings/{bookingId}
      (идентификатор владельца передаётся в заголовке запроса X-Sharer-User-Id,
      id бронирования передается в переменную пути.)
    • Получить бронирование по id. Эндпоинт: GET /bookings/{bookingId}
      (идентификатор владельца или пользователя, который забронировал вещь, передаётся в заголовке запроса X-Sharer-User-Id,
      id бронирования передается в переменную пути.)
    • Получить все бронирования пользователя. Эндпоинт: GET /bookings?state=&from=&size=
      (идентификатор пользователя, бронирования которого необходимо получить, передаётся в заголовке запроса X-Sharer-User-Id,
      в параметрах запроса ?state=&from=&size=
      - state - статус бронирования (ALL - по умолчанию, CURRENT, PAST, FUTURE);
      - from - с какой страницы необходимо показать список вещей;
      - size - сколько вещей будет доступно для просмотра на странице.
      Параметры запроса ?from=&size= можно не указывать, в этом случае будут отображены первые 10 вещей из всего списка)
    • Получить все бронирования владельца вещей. Эндпоинт: GET /bookings/owner?state=&from=&size=
      (идентификатор владельца вещей передаётся в заголовке запроса X-Sharer-User-Id,
      в параметрах запроса ?state=&from=&size=
      - state - статус бронирования (ALL - по умолчанию, CURRENT, PAST, FUTURE);
      - from - с какой страницы необходимо показать список вещей;
      - size - сколько вещей будет доступно для просмотра на странице.
      Параметры запроса ?from=&size= можно не указывать, в этом случае будут отображены первые 10 вещей из всего списка)
  4. Работа с запросом на аренду вещи (Request)
    • Добавить новый запрос на аренду вещи. Эндпоинт: 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 - сколько вещей будет доступно для просмотра на странице.
      Параметры запроса ?from=&size= можно не указывать, в этом случае будут отображены первые 10 вещей из всего списка)
    • Получить запрос на аренду вещи по id. Эндпоинт: GET /requests/{requestId}
      (идентификатор пользователя передаётся в заголовке запроса X-Sharer-User-Id,
      id запроса передается в переменную пути.)