API агрегатора погоды с возможностью получения погоды с нескольких сторонних сервисов
"Weather Aggregator Api" - API агрегатора погоды с различных источников, таких как OpenWeather и Яндекс.Погода. Позволяет пользователю выбрать несколько сторонних сервисов погоды и получить погоду со всех выбранных источников в рамках одного JSON ответа.
Дополнительно имеется возможность получить основную информацию по погоде через сайт.
Проект построен на основе микросервисной архитектуры и состоит из следующих модулей, взаимодействующих по REST API:
- Dispatcher - модуль для маршрутизации запроса клиента по различным модулям приложения. Дополнительно валидирует токен;
- Auth API - модуль для сохранения нового пользователя в базе данных и выдачи токена;
- Data API - модуль обработки ответа от загрузчика (Loader API) и формирования единого ответа клиенту по различным погодным сервисам в полном (без обработки ответа от Loader API) или кратком формате;
- Loader API - загрузчик погоды с различных сервисов и отправки ответа без обработки модулю Data API.
- Front - модуль с фронтом, через который возможно получить краткий информативный ответ по погоде.
В случае положительного результата, возвращается ответ со следующим шаблоном и статусом 200 (OK):
{
"status": "report",
"report": {
...
}
}
В случае ошибки, возвращается ответ со статусом 409 (CONFLICT) с описанием ошибки. Пример ответа:
{
"status": "error",
"error": {
"errorCode": "USER_NOT_FOUND",
"message": "User with login test not found"
}
}
В случае, если на модуль Dispatcher от другого модуля приходит ответ с кодом ошибки 500 (INTERNAL ERROR), то клиенту возвращается ответ со статусом 409 (CONFLICT) в следующем формате:
{
"status": "error",
"error": {
"errorCode": "INTERNAL_ERROR",
"message": "An internal error occurred. Try later"
}
}
-
Регистрация пользователя:
Пример запроса
{ "login": "test", "email": "[email protected]", "password": "qwerty" }
Пример ответа
{ "status": "report", "report": { "key": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjM2MDM1MjMzLCJleHAiOjE2MzYwMzUyOTN9.ROlNhAe_Iyn-O9F39Jjvzvq7uXF_Qi-tRxFFvrS3VTE" } }
-
Получение погоды в кратком формате:
Пример запроса
{ "city": "moscow", "services": [ "openweather", "yandexweather" ], "needDetailed": false, "key": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0IiwiaWF0IjoxNjM2MDM1NzcyLCJleHAiOjE2MzYwMzU4MzJ9.-CSupaSkP2Bv_rJ5evTV6PrN0fuqAhOwTeGW7VSLuXY" }
Пример ответа
{ "status": "report", "report": { "openweather": { ... }, "yandexweather": { ... } } }
Для запуска проекта выполните следующие действия:
-
Клонируйте проект:
$ git clone https://github.com/phenomiks/weather_aggregator_api.git
-
Перенесите файл "private.properties" (./{module_name}/config) в "./{module_name}/src/main/resources" для каждого модуля.
Auth API:
jwt.secret={secret} jwt.expiredTime={time} # secret - секретное слово для создания JWT токена; # time - время в минутах (целое число).
Dispatcher
jwt.secret={secret} # secret - секретное слово для расшифроки токена (должно совпадать с ключем из Auth API).
Loader API:
api.key.open.weather={key} api.key.yandex.weather={key} # key - ключи от сервисов OpenWeather и Яндекс.Погода.
Front:
jwt.key={key} # key - токен, выпущенный модулем Auth API.
-
Соберите каждый модуль проекта:
mvn clean install
-
Запустите каждый модуль проекта:
java -jar {jar_file}.jar
Java 11, Spring Boot, Spring Web, Spring Data JPA, Spring Validation, H2 Database, Flyway, Swagger, JUnit, Mockito, Thymeleaf, Maven