package tc.oc.api.minecraft.servers;
import java.util.Collection;
import java.util.Collections;
import javax.inject.Inject;
import javax.inject.Singleton;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import tc.oc.api.docs.Server;
import tc.oc.api.docs.virtual.ServerDoc;
import tc.oc.api.message.types.FindMultiRequest;
import tc.oc.api.message.types.FindMultiResponse;
import tc.oc.api.message.types.FindRequest;
import tc.oc.api.message.types.PartialModelUpdate;
import tc.oc.api.message.types.UpdateMultiRequest;
import tc.oc.api.message.types.UpdateMultiResponse;
import tc.oc.api.model.NullModelService;
import tc.oc.api.servers.BungeeMetricRequest;
import tc.oc.api.servers.ServerService;
@Singleton
public class LocalServerService extends NullModelService<Server, ServerDoc.Partial> implements ServerService {
@Inject private LocalServerDocument document;
@Override
public ListenableFuture<?> doBungeeMetric(BungeeMetricRequest request) {
return Futures.immediateFuture(null);
}
@Override
public ListenableFuture<FindMultiResponse<Server>> find(FindRequest<Server> request) {
if(request instanceof FindMultiRequest) {
final Collection<String> ids = ((FindMultiRequest) request).ids();
return Futures.immediateFuture(() -> ids.contains(document._id()) ? Collections.singletonList(document)
: Collections.emptyList());
} else {
return Futures.immediateFuture(() -> Collections.singletonList(document));
}
}
@Override
public ListenableFuture<Server> update(String id, PartialModelUpdate<ServerDoc.Partial> request) {
if(document.equals(request.document())) {
document.update(request.document());
return Futures.immediateFuture(document);
}
return super.update(id, request);
}
@Override
public ListenableFuture<UpdateMultiResponse> updateMulti(UpdateMultiRequest<? extends ServerDoc.Partial> request) {
request.documents().forEach(this::update);
return super.updateMulti(request);
}
}