package com.edulify.modules.geolocation.providers;
import com.edulify.modules.geolocation.Geolocation;
import com.edulify.modules.geolocation.GeolocationProvider;
import play.Configuration;
import play.libs.F;
import play.libs.concurrent.HttpExecution;
import play.libs.ws.WSClient;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.concurrent.CompletionStage;
@Singleton
public class MaxmindProvider implements GeolocationProvider {
private String license;
private WSClient ws;
private Configuration configuration;
@Inject
public MaxmindProvider(WSClient ws, Configuration configuration) {
this.ws = ws;
this.configuration = configuration;
this.license = this.configuration.getString("geolocation.maxmind.license");
}
@Override
public CompletionStage<Geolocation> get(final String ip) {
String url = String.format("https://geoip.maxmind.com/a?l=%s&i=%s", license, ip);
return ws.url(url)
.get()
.thenApplyAsync(response -> {
if (response.getStatus() != 200) return null;
String body = response.getBody();
if ("(null),IP_NOT_FOUND".equals(body)) return null;
return body;
}, HttpExecution.defaultContext())
.thenApplyAsync(body -> {
if (body == null) return Geolocation.empty();
return new Geolocation(ip, body);
}, HttpExecution.defaultContext());
}
}