Ветка master содержит проект, в котором выполнена адаптация под SQL и NOSQL базы данных. (быстрое переключение из конфига)
Для переключение между бд, необходимо настроить данные для подключения в application.properties, а также выбрать профиль: spring.profiles.active=nosql/sql.
Пожалуйста, смотрите на даты коммитов, ибо много клонов и уник.просмотров, судя по статистике гита :D.
Решена проблема 1+n для GET /hotels (через JPQL) и GET /hotels/search (через CriteriaApi, следующий пункт).
Для поиска отелей/гостиниц был использован CriteriaApi, что позволяет выполнять поиск по одному или сразу по нескольким параметрам: /search?city=minsk&country=Belarus. Также можно искать по множеству Amenities /search?amenities=Free_WIFI,Free_PARKING.
Исключение -> MongoDB реализация, где CriteriaApi позволяет использовать только 1 критерий для каждого поля. Но он все еще поддерживает поиск по разным параметрам одновременно.
Для /histogram/{param} в HistogramDAO был написан кастомный запрос. (для SQL это запросы на HQL, для NOSQL - запросы с использованием CriteriaApi).
При GET /hotels/{id} с неверным id возвращается пустой результат (в связи с введенным замечанием), изначально такое действие пробрасывало ошибку с сообщением (закомментированно).
Чтобы избежать нагруженности кода, часть аннатоций контроллера была вынесена в интерфейсы. Там же описаны и аннотации к Swagger.
Конвертация сущностей в DTO объекты (и обратно) происходит с помощью класса HotelMapper, которому с конвертацией помогает ModelMapper.
Судя по примеру телу ответа в ТЗ, в роли entity существуют Address, Contacts и ArravalTime. Поэтому в проекте они реализованы как сущности.
Amenities - просто массив/список строк. Также по своей логике, Amenities, или "Теги", будут "стандартизированы" (т.к. мы планируем делать групповую статистику, то очевидно что пользователь не сможет "вручную" вводить имена Amenities ), поэтому в проекте они представлены в виде Enum. (enum в бд - зло, поэтому делаем колонку amenity типа varchar, а не enum)
При запросе списка всех отелей/гостиниц GET /hotels и в поиске GET /hotels/search отсутствует пагинация (следуя ТЗ), хотя полученный список может быть достаточно объемным.
По ТЗ, список Amenities можно только заменить, но не изменить. В перспективе я бы добавил возможность удалять\добавлять теги.