feature: added openweathermap weather provider

This commit is contained in:
amorozov 2025-05-21 16:53:21 +03:00
parent 30e5fa44d3
commit 66b0b821f6
8 changed files with 111 additions and 4 deletions

View File

@ -12,6 +12,7 @@ repositories {
dependencies { dependencies {
testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter'
implementation 'org.json:json:20250517'
} }
test { test {

View File

@ -1,5 +1,9 @@
package ru.dima.weather; package ru.dima.weather;
import ru.dima.weather.city.CityByIpResolver;
import ru.dima.weather.http.HttpRequester;
import ru.dima.weather.provider.OpenWeatherMapWeatherProvider;
/* /*
1. Брать текущий IP 1. Брать текущий IP
2. Определять город по текущему IP 2. Определять город по текущему IP
@ -8,7 +12,11 @@ package ru.dima.weather;
public class WeatherApp { public class WeatherApp {
public static void main(String[] args) { public static void main(String[] args) {
var cityByIpResolver = new CityByIpResolver(new HttpRequester()); var httpRequester = new HttpRequester();
var cityByIpResolver = new CityByIpResolver(httpRequester);
System.out.println(cityByIpResolver.getCurrentCityViaIP()); System.out.println(cityByIpResolver.getCurrentCityViaIP());
var openWeatherMapProvider = new OpenWeatherMapWeatherProvider(httpRequester, "29ed5ca47c3d0c32385b18f1e82e522f");
System.out.println(openWeatherMapProvider.getWeeklyWeatherInCity(cityByIpResolver.getCurrentCityViaIP()));
} }
} }

View File

@ -1,4 +1,6 @@
package ru.dima.weather; package ru.dima.weather.city;
import ru.dima.weather.http.HttpRequester;
public class CityByIpResolver { public class CityByIpResolver {
@ -11,6 +13,6 @@ public class CityByIpResolver {
} }
public String getCurrentCityViaIP() { public String getCurrentCityViaIP() {
return httpRequester.getString(IP_INFO_URL); return httpRequester.getString(IP_INFO_URL).replace("\n", "").replace("\r", "");
} }
} }

View File

@ -1,4 +1,4 @@
package ru.dima.weather; package ru.dima.weather.http;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;

View File

@ -0,0 +1,15 @@
package ru.dima.weather.provider;
import java.util.ArrayList;
import java.util.List;
public class MultiDaysWeatherInfo {
List<WeatherInfo> perDayWeather = new ArrayList<>();
@Override
public String toString() {
return "MultiDaysWeatherInfo{" +
"perDayWeather=" + perDayWeather +
'}';
}
}

View File

@ -0,0 +1,59 @@
package ru.dima.weather.provider;
import org.json.JSONObject;
import ru.dima.weather.http.HttpRequester;
import java.util.Map;
import java.util.stream.Collectors;
public class OpenWeatherMapWeatherProvider implements WeatherProvider {
private HttpRequester httpRequester;
private String openWeatherMapAccessToken;
public static final String OPEN_WEATHER_MAP_BASE_FORECAST_URL = "https://api.openweathermap.org/data/2.5/forecast";
public static final String OPEN_WEATHER_MAP_CITY_NAME_QUERY = "q";
public static final String OPEN_WEATHER_MAP_ACCESS_TOKEN_QUERY = "appid";
public static final String NAME = "open-weather-map";
public OpenWeatherMapWeatherProvider(HttpRequester httpRequester, String openWeatherMapAccessToken) {
this.httpRequester = httpRequester;
this.openWeatherMapAccessToken = openWeatherMapAccessToken;
}
@Override
public MultiDaysWeatherInfo getWeeklyWeatherInCity(String cityName) {
var weatherResponse = httpRequester.getString(getWeeklyWeatherRequestUrl(cityName));
var jsonObject = new JSONObject(weatherResponse);
var weatherArray = jsonObject.getJSONArray("list");
var resultWeeklyWeather = new MultiDaysWeatherInfo();
for (var day = 0; day < 7; day ++) {
var forecast = weatherArray.getJSONObject(day);
var mainData = forecast.getJSONObject("main");
var temperature = mainData.getDouble("temp");
resultWeeklyWeather.perDayWeather.add(new WeatherInfo(temperature));
}
return resultWeeklyWeather;
}
@Override
public String getName() {
return NAME;
}
private String getWeeklyWeatherRequestUrl(String cityName) {
var queryString = Map.of(
OPEN_WEATHER_MAP_CITY_NAME_QUERY, cityName,
OPEN_WEATHER_MAP_ACCESS_TOKEN_QUERY, openWeatherMapAccessToken,
"units", "metric"
).entrySet().stream()
.map(queryParameter -> queryParameter.getKey() + "=" + queryParameter.getValue())
.collect(Collectors.joining("&"));
return OPEN_WEATHER_MAP_BASE_FORECAST_URL + "?" + queryString;
}
}

View File

@ -0,0 +1,16 @@
package ru.dima.weather.provider;
public class WeatherInfo {
public double temperature;
public WeatherInfo(double temperature) {
this.temperature = temperature;
}
@Override
public String toString() {
return "WeatherInfo{" +
"temperature=" + temperature +
'}';
}
}

View File

@ -0,0 +1,6 @@
package ru.dima.weather.provider;
public interface WeatherProvider {
MultiDaysWeatherInfo getWeeklyWeatherInCity(String cityName);
String getName();
}