package tc.oc.api.model;
import java.util.Collection;
import javax.inject.Inject;
import com.damnhandy.uri.template.UriTemplate;
import com.google.common.reflect.TypeToken;
import com.google.common.util.concurrent.ListenableFuture;
import tc.oc.api.docs.virtual.Model;
import tc.oc.api.http.HttpClient;
import tc.oc.api.http.HttpOption;
import tc.oc.api.message.types.FindMultiRequest;
import tc.oc.api.message.types.FindMultiResponse;
import tc.oc.api.message.types.FindRequest;
import static com.google.common.base.Preconditions.checkArgument;
public class HttpQueryService<Complete extends Model> implements QueryService<Complete> {
@Inject private ModelMeta<Complete, ?> meta;
@Inject private HttpClient client;
@Override
public TypeToken<Complete> completeType() {
return meta.completeType();
}
protected HttpClient client() {
return this.client;
}
protected String collectionUri() {
return '/' + meta.pluralName();
}
protected String collectionUri(String action) {
return UriTemplate.fromTemplate("/{model}/{action}")
.set("model", meta.pluralName())
.set("action", action)
.expand();
}
protected String findMultiUri() {
return collectionUri("find_multi");
}
protected String memberUri(String id) {
return UriTemplate.fromTemplate("/{model}/{id}")
.set("model", meta.pluralName())
.set("id", id)
.expand();
}
protected String memberUri(String id, String action) {
return UriTemplate.fromTemplate("/{model}/{id}/{action}")
.set("model", meta.pluralName())
.set("id", id)
.set("action", action)
.expand();
}
@Override
public ListenableFuture<FindMultiResponse<Complete>> all() {
return client().get(collectionUri(), meta.multiResponseType(), HttpOption.INFINITE_RETRY);
}
@Override
public ListenableFuture<Complete> find(String id) {
return client().get(memberUri(id), meta.completeType(), HttpOption.INFINITE_RETRY);
}
@Override
public ListenableFuture<FindMultiResponse<Complete>> find(FindRequest<Complete> request) {
return client().post(findMultiUri(), request, meta.multiResponseType(), HttpOption.INFINITE_RETRY);
}
@Override
public ListenableFuture<FindMultiResponse<Complete>> find(Collection<String> ids) {
return find(new FindMultiRequest(meta.partialTypeRaw(), ids));
}
}