49 lines
1.9 KiB
Java
49 lines
1.9 KiB
Java
package tc.oc.api.ocn;
|
|
|
|
import java.util.Collection;
|
|
import javax.inject.Singleton;
|
|
|
|
import com.google.common.util.concurrent.ListenableFuture;
|
|
import tc.oc.api.docs.MapRating;
|
|
import tc.oc.api.docs.virtual.MapDoc;
|
|
import tc.oc.api.docs.virtual.UserDoc;
|
|
import tc.oc.api.exceptions.NotFound;
|
|
import tc.oc.api.http.HttpOption;
|
|
import tc.oc.api.maps.MapRatingsRequest;
|
|
import tc.oc.api.maps.MapRatingsResponse;
|
|
import tc.oc.api.maps.MapService;
|
|
import tc.oc.api.maps.UpdateMapsResponse;
|
|
import tc.oc.api.model.HttpModelService;
|
|
import tc.oc.commons.core.concurrent.FutureUtils;
|
|
import tc.oc.commons.core.stream.Collectors;
|
|
|
|
@Singleton
|
|
class OCNMapService extends HttpModelService<MapDoc, MapDoc> implements MapService {
|
|
|
|
public ListenableFuture<Object> rate(MapRating rating) {
|
|
return this.client().post(memberUri(rating.map_id, "rate"), rating, Object.class, HttpOption.INFINITE_RETRY);
|
|
}
|
|
|
|
public ListenableFuture<MapRatingsResponse> getRatings(MapRatingsRequest request) {
|
|
return this.client().post(memberUri(request.map_id, "get_ratings"), request, MapRatingsResponse.class, HttpOption.INFINITE_RETRY);
|
|
}
|
|
|
|
public UpdateMapsResponse updateMaps(Collection<? extends MapDoc> maps) {
|
|
final ListenableFuture<MapUpdateMultiResponse> future = updateMulti(maps, MapUpdateMultiResponse.class);
|
|
return new UpdateMapsResponse(
|
|
(ListenableFuture) future,
|
|
maps.stream()
|
|
.flatMap(MapDoc::authorAndContributorUuids)
|
|
.distinct()
|
|
.collect(Collectors.mappingTo(uuid -> FutureUtils.mapSync(
|
|
future,
|
|
response -> {
|
|
final UserDoc.Identity user = response.users_by_uuid.get(uuid);
|
|
if(user != null) return user;
|
|
throw new NotFound();
|
|
}
|
|
)))
|
|
);
|
|
}
|
|
}
|