// Path: app/src/main/java/io/github/kobakei/anago/dao/AuthTokenDao.java
// @Singleton
// public class AuthTokenDao {
// 
//     private final OrmaDatabase ormaDatabase;
// 
//     @Inject
//     public AuthTokenDao(OrmaDatabase ormaDatabase) {
//         this.ormaDatabase = ormaDatabase;
//     }
// 
//     public Single<Long> upsert(AuthToken authToken) {
//         return ormaDatabase.relationOfAuthToken()
//                 .upserter()
//                 .executeAsObservable(authToken);
//     }
// 
//     public Single<AuthToken> get() {
//         return ormaDatabase.relationOfAuthToken()
//                 .selector()
//                 .limit(1)
//                 .executeAsObservable()
//                 .toSingle();
//     }
// 
//     public Single<Integer> removeAll() {
//         return ormaDatabase.relationOfAuthToken()
//                 .deleter()
//                 .executeAsObservable();
//     }
// }
// 
// Path: app/src/main/java/io/github/kobakei/anago/net/GitHubApiClient.java
// public interface GitHubApiClient {
// 
//     @PUT("/authorizations/clients/{client_id}/{fingerprint}")
//     Single<AuthToken> putAuthorization(@Header("Authorization") String authorization,
//                                        @Path("client_id") String clientId,
//                                        @Path("fingerprint") String fingerprint,
//                                        @Body AuthorizationBody body);
// 
//     @DELETE("/applications/{client_id}/tokens/{token}")
//     Single<Void> revokeAuthorization(@Header("Authorization") String authorization,
//                                      @Path("client_id") String clientId,
//                                      @Path("token") String token);
// 
//     @GET("/repositories")
//     Single<List<Repo>> getPublicRepos(@Query("page") int page,
//                                       @Query("per_page") int perPage);
// 
//     @GET("/user/repos")
//     Single<List<Repo>> getUserRepos(@Header("Authorization") String authorization,
//                                     @Query("page") int page,
//                                     @Query("per_page") int perPage);
//     @GET("/repos/{user}/{repo}")
//     Single<Repo> getRepo(@Path("user") String user,
//                          @Path("repo") String repo);
// 
//     @GET("/user/starred/{user}/{repo}")
//     Single<Void> getStar(@Header("Authorization") String authorization,
//                          @Path("user") String user,
//                          @Path("repo") String repo);
// 
//     @GET("/user/starred")
//     Single<List<Repo>> getStarredRepos(@Header("Authorization") String authorization,
//                                        @Query("page") int page,
//                                        @Query("per_page") int perPage);
// 
//     @Headers({"Content-Length: 0"})
//     @PUT("/user/starred/{user}/{repo}")
//     Single<Void> putStar(@Header("Authorization") String authorization,
//                          @Path("user") String user,
//                          @Path("repo") String repo);
// 
//     @DELETE("/user/starred/{user}/{repo}")
//     Single<Void> deleteStar(@Header("Authorization") String authorization,
//                             @Path("user") String user,
//                             @Path("repo") String repo);
// 
//     @GET("/users/{user}")
//     Single<User> getUser(@Path("user") String user);
// 
//     @GET("/repos/{user}/{repo}/stargazers")
//     Single<List<User>> getStargazers(@Path("user") String user,
//                                      @Path("repo") String repo,
//                                      @Query("page") int page,
//                                      @Query("per_page") int perPage);
// 
//     @GET("/repos/{user}/{repo}/contents/{path}")
//     Single<Content> getFileContent(@Path("user") String user,
//                                    @Path("repo") String repo,
//                                    @Path("path") String path);
// 
//     @GET("/repos/{user}/{repo}/contents/{path}")
//     Single<List<Content>> getDirContent(@Path("user") String user,
//                                         @Path("repo") String repo,
//                                         @Path("path") String path);
// 
//     @GET("/repos/{user}/{repo}/issues")
//     Single<List<Issue>> getIssues(@Path("user") String user,
//                                   @Path("repo") String repo,
//                                   @Query("state") String state);
// 
//     @GET("/repos/{user}/{repo}/pulls")
//     Single<List<PullRequest>> getPullRequests(@Path("user") String user,
//                                               @Path("repo") String repo);
// }


import javax.inject.Inject;
import javax.inject.Singleton;
import io.github.kobakei.anago.dao.AuthTokenDao;
import io.github.kobakei.anago.net.GitHubApiClient;
import rx.Completable;
import rx.Single;
import timber.log.Timber;
package io.github.kobakei.anago.repository;



/**
 * スターのリポジトリ
 * Created by keisuke on 2016/09/18.
 */
@Singleton
public class StarRepository extends Repository<String, Boolean> {

    private final GitHubApiClient gitHubApiClient;
    private final AuthTokenDao authTokenDao;

    @Inject
    public StarRepository(GitHubApiClient gitHubApiClient, AuthTokenDao authTokenDao) {
        super();
        this.gitHubApiClient = gitHubApiClient;
        this.authTokenDao = authTokenDao;
    }

