package com.alorma.github.presenter.repo;
import com.alorma.github.sdk.bean.info.CommitInfo;
import com.alorma.github.sdk.bean.info.RepoInfo;
import core.datasource.SdkItem;
import core.repositories.Branch;
import core.repositories.Commit;
import core.repositories.GitCommit;
import core.repositories.Repo;
import core.repository.CheckStarRepository;
import core.repository.GenericRepository;
import core.repository.GetRepositoryWatchRepository;
import java.util.List;
import rx.Observable;
public class GetRepositoryUseCaseImpl implements GetRepositoryUseCase {
private final GenericRepository<RepoInfo, Repo> repoGenericRepository;
private final GenericRepository<RepoInfo, List<Branch>> branchesGenericRepository;
private final GenericRepository<CommitInfo, Commit> commitGenericRepository;
private final CheckStarRepository repoStarredRepository;
private GetRepositoryWatchRepository repoWatchedRepository;
public GetRepositoryUseCaseImpl(GenericRepository<RepoInfo, Repo> repoGenericRepository,
GenericRepository<RepoInfo, List<Branch>> branchesGenericRepository,
GenericRepository<CommitInfo, Commit> commitGenericRepository,
CheckStarRepository repoStarredRepository,
GetRepositoryWatchRepository getWatchUseCase) {
this.repoGenericRepository = repoGenericRepository;
this.branchesGenericRepository = branchesGenericRepository;
this.commitGenericRepository = commitGenericRepository;
this.repoStarredRepository = repoStarredRepository;
this.repoWatchedRepository = getWatchUseCase;
}
@Override
public Observable<SdkItem<Repo>> getRepository(RepoInfo repoInfo) {
return getRepository(repoInfo, false);
}
@Override
public Observable<SdkItem<Repo>> getRepository(RepoInfo repoInfo, boolean refresh) {
SdkItem<RepoInfo> repoInfoSdkItem = new SdkItem<>(repoInfo);
Observable<Repo> repoObservable = repoGenericRepository.execute(repoInfoSdkItem, refresh).map(SdkItem::getK);
Observable<Boolean> starredObservable = repoStarredRepository.check(repoInfo);
Observable<Boolean> watchedObservable = repoWatchedRepository.check(repoInfo);
Observable<Repo> observable = Observable.zip(repoObservable, starredObservable, watchedObservable, (repo, starred, watched) -> {
repo.setStarred(starred);
repo.setWatched(watched);
return repo;
});
Observable<List<Branch>> branchObservable =
branchesGenericRepository.execute(repoInfoSdkItem).map(SdkItem::getK).flatMap(Observable::from).flatMap((branch) -> {
CommitInfo info = new CommitInfo();
info.repoInfo = repoInfo;
info.sha = branch.commit.sha;
return commitGenericRepository.execute(new SdkItem<>(info)).map(SdkItem::getK);
}, (branch, commit) -> {
if (branch.commit.sha.equals(commit.sha)) {
branch.commit = new Commit();
branch.commit.sha = commit.sha;
branch.commit.author = commit.author;
if (commit.commit != null) {
branch.commit.commit = new GitCommit();
branch.commit.commit.author = commit.commit.author;
branch.commit.commit.sha = commit.commit.sha;
}
}
return branch;
}).toList();
observable = Observable.zip(observable, branchObservable, (repo, branches) -> {
repo.setBranches(branches);
if (branches != null && branches.size() > 0) {
if (repo.defaultBranch == null) {
repo.defaultBranch = branches.get(0).name;
repo.defaultBranchObject = branches.get(0);
} else {
for (Branch branch : branches) {
if (repo.defaultBranch.equals(branch.name)) {
repo.defaultBranchObject = branch;
}
}
}
}
return repo;
});
observable = observable.doOnNext(repo -> repoGenericRepository.save(repoInfo, repo));
return observable.map(SdkItem::new);
}
}