package core.repositories.releases.tags;
import com.alorma.github.sdk.bean.info.RepoInfo;
import core.datasource.CloudDataSource;
import core.datasource.RestWrapper;
import core.datasource.SdkItem;
import core.repositories.Commit;
import core.repositories.releases.Release;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.Callable;
import retrofit2.Call;
import retrofit2.Response;
import rx.Observable;
public class TagsCloudDataSource extends CloudDataSource<RepoInfo, List<Tag>> {
private final RestWrapper restWrapper;
private String sortOrder;
public TagsCloudDataSource(RestWrapper restWrapper, String sortOrder) {
super(restWrapper);
this.restWrapper = restWrapper;
this.sortOrder = sortOrder;
}
@Override
protected Observable<SdkItem<List<Tag>>> execute(SdkItem<RepoInfo> data, RestWrapper service) {
final RepositoryTagsService repositoryTagsService = restWrapper.get();
final RepoInfo repoInfo = data.getK();
Integer page = data.getPage();
return Observable.fromCallable(() -> {
Call<List<Tag>> call;
if (page != null && page > 0) {
call = repositoryTagsService.tags(repoInfo.owner, repoInfo.name, page, sortOrder);
} else {
call = repositoryTagsService.tags(repoInfo.owner, repoInfo.name, sortOrder);
}
Response<List<Tag>> response = call.execute();
int page1 = Integer.MIN_VALUE;
if (restWrapper.isPaginated(response)) {
page1 = restWrapper.getPage(response);
}
List<Tag> tags = response.body();
//fetchCommits(tags, repositoryTagsService, repoInfo);
fetchRelease(tags, repositoryTagsService, repoInfo);
return new SdkItem<>(page1, tags);
});
}
private void fetchRelease(List<Tag> tags, RepositoryTagsService repositoryTagsService, RepoInfo repo) {
for (Tag tag : tags) {
Call<Release> commitCall = repositoryTagsService.release(repo.owner, repo.name, tag.getName());
try {
Response<Release> commitResponse = commitCall.execute();
tag.release = commitResponse.body();
} catch (IOException e) {/*do nothing release doesnt exist*/}
}
}
private void fetchCommits(List<Tag> tags,
RepositoryTagsService repositoryTagsService, RepoInfo repo)
throws IOException {
for (Tag tag : tags) {
Call<Commit> commitCall =
repositoryTagsService.commit(repo.owner, repo.name, tag.getSha().sha);
Response<Commit> commitResponse = commitCall.execute();
tag.commit = commitResponse.body();
}
}
}