    public Single<Boolean> get(String user, String repo) {
        String key = user + "/" + repo;
        if (getCache().containsKey(key)) {
            return Single.just(getCache().get(key));
        }
// Path: app/src/main/java/io/github/kobakei/anago/dao/AuthTokenDao.java
// @Singleton
// public class AuthTokenDao {
// 
//     private final OrmaDatabase ormaDatabase;
// 
//     @Inject
//     public AuthTokenDao(OrmaDatabase ormaDatabase) {
//         this.ormaDatabase = ormaDatabase;
//     }
// 
//     public Single<Long> upsert(AuthToken authToken) {
//         return ormaDatabase.relationOfAuthToken()
//                 .upserter()
//                 .executeAsObservable(authToken);
//     }
// 
//     public Single<AuthToken> get() {
//         return ormaDatabase.relationOfAuthToken()
//                 .selector()
//                 .limit(1)
//                 .executeAsObservable()
//                 .toSingle();
//     }
// 
//     public Single<Integer> removeAll() {
//         return ormaDatabase.relationOfAuthToken()
//                 .deleter()
//                 .executeAsObservable();
//     }
// }
// 
// Path: app/src/main/java/io/github/kobakei/anago/net/GitHubApiClient.java
// public interface GitHubApiClient {
// 
//     @PUT("/authorizations/clients/{client_id}/{fingerprint}")
//     Single<AuthToken> putAuthorization(@Header("Authorization") String authorization,
//                                        @Path("client_id") String clientId,
//                                        @Path("fingerprint") String fingerprint,
//                                        @Body AuthorizationBody body);
// 
//     @DELETE("/applications/{client_id}/tokens/{token}")
//     Single<Void> revokeAuthorization(@Header("Authorization") String authorization,
//                                      @Path("client_id") String clientId,
//                                      @Path("token") String token);
// 
//     @GET("/repositories")
//     Single<List<Repo>> getPublicRepos(@Query("page") int page,
//                                       @Query("per_page") int perPage);
// 
//     @GET("/user/repos")
//     Single<List<Repo>> getUserRepos(@Header("Authorization") String authorization,
//                                     @Query("page") int page,
//                                     @Query("per_page") int perPage);
//     @GET("/repos/{user}/{repo}")
//     Single<Repo> getRepo(@Path("user") String user,
//                          @Path("repo") String repo);
// 
//     @GET("/user/starred/{user}/{repo}")
//     Single<Void> getStar(@Header("Authorization") String authorization,
//                          @Path("user") String user,
//                          @Path("repo") String repo);
// 
//     @GET("/user/starred")
//     Single<List<Repo>> getStarredRepos(@Header("Authorization") String authorization,
//                                        @Query("page") int page,
//                                        @Query("per_page") int perPage);
// 
//     @Headers({"Content-Length: 0"})
//     @PUT("/user/starred/{user}/{repo}")
//     Single<Void> putStar(@Header("Authorization") String authorization,
//                          @Path("user") String user,
//                          @Path("repo") String repo);
// 
//     @DELETE("/user/starred/{user}/{repo}")
//     Single<Void> deleteStar(@Header("Authorization") String authorization,
//                             @Path("user") String user,
//                             @Path("repo") String repo);
// 
//     @GET("/users/{user}")
//     Single<User> getUser(@Path("user") String user);
// 
//     @GET("/repos/{user}/{repo}/stargazers")
//     Single<List<User>> getStargazers(@Path("user") String user,
//                                      @Path("repo") String repo,
//                                      @Query("page") int page,
//                                      @Query("per_page") int perPage);
// 
//     @GET("/repos/{user}/{repo}/contents/{path}")
//     Single<Content> getFileContent(@Path("user") String user,
//                                    @Path("repo") String repo,
//                                    @Path("path") String path);
// 
//     @GET("/repos/{user}/{repo}/contents/{path}")
//     Single<List<Content>> getDirContent(@Path("user") String user,
//                                         @Path("repo") String repo,
//                                         @Path("path") String path);
// 
//     @GET("/repos/{user}/{repo}/issues")
//     Single<List<Issue>> getIssues(@Path("user") String user,
//                                   @Path("repo") String repo,
//                                   @Query("state") String state);
// 
//     @GET("/repos/{user}/{repo}/pulls")
//     Single<List<PullRequest>> getPullRequests(@Path("user") String user,
//                                               @Path("repo") String repo);
// }


// Path: app/src/main/java/io/github/kobakei/anago/repository/StarRepository.java
import javax.inject.Inject;
import javax.inject.Singleton;
import io.github.kobakei.anago.dao.AuthTokenDao;
import io.github.kobakei.anago.net.GitHubApiClient;
import rx.Completable;
import rx.Single;
import timber.log.Timber;

package io.github.kobakei.anago.repository;



/**
 * スターのリポジトリ
 * Created by keisuke on 2016/09/18.
 */
@Singleton
public class StarRepository extends Repository<String, Boolean> {

    private final GitHubApiClient gitHubApiClient;
    private final AuthTokenDao authTokenDao;

    @Inject
    public StarRepository(GitHubApiClient gitHubApiClient, AuthTokenDao authTokenDao) {
        super();
        this.gitHubApiClient = gitHubApiClient;
        this.authTokenDao = authTokenDao;
    }

    public Single<Boolean> get(String user, String repo) {
        String key = user + "/" + repo;
        if (getCache().containsKey(key)) {
            return Single.just(getCache().get(key));
        }
        return authTokenDao.get()