make viewmodel & usecases unit testable.

Prepare for PR screen
This commit is contained in:
k0shk0sh 2019-08-11 14:46:45 +02:00
parent 2531a3ace2
commit 909ed113ed
60 changed files with 686 additions and 261 deletions

View File

@ -22,8 +22,8 @@ import javax.inject.Singleton
FastHubDatabaseModule::class,
NetworkModule::class,
RepositoryModule::class,
ActivityBindingModule::class,
RepositoryModule::class ]
ActivityBindingModule::class
]
)
interface AppComponent : AndroidInjector<DaggerApplication> {
@ -32,7 +32,6 @@ interface AppComponent : AndroidInjector<DaggerApplication> {
@BindsInstance fun application(application: Application): Builder
@BindsInstance fun fastHubDatabaseModule(module: FastHubDatabaseModule): Builder
@BindsInstance fun networkModule(module: NetworkModule): Builder
@BindsInstance fun repoModule(module: RepositoryModule): Builder
@BindsInstance fun repositoryModule(module: RepositoryModule): Builder
fun build(): AppComponent
@ -48,7 +47,6 @@ interface AppComponent : AndroidInjector<DaggerApplication> {
.application(app)
.fastHubDatabaseModule(FastHubDatabaseModule())
.networkModule(NetworkModule())
.repoModule(RepositoryModule())
.repositoryModule(RepositoryModule())
.build()
}

View File

@ -26,14 +26,18 @@ import javax.inject.Singleton
@Module
class FastHubDatabaseModule {
@Singleton @Provides fun provideDatabase(@ForApplication context: Context): FastHubDatabase = Room.databaseBuilder(context,
FastHubDatabase::class.java, DATABASE_NAME)
@Singleton @Provides fun provideDatabase(@ForApplication context: Context): FastHubDatabase = Room.databaseBuilder(
context,
FastHubDatabase::class.java, DATABASE_NAME
)
.allowMainThreadQueries() // allow querying on MainThread (this useful in some cases)
.fallbackToDestructiveMigration() // this mean that it will delete all tables and recreate them after version is changed
.build()
@Singleton @Provides fun provideLoginDatabase(@ForApplication context: Context): FastHubLoginDatabase = Room.databaseBuilder(context,
FastHubLoginDatabase::class.java, LOGIN_DATABASE_NAME)
@Singleton @Provides fun provideLoginDatabase(@ForApplication context: Context): FastHubLoginDatabase = Room.databaseBuilder(
context,
FastHubLoginDatabase::class.java, LOGIN_DATABASE_NAME
)
.allowMainThreadQueries() // allow querying on MainThread
.build()

View File

@ -4,6 +4,7 @@ import com.apollographql.apollo.ApolloClient
import com.fastaccess.data.persistence.db.FastHubDatabase
import com.fastaccess.data.persistence.db.FastHubLoginDatabase
import com.fastaccess.data.repository.*
import com.fastaccess.domain.repository.LoginRemoteRepository
import com.fastaccess.domain.repository.services.LoginService
import com.fastaccess.domain.repository.services.UserService
import com.google.gson.Gson
@ -16,10 +17,17 @@ import javax.inject.Singleton
*/
@Module
class RepositoryModule {
@Singleton @Provides fun provideLoginRepository(
@Singleton @Provides fun provideLocalLoginRepository(
fastHubLoginDatabase: FastHubLoginDatabase,
loginService: LoginService
): LoginRepositoryProvider {
): LoginLocalRepository {
return LoginRepositoryProvider(fastHubLoginDatabase.provideLoginDao(), loginService)
}
@Singleton @Provides fun provideRemoteLoginRepository(
fastHubLoginDatabase: FastHubLoginDatabase,
loginService: LoginService
): LoginRemoteRepository {
return LoginRepositoryProvider(fastHubLoginDatabase.provideLoginDao(), loginService)
}
@ -27,73 +35,76 @@ class RepositoryModule {
fastHubDatabase: FastHubDatabase,
apolloClient: ApolloClient,
userService: UserService
): UserRepositoryProvider {
): UserRepository {
return UserRepositoryProvider(fastHubDatabase.getUserDao(), apolloClient, userService)
}
@Singleton @Provides fun provideMainIssuesPullsRepository(fastHubDatabase: FastHubDatabase): MyIssuesPullsRepositoryProvider {
@Singleton @Provides fun provideMainIssuesPullsRepository(fastHubDatabase: FastHubDatabase): MyIssuesPullsRepository {
return MyIssuesPullsRepositoryProvider(fastHubDatabase.getMainIssuesPullsDao())
}
@Singleton @Provides fun provideNotificationRepositoryProvider(
fastHubDatabase: FastHubDatabase,
schedulerProvider: SchedulerProvider
): NotificationRepositoryProvider {
): NotificationRepository {
return NotificationRepositoryProvider(fastHubDatabase.getNotifications(), schedulerProvider)
}
@Singleton @Provides fun provideFeedsRepositoryProvider(
fastHubDatabase: FastHubDatabase,
userService: UserService,
loginRepositoryProvider: LoginRepositoryProvider,
loginRepositoryProvider: LoginLocalRepository,
gson: Gson
): FeedsRepositoryProvider {
): FeedsRepository {
return FeedsRepositoryProvider(fastHubDatabase.getFeedsDao(), userService, loginRepositoryProvider, gson)
}
@Singleton @Provides fun provideUserReposRepositoryProvider(
fastHubDatabase: FastHubDatabase,
apolloClient: ApolloClient
): UserReposRepositoryProvider {
): UserReposRepository {
return UserReposRepositoryProvider(fastHubDatabase.getUserRepoDao(), apolloClient)
}
@Singleton @Provides fun provideUserStarredReposRepositoryProvider(
fastHubDatabase: FastHubDatabase,
apolloClient: ApolloClient
): UserStarredReposRepositoryProvider {
): UserStarredReposRepository {
return UserStarredReposRepositoryProvider(fastHubDatabase.getUserStarredRepoDao(), apolloClient)
}
@Singleton @Provides fun provideUserGistsRepositoryProvider(
fastHubDatabase: FastHubDatabase,
apolloClient: ApolloClient
): UserGistsRepositoryProvider {
): UserGistsRepository {
return UserGistsRepositoryProvider(fastHubDatabase.getGistsDao(), apolloClient)
}
@Singleton @Provides fun provideUserFollowersFollowingRepositoryProvider(
fastHubDatabase: FastHubDatabase,
apolloClient: ApolloClient
): UserFollowersFollowingRepositoryProvider {
): FollowersFollowingRepository {
return UserFollowersFollowingRepositoryProvider(fastHubDatabase.getFollowingFollowerDao(), apolloClient)
}
@Singleton @Provides fun provideOrgRepositoryProvider(
fastHubDatabase: FastHubDatabase,
apolloClient: ApolloClient,
loginRepositoryProvider: LoginRepositoryProvider
): OrgRepositoryProvider {
loginRepositoryProvider: LoginLocalRepository
): OrgRepository {
return OrgRepositoryProvider(fastHubDatabase.getOrganizationDao(), apolloClient, loginRepositoryProvider)
}
@Singleton @Provides fun provideIssueRepository(fastHubDatabase: FastHubDatabase): IssueRepositoryProvider {
@Singleton @Provides fun provideIssueRepository(fastHubDatabase: FastHubDatabase): IssueRepository {
return IssueRepositoryProvider(fastHubDatabase.getIssueDao())
}
@Singleton @Provides fun provideSuggestionRepositoryProvider(fastHubDatabase: FastHubDatabase): SuggestionRepositoryProvider {
@Singleton @Provides fun provideSuggestionRepositoryProvider(fastHubDatabase: FastHubDatabase): SuggestionRepository {
return SuggestionRepositoryProvider(fastHubDatabase.getSuggestionDao())
}
@Singleton @Provides fun provideAndroidSchedulerProvider(): SchedulerProvider = AndroidSchedulerProvider()
@Singleton @Provides fun providePullRequestRepo(fastHubDatabase: FastHubDatabase): PullRequestRepository =
PullRequestRepositoryProvider(fastHubDatabase.getPullRequestDao())
}

View File

@ -2,7 +2,7 @@ package com.fastaccess.github.platform.works
import android.app.Application
import androidx.work.*
import com.fastaccess.data.repository.NotificationRepositoryProvider
import com.fastaccess.data.repository.NotificationRepository
import com.fastaccess.domain.repository.services.NotificationService
import com.fastaccess.github.utils.EXTRA
import com.fastaccess.github.utils.EXTRA_TWO
@ -16,7 +16,7 @@ class MarkAsReadNotificationWorker @Inject constructor(
context: Application,
private val workerParams: WorkerParameters,
private val notificationService: NotificationService,
private val provider: NotificationRepositoryProvider
private val provider: NotificationRepository
) : RxWorker(context, workerParams) {
override fun createWork(): Single<Result> {
val id = workerParams.inputData.getString(EXTRA)

View File

@ -4,7 +4,7 @@ import android.net.Uri
import androidx.lifecycle.MutableLiveData
import com.fastaccess.data.persistence.db.FastHubDatabase
import com.fastaccess.data.persistence.models.LoginModel
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.github.base.BaseViewModel
import com.fastaccess.github.di.modules.AuthenticationInterceptor
import com.fastaccess.github.usecase.auth.GetAccessTokenUseCase
@ -20,7 +20,7 @@ class LoginChooserViewModel @Inject constructor(
private val accessTokenUseCase: GetAccessTokenUseCase,
private val loginWithAccessTokenUseCase: LoginWithAccessTokenUseCase,
private val interceptor: AuthenticationInterceptor,
private val loginRepositoryProvider: LoginRepositoryProvider,
private val loginRepositoryProvider: LoginLocalRepository,
private val fastHubDatabase: FastHubDatabase
) : BaseViewModel() {

View File

@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData
import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import com.fastaccess.data.persistence.models.FeedModel
import com.fastaccess.data.repository.FeedsRepositoryProvider
import com.fastaccess.data.repository.FeedsRepository
import com.fastaccess.github.base.BaseViewModel
import com.fastaccess.github.usecase.feed.FeedsUseCase
import javax.inject.Inject
@ -13,7 +13,7 @@ import javax.inject.Inject
* Created by Kosh on 20.10.18.
*/
class FeedsViewModel @Inject constructor(
private val provider: FeedsRepositoryProvider,
private val provider: FeedsRepository,
private val usecase: FeedsUseCase
) : BaseViewModel() {

View File

@ -4,8 +4,8 @@ import androidx.lifecycle.MutableLiveData
import com.apollographql.apollo.api.Input
import com.fastaccess.data.model.PageInfoModel
import com.fastaccess.data.model.TimelineModel
import com.fastaccess.data.repository.IssueRepositoryProvider
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.IssueRepository
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.github.base.BaseViewModel
import com.fastaccess.github.extensions.filterNull
import com.fastaccess.github.extensions.map
@ -20,10 +20,10 @@ import javax.inject.Inject
class IssueTimelineViewModel @Inject constructor(
private val issueUseCase: GetIssueUseCase,
private val timelineUseCase: GetIssueTimelineUseCase,
private val issueRepositoryProvider: IssueRepositoryProvider,
private val issueRepositoryProvider: IssueRepository,
private val closeOpenIssuePrUseCase: CloseOpenIssuePrUseCase,
private val lockUnlockIssuePrUseCase: LockUnlockIssuePrUseCase,
private val loginRepositoryProvider: LoginRepositoryProvider,
private val loginRepositoryProvider: LoginLocalRepository,
private val createIssueCommentUseCase: CreateIssueCommentUseCase,
private val editIssuePrUseCase: EditIssuePrUseCase
) : BaseViewModel() {

View File

@ -26,11 +26,11 @@ class MainFragmentViewModel @Inject constructor(
private val pullRequestsMainScreenUseCase: PullRequestsMainScreenUseCase,
private val notificationUseCase: NotificationUseCase,
private val feedsMainScreenUseCase: FeedsMainScreenUseCase,
private val feedsRepositoryProvider: FeedsRepositoryProvider,
private val myIssuesPullsRepo: MyIssuesPullsRepositoryProvider,
private val notificationRepositoryProvider: NotificationRepositoryProvider,
private val feedsRepositoryProvider: FeedsRepository,
private val myIssuesPullsRepo: MyIssuesPullsRepository,
private val notificationRepositoryProvider: NotificationRepository,
private val fasthubDatabase: FastHubDatabase,
private val loginProvider: LoginRepositoryProvider,
private val loginProvider: LoginLocalRepository,
private val schedulerProvider: SchedulerProvider
) : BaseViewModel() {

View File

@ -2,7 +2,7 @@ package com.fastaccess.github.ui.modules.notifications.fragment.read
import androidx.lifecycle.LiveData
import com.fastaccess.data.model.GroupedNotificationsModel
import com.fastaccess.data.repository.NotificationRepositoryProvider
import com.fastaccess.data.repository.NotificationRepository
import com.fastaccess.github.base.BaseViewModel
import com.fastaccess.github.usecase.notification.NotificationUseCase
import javax.inject.Inject
@ -11,7 +11,7 @@ import javax.inject.Inject
* Created by Kosh on 04.11.18.
*/
class AllNotificationsViewModel @Inject constructor(
provider: NotificationRepositoryProvider,
provider: NotificationRepository,
private val usecase: NotificationUseCase
) : BaseViewModel() {

View File

@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData
import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import com.fastaccess.data.persistence.models.NotificationModel
import com.fastaccess.data.repository.NotificationRepositoryProvider
import com.fastaccess.data.repository.NotificationRepository
import com.fastaccess.github.base.BaseViewModel
import com.fastaccess.github.usecase.notification.NotificationUseCase
import javax.inject.Inject
@ -13,7 +13,7 @@ import javax.inject.Inject
* Created by Kosh on 31.10.18.
*/
class UnreadNotificationsViewModel @Inject constructor(
private val provider: NotificationRepositoryProvider,
private val provider: NotificationRepository,
private val usecase: NotificationUseCase
) : BaseViewModel() {

View File

@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData
import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import com.fastaccess.data.persistence.models.FeedModel
import com.fastaccess.data.repository.FeedsRepositoryProvider
import com.fastaccess.data.repository.FeedsRepository
import com.fastaccess.github.base.BaseViewModel
import com.fastaccess.github.usecase.user.UserFeedsUseCase
import javax.inject.Inject
@ -13,7 +13,7 @@ import javax.inject.Inject
* Created by Kosh on 20.10.18.
*/
class ProfileFeedsViewModel @Inject constructor(
private val provider: FeedsRepositoryProvider,
private val provider: FeedsRepository,
private val usecase: UserFeedsUseCase
) : BaseViewModel() {

View File

@ -5,7 +5,7 @@ import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import com.fastaccess.data.model.PageInfoModel
import com.fastaccess.data.persistence.models.FollowingFollowerModel
import com.fastaccess.data.repository.UserFollowersFollowingRepositoryProvider
import com.fastaccess.data.repository.FollowersFollowingRepository
import com.fastaccess.github.base.BaseViewModel
import javax.inject.Inject
@ -13,7 +13,7 @@ import javax.inject.Inject
* Created by Kosh on 15.10.18.
*/
class FollowersFollowingViewModel @Inject constructor(
private val provider: UserFollowersFollowingRepositoryProvider
private val provider: FollowersFollowingRepository
) : BaseViewModel() {
private var pageInfo: PageInfoModel? = null

View File

@ -10,8 +10,7 @@ import androidx.lifecycle.ViewModelProviders
import com.fastaccess.data.model.FragmentType
import com.fastaccess.data.model.ViewPagerModel
import com.fastaccess.data.persistence.models.UserModel
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.isMe
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.github.R
import com.fastaccess.github.base.BaseFragment
import com.fastaccess.github.base.BasePagerFragment
@ -43,7 +42,7 @@ import javax.inject.Inject
*/
class ProfileFragment : BasePagerFragment() {
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject lateinit var loginRepositoryProvider: LoginRepositoryProvider
@Inject lateinit var loginRepositoryProvider: LoginLocalRepository
private val viewModel by lazy { ViewModelProviders.of(this, viewModelFactory).get(ProfileViewModel::class.java) }
private val behaviour by lazy { AnchorSheetBehavior.from(bottomSheet) }

View File

@ -5,7 +5,7 @@ import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import com.fastaccess.data.model.PageInfoModel
import com.fastaccess.data.persistence.models.ProfileGistModel
import com.fastaccess.data.repository.UserGistsRepositoryProvider
import com.fastaccess.data.repository.UserGistsRepository
import com.fastaccess.github.base.BaseViewModel
import javax.inject.Inject
@ -13,7 +13,7 @@ import javax.inject.Inject
* Created by Kosh on 14.10.18.
*/
class ProfileGistsViewModel @Inject constructor(
private val reposProvider: UserGistsRepositoryProvider
private val reposProvider: UserGistsRepository
) : BaseViewModel() {
private var pageInfo: PageInfoModel? = null
@ -21,24 +21,28 @@ class ProfileGistsViewModel @Inject constructor(
fun getGists(login: String): LiveData<PagedList<ProfileGistModel>> {
val dataSourceFactory = reposProvider.getGists(login)
val config = PagedList.Config.Builder()
.setPrefetchDistance(com.fastaccess.github.utils.PRE_FETCH_SIZE)
.setPageSize(com.fastaccess.github.utils.PAGE_SIZE)
.build()
.setPrefetchDistance(com.fastaccess.github.utils.PRE_FETCH_SIZE)
.setPageSize(com.fastaccess.github.utils.PAGE_SIZE)
.build()
return LivePagedListBuilder(dataSourceFactory, config)
.build()
.build()
}
fun loadGists(login: String, reload: Boolean = false) {
fun loadGists(
login: String,
reload: Boolean = false
) {
if (reload) {
pageInfo = null
}
val pageInfo = pageInfo
if (!reload && (pageInfo != null && !pageInfo.hasNextPage)) return
add(callApi(reposProvider.getGistsFromRemote(login, if (hasNext()) pageInfo?.endCursor else null))
.subscribe({
this.pageInfo = it.pageInfo
postCounter(it.totalCount)
}, { it.printStackTrace() }))
.subscribe({
this.pageInfo = it.pageInfo
postCounter(it.totalCount)
}, { it.printStackTrace() })
)
}
fun hasNext() = pageInfo?.hasNextPage == true

View File

@ -5,7 +5,7 @@ import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import com.fastaccess.data.model.PageInfoModel
import com.fastaccess.data.persistence.models.OrganizationModel
import com.fastaccess.data.repository.OrgRepositoryProvider
import com.fastaccess.data.repository.OrgRepository
import com.fastaccess.github.base.BaseViewModel
import javax.inject.Inject
@ -13,7 +13,7 @@ import javax.inject.Inject
* Created by Kosh on 2018-11-26.
*/
class UserOrgsViewModel @Inject constructor(
private val provider: OrgRepositoryProvider
private val provider: OrgRepository
) : BaseViewModel() {
private var pageInfo: PageInfoModel? = null

View File

@ -5,7 +5,7 @@ import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import com.fastaccess.data.model.PageInfoModel
import com.fastaccess.data.persistence.models.ProfileRepoModel
import com.fastaccess.data.repository.UserReposRepositoryProvider
import com.fastaccess.data.repository.UserReposRepository
import com.fastaccess.github.base.BaseViewModel
import javax.inject.Inject
@ -13,7 +13,7 @@ import javax.inject.Inject
* Created by Kosh on 08.10.18.
*/
class ProfileReposViewModel @Inject constructor(
private val reposProvider: UserReposRepositoryProvider
private val reposProvider: UserReposRepository
) : BaseViewModel() {
private var pageInfo: PageInfoModel? = null
@ -21,24 +21,31 @@ class ProfileReposViewModel @Inject constructor(
fun repos(login: String): LiveData<PagedList<ProfileRepoModel>> {
val dataSourceFactory = reposProvider.getRepos(login)
val config = PagedList.Config.Builder()
.setPrefetchDistance(com.fastaccess.github.utils.PRE_FETCH_SIZE)
.setPageSize(com.fastaccess.github.utils.PAGE_SIZE)
.build()
.setPrefetchDistance(com.fastaccess.github.utils.PRE_FETCH_SIZE)
.setPageSize(com.fastaccess.github.utils.PAGE_SIZE)
.build()
return LivePagedListBuilder(dataSourceFactory, config)
.build()
.build()
}
fun loadRepos(login: String, reload: Boolean = false) {
fun loadRepos(
login: String,
reload: Boolean = false
) {
if (reload) {
pageInfo = null
}
val pageInfo = pageInfo
if (!reload && (pageInfo != null && !pageInfo.hasNextPage)) return
add(callApi(reposProvider.getReposFromRemote(login, if (hasNext()) pageInfo?.endCursor else null))
add(
callApi(reposProvider.getReposFromRemote(login, if (hasNext()) pageInfo?.endCursor else null))
.subscribe({
this.pageInfo = it.pageInfo
postCounter(it.totalCount)
}, { it.printStackTrace() }))
}, {
it.printStackTrace()
})
)
}
fun hasNext() = pageInfo?.hasNextPage == true

View File

@ -5,7 +5,7 @@ import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import com.fastaccess.data.model.PageInfoModel
import com.fastaccess.data.persistence.models.ProfileStarredRepoModel
import com.fastaccess.data.repository.UserStarredReposRepositoryProvider
import com.fastaccess.data.repository.UserStarredReposRepository
import com.fastaccess.github.base.BaseViewModel
import javax.inject.Inject
@ -13,7 +13,7 @@ import javax.inject.Inject
* Created by Kosh on 13.10.18.
*/
class ProfileStarredReposViewModel @Inject constructor(
private val reposProvider: UserStarredReposRepositoryProvider
private val reposProvider: UserStarredReposRepository
) : BaseViewModel() {
private var pageInfo: PageInfoModel? = null
@ -21,24 +21,31 @@ class ProfileStarredReposViewModel @Inject constructor(
fun starredRepos(login: String): LiveData<PagedList<ProfileStarredRepoModel>> {
val dataSourceFactory = reposProvider.getStarredRepos(login)
val config = PagedList.Config.Builder()
.setPrefetchDistance(com.fastaccess.github.utils.PRE_FETCH_SIZE)
.setPageSize(com.fastaccess.github.utils.PAGE_SIZE)
.build()
.setPrefetchDistance(com.fastaccess.github.utils.PRE_FETCH_SIZE)
.setPageSize(com.fastaccess.github.utils.PAGE_SIZE)
.build()
return LivePagedListBuilder(dataSourceFactory, config)
.build()
.build()
}
fun loadStarredRepos(login: String, reload: Boolean = false) {
fun loadStarredRepos(
login: String,
reload: Boolean = false
) {
if (reload) {
pageInfo = null
}
val pageInfo = pageInfo
if (!reload && (pageInfo != null && !pageInfo.hasNextPage)) return
add(callApi(reposProvider.getStarredReposFromRemote(login, if (hasNext()) pageInfo?.endCursor else null))
add(
callApi(reposProvider.getStarredReposFromRemote(login, if (hasNext()) pageInfo?.endCursor else null))
.subscribe({
this.pageInfo = it.pageInfo
postCounter(it.totalCount)
}, { it.printStackTrace() }))
}, {
it.printStackTrace()
})
)
}
fun hasNext() = pageInfo?.hasNextPage == true

View File

@ -7,7 +7,7 @@ import com.fastaccess.data.model.ShortRepoModel
import com.fastaccess.data.model.ShortUserModel
import com.fastaccess.data.model.parcelable.FilterSearchModel
import com.fastaccess.data.persistence.models.MyIssuesPullsModel
import com.fastaccess.data.repository.SuggestionRepositoryProvider
import com.fastaccess.data.repository.SuggestionRepository
import com.fastaccess.github.base.BaseViewModel
import com.fastaccess.github.usecase.issuesprs.FilterIssuesUseCase
import com.fastaccess.github.usecase.issuesprs.FilterPullRequestsUseCase
@ -24,7 +24,7 @@ class FilterSearchViewModel @Inject constructor(
private val filterPullRequestsUseCase: FilterPullRequestsUseCase,
private val filterSearchReposUseCase: FilterSearchReposUseCase,
private val filterSearchUsersUseCase: FilterSearchUsersUseCase,
private val suggestionRepositoryProvider: SuggestionRepositoryProvider
private val suggestionRepositoryProvider: SuggestionRepository
) : BaseViewModel() {
private var pageInfo: PageInfoModel? = null

View File

@ -1,7 +1,7 @@
package com.fastaccess.github.usecase.auth
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.repository.LoginRemoteRepository
import com.fastaccess.domain.response.AccessTokenResponse
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import com.fastaccess.github.BuildConfig
@ -13,7 +13,7 @@ import javax.inject.Inject
* Created by Kosh on 12.05.18.
*/
class GetAccessTokenUseCase @Inject constructor(
private val loginRemoteRepository: LoginRepositoryProvider,
private val loginRemoteRepository: LoginRemoteRepository,
private val schedulerProvider: SchedulerProvider
) :
BaseObservableUseCase() {

View File

@ -1,7 +1,7 @@
package com.fastaccess.github.usecase.auth
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.repository.LoginRemoteRepository
import com.fastaccess.domain.response.AccessTokenResponse
import com.fastaccess.domain.response.AuthBodyModel
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
@ -15,7 +15,7 @@ import javax.inject.Inject
* Created by Kosh on 12.05.18.
*/
class LoginUseCase @Inject constructor(
private val loginRemoteRepository: LoginRepositoryProvider,
private val loginRemoteRepository: LoginRemoteRepository,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {
private var authBodyModel: AuthBodyModel? = null

View File

@ -1,8 +1,9 @@
package com.fastaccess.github.usecase.auth
import com.fastaccess.data.persistence.models.LoginModel
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.repository.LoginRemoteRepository
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import com.google.gson.Gson
import io.reactivex.Observable
@ -12,7 +13,8 @@ import javax.inject.Inject
* Created by Kosh on 12.05.18.
*/
class LoginWithAccessTokenUseCase @Inject constructor(
private val loginRemoteRepository: LoginRepositoryProvider,
private val loginRemoteRepository: LoginRemoteRepository,
private val loginLocalRepository: LoginLocalRepository,
private val gson: Gson,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {
@ -22,9 +24,9 @@ class LoginWithAccessTokenUseCase @Inject constructor(
.map { gson.fromJson(gson.toJson(it), LoginModel::class.java) }
fun insertUser(loginModel: LoginModel): Observable<LoginModel?> = Observable.fromCallable {
loginRemoteRepository.logoutAll()
loginRemoteRepository.insert(loginModel)
val login = loginRemoteRepository.getLoginBlocking()
loginLocalRepository.logoutAll()
loginLocalRepository.insert(loginModel)
val login = loginLocalRepository.getLoginBlocking()
return@fromCallable if (login?.id == loginModel.id) {
login
} else {

View File

@ -1,6 +1,6 @@
package com.fastaccess.github.usecase.feed
import com.fastaccess.data.repository.FeedsRepositoryProvider
import com.fastaccess.data.repository.FeedsRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.response.FeedResponse
import com.fastaccess.domain.response.PageableResponse
@ -12,7 +12,7 @@ import javax.inject.Inject
* Created by Kosh on 26.06.18.
*/
class FeedsUseCase @Inject constructor(
private val feedsRepositoryProvider: FeedsRepositoryProvider,
private val feedsRepositoryProvider: FeedsRepository,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {
var page: Int = 0

View File

@ -3,8 +3,8 @@ package com.fastaccess.github.usecase.issuesprs
import com.fastaccess.data.model.CloseOpenEventModel
import com.fastaccess.data.model.TimelineModel
import com.fastaccess.data.persistence.models.MyIssuesPullsModel
import com.fastaccess.data.repository.IssueRepositoryProvider
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.IssueRepository
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.repository.services.IssuePrService
import com.fastaccess.domain.response.IssueRequestModel
@ -18,9 +18,9 @@ import javax.inject.Inject
* Created by Kosh on 16.02.19.
*/
class CloseOpenIssuePrUseCase @Inject constructor(
private val issueRepositoryProvider: IssueRepositoryProvider,
private val issueRepositoryProvider: IssueRepository,
private val issuePrService: IssuePrService,
private val loginRepositoryProvider: LoginRepositoryProvider,
private val loginRepositoryProvider: LoginLocalRepository,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -1,6 +1,6 @@
package com.fastaccess.github.usecase.issuesprs
import com.fastaccess.data.repository.IssueRepositoryProvider
import com.fastaccess.data.repository.IssueRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.repository.services.IssuePrService
import com.fastaccess.domain.response.IssueRequestModel
@ -12,7 +12,7 @@ import javax.inject.Inject
* Created by Kosh on 16.02.19.
*/
class EditIssuePrUseCase @Inject constructor(
private val issueRepositoryProvider: IssueRepositoryProvider,
private val issueRepositoryProvider: IssueRepository,
private val issuePrService: IssuePrService,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -6,7 +6,7 @@ import com.apollographql.apollo.rx2.Rx2Apollo
import com.fastaccess.data.model.PageInfoModel
import com.fastaccess.data.model.parcelable.FilterIssuesPrsModel
import com.fastaccess.data.persistence.models.MyIssuesPullsModel
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import github.SearchIssuesQuery
@ -17,7 +17,7 @@ import javax.inject.Inject
* Created by Kosh on 20.01.19.
*/
class FilterIssuesUseCase @Inject constructor(
private val loginRepository: LoginRepositoryProvider,
private val loginRepository: LoginLocalRepository,
private val apolloClient: ApolloClient,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -6,6 +6,7 @@ import com.apollographql.apollo.rx2.Rx2Apollo
import com.fastaccess.data.model.PageInfoModel
import com.fastaccess.data.model.parcelable.FilterIssuesPrsModel
import com.fastaccess.data.persistence.models.MyIssuesPullsModel
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
@ -17,7 +18,7 @@ import javax.inject.Inject
* Created by Kosh on 20.01.19.
*/
class FilterPullRequestsUseCase @Inject constructor(
private val loginRepository: LoginRepositoryProvider,
private val loginRepository: LoginLocalRepository,
private val apolloClient: ApolloClient,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -5,7 +5,6 @@ import com.apollographql.apollo.api.Input
import com.apollographql.apollo.rx2.Rx2Apollo
import com.fastaccess.data.model.*
import com.fastaccess.data.model.parcelable.LabelModel
import com.fastaccess.data.repository.IssueRepositoryProvider
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import com.fastaccess.extension.*
@ -19,7 +18,6 @@ import javax.inject.Inject
* Created by Kosh on 27.01.19.
*/
class GetIssueTimelineUseCase @Inject constructor(
private val issueRepositoryProvider: IssueRepositoryProvider,
private val apolloClient: ApolloClient,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -6,7 +6,7 @@ import com.fastaccess.data.model.CountModel
import com.fastaccess.data.model.EmbeddedRepoModel
import com.fastaccess.data.model.ShortUserModel
import com.fastaccess.data.persistence.models.IssueModel
import com.fastaccess.data.repository.IssueRepositoryProvider
import com.fastaccess.data.repository.IssueRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import com.fastaccess.extension.toLabels
@ -21,7 +21,7 @@ import javax.inject.Inject
* Created by Kosh on 27.01.19.
*/
class GetIssueUseCase @Inject constructor(
private val issueRepositoryProvider: IssueRepositoryProvider,
private val issueRepositoryProvider: IssueRepository,
private val apolloClient: ApolloClient,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -0,0 +1,67 @@
package com.fastaccess.github.usecase.issuesprs
import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.rx2.Rx2Apollo
import com.fastaccess.data.model.CountModel
import com.fastaccess.data.model.EmbeddedRepoModel
import com.fastaccess.data.model.ShortUserModel
import com.fastaccess.data.persistence.models.PullRequestModel
import com.fastaccess.data.repository.PullRequestRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import com.fastaccess.extension.toLabels
import com.fastaccess.extension.toMilestone
import com.fastaccess.extension.toReactionGroup
import com.fastaccess.extension.toUser
import github.GetPullRequestQuery
import io.reactivex.Observable
import javax.inject.Inject
/**
* Created by Kosh on 27.01.19.
*/
class GetPullRequestUseCase @Inject constructor(
private val repoProvider: PullRequestRepository,
private val apolloClient: ApolloClient,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {
var login: String? = null
var repo: String? = null
var number: Int? = null
override fun buildObservable(): Observable<*> {
val login = login
val repo = repo
val number = number
if (login.isNullOrEmpty() || repo.isNullOrEmpty() || number == null) {
return Observable.error<Any>(Throwable("this should never happen ;)"))
}
return Rx2Apollo.from(apolloClient.query(GetPullRequestQuery(login, repo, number)))
.subscribeOn(schedulerProvider.ioThread())
.observeOn(schedulerProvider.uiThread())
.map { it.data()?.repositoryOwner?.repository?.pullRequest?.fragments?.fullPullRequest }
.map { issue ->
repoProvider.upsert(PullRequestModel(issue.id, issue.databaseId, issue.number, issue.activeLockReason?.rawValue(),
issue.body, issue.bodyHTML.toString(), issue.closedAt, issue.createdAt, issue.updatedAt, issue.state.rawValue(),
issue.title, issue.viewerSubscription?.rawValue(), ShortUserModel(
issue.author?.login, issue.author?.login,
issue.author?.url?.toString(), avatarUrl = issue.author?.avatarUrl?.toString()
),
EmbeddedRepoModel(issue.repository.nameWithOwner), ShortUserModel(
issue.mergedBy?.login, issue.mergedBy?.login,
issue.mergedBy?.url?.toString(), avatarUrl = issue.mergedBy?.avatarUrl?.toString()
),
CountModel(issue.userContentEdits?.totalCount),
issue.reactionGroups?.map { it.fragments.reactions.toReactionGroup() },
issue.viewerCannotUpdateReasons.map { it.rawValue() }, issue.isClosed, issue.isCreatedViaEmail, issue.isLocked,
issue.isViewerCanReact, issue.isViewerCanSubscribe, issue.isViewerCanUpdate, issue.isViewerDidAuthor,
issue.mergeable.rawValue(), issue.isMerged, issue.mergedAt,
issue.authorAssociation.rawValue(), issue.url.toString(), issue.labels?.nodes?.map { it.fragments.labels.toLabels() },
issue.milestone?.toMilestone(), issue.assignees.nodes?.map { it.fragments }?.map { it.shortUserRowItem.toUser() })
)
}
}
}

View File

@ -5,8 +5,8 @@ import com.apollographql.apollo.api.Input
import com.apollographql.apollo.rx2.Rx2Apollo
import com.fastaccess.data.model.LockUnlockEventModel
import com.fastaccess.data.model.TimelineModel
import com.fastaccess.data.repository.IssueRepositoryProvider
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.IssueRepository
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import com.fastaccess.extension.me
@ -21,9 +21,9 @@ import javax.inject.Inject
* Created by Kosh on 16.02.19.
*/
class LockUnlockIssuePrUseCase @Inject constructor(
private val issueRepositoryProvider: IssueRepositoryProvider,
private val issueRepositoryProvider: IssueRepository,
private val apolloClient: ApolloClient,
private val loginRepositoryProvider: LoginRepositoryProvider,
private val loginRepositoryProvider: LoginLocalRepository,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -3,8 +3,8 @@ package com.fastaccess.github.usecase.issuesprs
import com.fastaccess.data.model.MilestoneDemilestonedEventModel
import com.fastaccess.data.model.TimelineModel
import com.fastaccess.data.model.parcelable.MilestoneModel
import com.fastaccess.data.repository.IssueRepositoryProvider
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.IssueRepository
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.repository.services.IssuePrService
import com.fastaccess.domain.response.IssueRequestModel
@ -18,9 +18,9 @@ import javax.inject.Inject
* Created by Kosh on 16.02.19.
*/
class MilestoneIssuePrUseCase @Inject constructor(
private val issueRepositoryProvider: IssueRepositoryProvider,
private val issueRepositoryProvider: IssueRepository,
private val issuePrService: IssuePrService,
private val loginRepositoryProvider: LoginRepositoryProvider,
private val loginRepositoryProvider: LoginLocalRepository,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -1,6 +1,6 @@
package com.fastaccess.github.usecase.main
import com.fastaccess.data.repository.FeedsRepositoryProvider
import com.fastaccess.data.repository.FeedsRepository
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import io.reactivex.Observable
import javax.inject.Inject
@ -8,6 +8,6 @@ import javax.inject.Inject
/**
* Created by Kosh on 26.06.18.
*/
class FeedsMainScreenUseCase @Inject constructor(private val feedsRepositoryProvider: FeedsRepositoryProvider) : BaseObservableUseCase() {
class FeedsMainScreenUseCase @Inject constructor(private val feedsRepositoryProvider: FeedsRepository) : BaseObservableUseCase() {
override fun buildObservable(): Observable<*> = feedsRepositoryProvider.getMainFeeds()
}

View File

@ -3,8 +3,8 @@ package com.fastaccess.github.usecase.main
import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.rx2.Rx2Apollo
import com.fastaccess.data.persistence.models.MyIssuesPullsModel
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.MyIssuesPullsRepositoryProvider
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.data.repository.MyIssuesPullsRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import github.GetIssuesWithoutStateQuery
@ -16,8 +16,8 @@ import javax.inject.Inject
* Created by Kosh on 16.06.18.
*/
class IssuesMainScreenUseCase @Inject constructor(
private val loginRepository: LoginRepositoryProvider,
private val myIssues: MyIssuesPullsRepositoryProvider,
private val loginRepository: LoginLocalRepository,
private val myIssues: MyIssuesPullsRepository,
private val apolloClient: ApolloClient,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -3,8 +3,8 @@ package com.fastaccess.github.usecase.main
import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.rx2.Rx2Apollo
import com.fastaccess.data.persistence.models.MyIssuesPullsModel
import com.fastaccess.data.repository.LoginRepositoryProvider
import com.fastaccess.data.repository.MyIssuesPullsRepositoryProvider
import com.fastaccess.data.repository.LoginLocalRepository
import com.fastaccess.data.repository.MyIssuesPullsRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import github.GetPullRequestsQuery
@ -16,8 +16,8 @@ import javax.inject.Inject
* Created by Kosh on 16.06.18.
*/
class PullRequestsMainScreenUseCase @Inject constructor(
private val loginRepository: LoginRepositoryProvider,
private val myIssues: MyIssuesPullsRepositoryProvider,
private val loginRepository: LoginLocalRepository,
private val myIssues: MyIssuesPullsRepository,
private val apolloClient: ApolloClient,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {

View File

@ -1,7 +1,7 @@
package com.fastaccess.github.usecase.notification
import com.fastaccess.data.persistence.models.NotificationModel
import com.fastaccess.data.repository.NotificationRepositoryProvider
import com.fastaccess.data.repository.NotificationRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.repository.services.NotificationService
import com.fastaccess.domain.response.NotificationResponse
@ -17,7 +17,7 @@ import javax.inject.Inject
*/
class NotificationUseCase @Inject constructor(
private val notificationRepositoryProvider: NotificationRepositoryProvider,
private val notificationRepositoryProvider: NotificationRepository,
private val notificationService: NotificationService,
private val gson: Gson,
private val schedulerProvider: SchedulerProvider

View File

@ -1,7 +1,7 @@
package com.fastaccess.github.usecase.user
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.data.repository.UserRepositoryProvider
import com.fastaccess.data.repository.UserRepository
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import io.reactivex.Observable
import javax.inject.Inject
@ -10,7 +10,7 @@ import javax.inject.Inject
* Created by Kosh on 10.06.18.
*/
class BlockUnblockUserUseCase @Inject constructor(
private val userRepository: UserRepositoryProvider,
private val userRepository: UserRepository,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {
var login: String? = null

View File

@ -1,6 +1,6 @@
package com.fastaccess.github.usecase.user
import com.fastaccess.data.repository.UserRepositoryProvider
import com.fastaccess.data.repository.UserRepository
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import io.reactivex.Observable
import javax.inject.Inject
@ -8,7 +8,7 @@ import javax.inject.Inject
/**
* Created by Kosh on 10.06.18.
*/
class FollowUnfollowUserUseCase @Inject constructor(private val userRepository: UserRepositoryProvider) : BaseObservableUseCase() {
class FollowUnfollowUserUseCase @Inject constructor(private val userRepository: UserRepository) : BaseObservableUseCase() {
var login: String? = null
var follow: Boolean = false

View File

@ -1,7 +1,7 @@
package com.fastaccess.github.usecase.user
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.data.repository.UserRepositoryProvider
import com.fastaccess.data.repository.UserRepository
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import io.reactivex.Observable
import javax.inject.Inject
@ -10,7 +10,7 @@ import javax.inject.Inject
* Created by Kosh on 10.06.18.
*/
class IsUserBlockedUseCase @Inject constructor(
private val userRepository: UserRepositoryProvider,
private val userRepository: UserRepository,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {
var login: String? = null

View File

@ -1,6 +1,6 @@
package com.fastaccess.github.usecase.user
import com.fastaccess.data.repository.FeedsRepositoryProvider
import com.fastaccess.data.repository.FeedsRepository
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.domain.response.FeedResponse
import com.fastaccess.domain.response.PageableResponse
@ -12,7 +12,7 @@ import javax.inject.Inject
* Created by Kosh on 20.10.18.
*/
class UserFeedsUseCase @Inject constructor(
private val feedsRepositoryProvider: FeedsRepositoryProvider,
private val feedsRepositoryProvider: FeedsRepository,
private val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {
var page: Int = 0

View File

@ -2,7 +2,7 @@ package com.fastaccess.github.usecase.user
import com.fastaccess.data.persistence.models.UserModel
import com.fastaccess.data.repository.SchedulerProvider
import com.fastaccess.data.repository.UserRepositoryProvider
import com.fastaccess.data.repository.UserRepository
import com.fastaccess.domain.usecase.base.BaseObservableUseCase
import io.reactivex.Observable
import javax.inject.Inject
@ -11,7 +11,7 @@ import javax.inject.Inject
* Created by Kosh on 10.06.18.
*/
class UserUseCase @Inject constructor(
private val userRepository: UserRepositoryProvider,
private val userRepository: UserRepository,
val schedulerProvider: SchedulerProvider
) : BaseObservableUseCase() {
var login: String? = null

View File

@ -142,6 +142,66 @@ fragment FullIssue on Issue {
}
}
fragment FullPullRequest on PullRequest {
id
databaseId
number
title
bodyHTML
body
state
createdAt
updatedAt
closed
closedAt
locked
activeLockReason
viewerSubscription
viewerDidAuthor
viewerCannotUpdateReasons
viewerCanUpdate
viewerCanSubscribe
viewerCanReact
mergeable
merged
mergedAt
mergedBy {
avatarUrl
login
url
}
url
userContentEdits(first: 0) {
totalCount
}
author {
avatarUrl
login
url
}
reactionGroups {
...Reactions
}
createdViaEmail
repository {
nameWithOwner
}
authorAssociation
labels(first: 30) {
nodes {
...Labels
}
}
assignees(first: 30) {
nodes {
...ShortUserRowItem
}
}
milestone {
...MilestoneFragment
}
}
fragment Reactions on ReactionGroup {
content
createdAt

View File

@ -38,6 +38,16 @@ query getIssue($login: String!, $repo: String!, $number: Int!) {
}
}
query getPullRequest($login: String!, $repo: String!, $number: Int!) {
repositoryOwner(login: $login) {
repository(name: $repo) {
pullRequest(number: $number) {
... FullPullRequest
}
}
}
}
query getLastIssueComment($login: String!, $repo: String!, $number: Int!) {
repositoryOwner(login: $login) {
repository(name: $repo) {

View File

@ -0,0 +1,30 @@
package com.fastaccess.data.persistence.dao
import androidx.lifecycle.LiveData
import androidx.paging.DataSource
import androidx.room.Dao
import androidx.room.Query
import com.fastaccess.data.persistence.models.PullRequestModel
import io.reactivex.Maybe
/**
* Created by Kosh on 06.07.18.
*/
@Dao
abstract class PullRequestDao : BaseDao<PullRequestModel>() {
@Query("SELECT * FROM ${PullRequestModel.TABLE_NAME} WHERE `repo_nameWithOwner` = :repo AND `state` = :state")
abstract fun getPullRequests(repo: String, state: String): DataSource.Factory<Int, PullRequestModel>
@Query("SELECT * FROM ${PullRequestModel.TABLE_NAME} WHERE `id` = :id")
abstract fun getPullRequestById(id: String): LiveData<PullRequestModel>
@Query("SELECT * FROM ${PullRequestModel.TABLE_NAME} WHERE `repo_nameWithOwner` = :repo AND `number` = :number")
abstract fun getPullRequestByNumber(repo: String, number: Int): LiveData<PullRequestModel?>
@Query("SELECT * FROM ${PullRequestModel.TABLE_NAME} WHERE `repo_nameWithOwner` = :repo AND `number` = :number")
abstract fun getPullRequestByNumberSingle(repo: String, number: Int): Maybe<PullRequestModel>
@Query("DELETE FROM ${PullRequestModel.TABLE_NAME} WHERE `repo_nameWithOwner` = :repo") abstract fun deleteAll(repo: String)
@Query("DELETE FROM ${PullRequestModel.TABLE_NAME}") abstract fun deleteAll()
}

View File

@ -10,19 +10,24 @@ import com.fastaccess.data.persistence.models.*
* Created by Kosh on 11.05.18.
*/
const val VERSION = 28
const val VERSION = 29
const val DATABASE_NAME = "FastHub-Room-DB"
@Database(version = VERSION, entities = [UserModel::class, MyIssuesPullsModel::class,
NotificationModel::class, FeedModel::class, ProfileRepoModel::class,
ProfileStarredRepoModel::class, ProfileGistModel::class,
FollowingFollowerModel::class, OrganizationModel::class,
IssueModel::class, SuggestionsModel::class], exportSchema = false)
@TypeConverters(DateConverter::class, EventTypesConverter::class,
@Database(
version = VERSION, entities = [UserModel::class, MyIssuesPullsModel::class,
NotificationModel::class, FeedModel::class, ProfileRepoModel::class,
ProfileStarredRepoModel::class, ProfileGistModel::class,
FollowingFollowerModel::class, OrganizationModel::class,
IssueModel::class, SuggestionsModel::class,
PullRequestModel::class], exportSchema = false
)
@TypeConverters(
DateConverter::class, EventTypesConverter::class,
FeedPayloadConverter::class, FeedRepoConverter::class,
UserCountConverter::class, UserOrganizationConverter::class,
UserPinnedReposModelConverter::class, ReactionGroupConverter::class,
StringArrayConverter::class, LabelsConverter::class, ShortUserModelsConverter::class)
StringArrayConverter::class, LabelsConverter::class, ShortUserModelsConverter::class
)
abstract class FastHubDatabase : RoomDatabase() {
abstract fun getMainIssuesPullsDao(): MyIssuesPullsDao
abstract fun getNotifications(): NotificationsDao
@ -35,5 +40,6 @@ abstract class FastHubDatabase : RoomDatabase() {
abstract fun getOrganizationDao(): OrgsDao
abstract fun getIssueDao(): IssueDao
abstract fun getSuggestionDao(): SuggestionDao
abstract fun getPullRequestDao(): PullRequestDao
fun clearAll() = clearAllTables()
}

View File

@ -3,7 +3,10 @@ package com.fastaccess.data.persistence.models
import androidx.room.Embedded
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.fastaccess.data.model.*
import com.fastaccess.data.model.CountModel
import com.fastaccess.data.model.EmbeddedRepoModel
import com.fastaccess.data.model.ReactionGroupModel
import com.fastaccess.data.model.ShortUserModel
import com.fastaccess.data.model.parcelable.LabelModel
import com.fastaccess.data.model.parcelable.MilestoneModel
import com.google.gson.annotations.SerializedName
@ -13,13 +16,6 @@ import java.util.*
/**
* Created by Kosh on 27.01.19.
*/
data class GetIssueModel(
@SerializedName("totalCount") var totalCount: Int,
@SerializedName("pageInfo") var pageInfoModel: PageInfoModel,
@SerializedName("issue") var issue: IssueModel? = null,
@SerializedName("issues") var issues: List<IssueModel>? = null
)
@Entity(tableName = IssueModel.TABLE_NAME)
data class IssueModel(
@PrimaryKey @SerializedName("id") var id: String,

View File

@ -0,0 +1,58 @@
package com.fastaccess.data.persistence.models
import androidx.room.Embedded
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.fastaccess.data.model.CountModel
import com.fastaccess.data.model.EmbeddedRepoModel
import com.fastaccess.data.model.ReactionGroupModel
import com.fastaccess.data.model.ShortUserModel
import com.fastaccess.data.model.parcelable.LabelModel
import com.fastaccess.data.model.parcelable.MilestoneModel
import com.google.gson.annotations.SerializedName
import java.util.*
/**
* Created by Kosh on 27.01.19.
*/
@Entity(tableName = PullRequestModel.TABLE_NAME)
data class PullRequestModel(
@PrimaryKey @SerializedName("id") var id: String,
@SerializedName("databaseId") var databaseId: Int? = null,
@SerializedName("number") var number: Int? = null,
@SerializedName("activeLockReason") var activeLockReason: String? = null,
@SerializedName("body") var body: String? = null,
@SerializedName("bodyHTML") var bodyHTML: String? = null,
@SerializedName("closedAt") var closedAt: Date? = null,
@SerializedName("createdAt") var createdAt: Date? = null,
@SerializedName("updatedAt") var updatedAt: Date? = null,
@SerializedName("state") var state: String? = null,
@SerializedName("title") var title: String? = null,
@SerializedName("viewerSubscription") var viewerSubscription: String? = null,
@SerializedName("author") @Embedded(prefix = "author_") var author: ShortUserModel? = null,
@SerializedName("repository") @Embedded(prefix = "repo_") var repo: EmbeddedRepoModel? = null,
@SerializedName("mergedBy") @Embedded(prefix = "mergedby_") var mergedBy: ShortUserModel? = null,
@SerializedName("userContentEdits") @Embedded(prefix = "user_content_edits_") var userContentEdits: CountModel? = CountModel(),
@SerializedName("reactionGroups") var reactionGroups: List<ReactionGroupModel>? = null,
@SerializedName("viewerCannotUpdateReasons") var viewerCannotUpdateReasons: List<String>? = null,
@SerializedName("closed") var closed: Boolean? = false,
@SerializedName("createdViaEmail") var createdViaEmail: Boolean? = false,
@SerializedName("locked") var locked: Boolean? = false,
@SerializedName("viewerCanReact") var viewerCanReact: Boolean? = false,
@SerializedName("viewerCanSubscribe") var viewerCanSubscribe: Boolean? = false,
@SerializedName("viewerCanUpdate") var viewerCanUpdate: Boolean? = false,
@SerializedName("viewerDidAuthor") var viewerDidAuthor: Boolean? = false,
@SerializedName("mergeable") var mergeable: String? = null,
@SerializedName("merged") var merged: Boolean? = false,
@SerializedName("mergedAt") var mergedAt: Date? = null,
@SerializedName("authorAssociation") var authorAssociation: String? = null,
@SerializedName("url") var url: String? = null,
@SerializedName("labels") var labels: List<LabelModel>? = null,
@SerializedName("milestone") @Embedded(prefix = "milestone_") var milestone: MilestoneModel? = null,
@SerializedName("assignees") var assignees: List<ShortUserModel>? = null
) {
companion object {
const val TABLE_NAME = "pullrequest_table"
}
}

View File

@ -3,11 +3,12 @@ package com.fastaccess.data.repository
import io.reactivex.Scheduler
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import javax.inject.Inject
/**
* Created by Kosh on 2019-05-09.
*/
class AndroidSchedulerProvider : SchedulerProvider {
class AndroidSchedulerProvider @Inject constructor() : SchedulerProvider {
override fun uiThread(): Scheduler = AndroidSchedulers.mainThread()
override fun ioThread(): Scheduler = Schedulers.io()
override fun computationThread(): Scheduler = Schedulers.computation()

View File

@ -11,15 +11,16 @@ import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import io.reactivex.Observable
import javax.inject.Inject
import javax.inject.Singleton
/**
* Created by Kosh on 26.06.18.
*/
class FeedsRepositoryProvider @Inject constructor(
private val feedsDao: FeedDao,
private val userService: UserService,
private val loginRepositoryProvider: LoginRepositoryProvider,
private val gson: Gson
private val feedsDao: FeedDao,
private val userService: UserService,
private val loginRepositoryProvider: LoginLocalRepository,
private val gson: Gson
) : FeedsRepository {
override fun getFeeds(login: String): DataSource.Factory<Int, FeedModel> = feedsDao.getFeeds(login)
@ -27,44 +28,51 @@ class FeedsRepositoryProvider @Inject constructor(
override fun deleteAll() = feedsDao.deleteAll()
override fun getMainFeeds(): Observable<*> = loginRepositoryProvider.getLogin()
.filter { !it.login.isNullOrEmpty() }
.toObservable()
.flatMap { userService.getMainScreenReceivedEvents(it.login ?: "") }
.map { response ->
val list = gson.fromJson<List<FeedModel>>(gson.toJson(response.items), object : TypeToken<List<FeedModel>>() {}.type)
feedsDao.deleteAll()
list?.let { feedsDao.insert(it) }
}
.filter { !it.login.isNullOrEmpty() }
.toObservable()
.flatMap { userService.getMainScreenReceivedEvents(it.login ?: "") }
.map { response ->
val list = gson.fromJson<List<FeedModel>>(gson.toJson(response.items), object : TypeToken<List<FeedModel>>() {}.type)
feedsDao.deleteAll()
list?.let { feedsDao.insert(it) }
}
override fun getFeeds(login: String, page: Int): Observable<PageableResponse<FeedResponse>> = userService.getUserEvents(login, page)
.map { response ->
val list = gson.fromJson<List<FeedModel>>(gson.toJson(response.items), object : TypeToken<List<FeedModel>>() {}.type)
if (page <= 1) feedsDao.deleteAll(login)
val newList = list.asSequence().map { feeds ->
feeds.login = login
feeds
}.toList()
feedsDao.insert(newList)
return@map response
}
override fun getFeeds(
login: String,
page: Int
): Observable<PageableResponse<FeedResponse>> = userService.getUserEvents(login, page)
.map { response ->
val list = gson.fromJson<List<FeedModel>>(gson.toJson(response.items), object : TypeToken<List<FeedModel>>() {}.type)
if (page <= 1) feedsDao.deleteAll(login)
val newList = list.asSequence().map { feeds ->
feeds.login = login
feeds
}.toList()
feedsDao.insert(newList)
return@map response
}
override fun getReceivedEvents(page: Int): Observable<PageableResponse<FeedResponse>> = loginRepositoryProvider.getLogin()
.filter { !it.login.isNullOrEmpty() }
.toObservable()
.flatMap { userService.getReceivedEvents(it.login ?: "", page) }
.map { response ->
val list = gson.fromJson<List<FeedModel>>(gson.toJson(response.items), object : TypeToken<List<FeedModel>>() {}.type)
if (page <= 1) feedsDao.deleteAll()
list?.let { feedsDao.insert(it) }
return@map response
}
.filter { !it.login.isNullOrEmpty() }
.toObservable()
.flatMap { userService.getReceivedEvents(it.login ?: "", page) }
.map { response ->
val list = gson.fromJson<List<FeedModel>>(gson.toJson(response.items), object : TypeToken<List<FeedModel>>() {}.type)
if (page <= 1) feedsDao.deleteAll()
list?.let { feedsDao.insert(it) }
return@map response
}
override fun getReceivedEventAsLiveData(): DataSource.Factory<Int, FeedModel> = feedsDao.getReceivedEventAsLiveData()
}
interface FeedsRepository {
fun getMainFeeds(): Observable<*>
fun getFeeds(login: String, page: Int): Observable<PageableResponse<FeedResponse>>
fun getFeeds(
login: String,
page: Int
): Observable<PageableResponse<FeedResponse>>
fun getFeeds(login: String): DataSource.Factory<Int, FeedModel>
fun getMainFeedsAsLiveData(): LiveData<List<FeedModel>>
fun getReceivedEvents(page: Int): Observable<PageableResponse<FeedResponse>>

View File

@ -14,10 +14,22 @@ class IssueRepositoryProvider @Inject constructor(
private val dao: IssueDao
) : IssueRepository {
override fun upsert(issueModel: IssueModel) = dao.upsert(issueModel)
override fun getIssues(repo: String, state: String): DataSource.Factory<Int, IssueModel> = dao.getIssues(repo, state)
override fun getIssues(
repo: String,
state: String
): DataSource.Factory<Int, IssueModel> = dao.getIssues(repo, state)
override fun getIssueById(id: String): LiveData<IssueModel> = dao.getIssueById(id)
override fun getIssueByNumber(repo: String, number: Int): LiveData<IssueModel?> = dao.getIssueByNumber(repo, number)
override fun getIssueByNumberMaybe(repo: String, number: Int): Maybe<IssueModel> = dao.getIssueByNumberSingle(repo, number)
override fun getIssueByNumber(
repo: String,
number: Int
): LiveData<IssueModel?> = dao.getIssueByNumber(repo, number)
override fun getIssueByNumberMaybe(
repo: String,
number: Int
): Maybe<IssueModel> = dao.getIssueByNumberSingle(repo, number)
override fun deleteAll(repo: String) = dao.deleteAll(repo)
override fun deleteAll() = dao.deleteAll()
@ -25,10 +37,22 @@ class IssueRepositoryProvider @Inject constructor(
interface IssueRepository {
fun upsert(issueModel: IssueModel)
fun getIssues(repo: String, state: String): DataSource.Factory<Int, IssueModel>
fun getIssues(
repo: String,
state: String
): DataSource.Factory<Int, IssueModel>
fun getIssueById(id: String): LiveData<IssueModel>
fun getIssueByNumber(repo: String, number: Int): LiveData<IssueModel?>
fun getIssueByNumberMaybe(repo: String, number: Int): Maybe<IssueModel>
fun getIssueByNumber(
repo: String,
number: Int
): LiveData<IssueModel?>
fun getIssueByNumberMaybe(
repo: String,
number: Int
): Maybe<IssueModel>
fun deleteAll(repo: String)
fun deleteAll()
}

View File

@ -17,8 +17,10 @@ import javax.inject.Inject
/**
* Created by Kosh on 11.05.18.
*/
class LoginRepositoryProvider @Inject constructor(private val loginDao: LoginDao,
private val loginService: LoginService) : LoginLocalRepository, LoginRemoteRepository {
class LoginRepositoryProvider @Inject constructor(
private val loginDao: LoginDao,
private val loginService: LoginService
) : LoginLocalRepository, LoginRemoteRepository {
override fun getLogin(): Maybe<LoginModel?> = loginDao.getLogin()
override fun getLoginBlocking(): LoginModel? = loginDao.getLoginBlocking()
override fun getAllLiveData(): LiveData<LoginModel?> = loginDao.getAllLiveData()
@ -30,10 +32,24 @@ class LoginRepositoryProvider @Inject constructor(private val loginDao: LoginDao
override fun logoutAll() = loginDao.logoutAll()
override fun loginAccessToken(): Observable<UserResponse> = loginService.loginAccessToken()
override fun login(authModel: AuthBodyModel): Observable<AccessTokenResponse> = loginService.login(authModel)
override fun getAccessToken(code: String, clientId: String, clientSecret: String, state: String,
redirectUrl: String) = loginService.getAccessToken(
override fun getAccessToken(
code: String,
clientId: String,
clientSecret: String,
state: String,
redirectUrl: String
) = loginService.getAccessToken(
"https://github.com/login/oauth/access_token", code, clientId, clientSecret, state, redirectUrl
)
override fun isMe(
login: String,
action: (isMe: Boolean) -> Unit
): Disposable {
return getLogin().subscribe({ action.invoke(login == it?.login) }, { action.invoke(false) })
}
}
interface LoginLocalRepository {
@ -46,8 +62,8 @@ interface LoginLocalRepository {
fun update(login: LoginModel): Completable
fun deleteLogin(login: LoginModel)
fun logoutAll()
}
fun LoginRepositoryProvider.isMe(login: String, action: (isMe: Boolean) -> Unit): Disposable {
return getLogin().subscribe({ action.invoke(login == it?.login) }, { action.invoke(false) })
fun isMe(
login: String,
action: (isMe: Boolean) -> Unit
): Disposable
}

View File

@ -8,7 +8,9 @@ import javax.inject.Inject
/**
* Created by Kosh on 17.06.18.
*/
class MyIssuesPullsRepositoryProvider @Inject constructor(private val dao: MyIssuesPullsDao) : MyIssuesPullsRepository {
class MyIssuesPullsRepositoryProvider @Inject constructor(
private val dao: MyIssuesPullsDao
) : MyIssuesPullsRepository {
override fun getMainScreenIssues(): LiveData<List<MyIssuesPullsModel>> = dao.getMainScreenIssues()
override fun getMainScreenPulls(): LiveData<List<MyIssuesPullsModel>> = dao.getMainScreenPulls()
override fun insert(model: MyIssuesPullsModel): Long = dao.insert(model)

View File

@ -19,7 +19,7 @@ import javax.inject.Inject
class OrgRepositoryProvider @Inject constructor(
private val dao: OrgsDao,
private val apolloClient: ApolloClient,
private val loginRepositoryProvider: LoginRepositoryProvider
private val loginRepositoryProvider: LoginLocalRepository
) : OrgRepository {
/**
@ -35,7 +35,7 @@ class OrgRepositoryProvider @Inject constructor(
return@map data
}
override fun getOrgs(): DataSource.Factory<Int, OrganizationModel> = dao.getOrgs()
override fun getOrgs(): DataSource.Factory<Int, OrganizationModel> = dao.getOrgs()
override fun getOrgBlocking(login: String): OrganizationModel? = dao.getOrgBlocking(login)
override fun getOrg(login: String): LiveData<OrganizationModel> = dao.getOrg(login)
override fun deleteAll() = dao.deleteAll()

View File

@ -0,0 +1,60 @@
package com.fastaccess.data.repository
import androidx.lifecycle.LiveData
import androidx.paging.DataSource
import com.fastaccess.data.persistence.dao.PullRequestDao
import com.fastaccess.data.persistence.models.PullRequestModel
import io.reactivex.Maybe
import javax.inject.Inject
import javax.inject.Singleton
/**
* Created by Kosh on 27.01.19.
*/
class PullRequestRepositoryProvider @Inject constructor(
private val dao: PullRequestDao
) : PullRequestRepository {
override fun upsert(pr: PullRequestModel) = dao.update(pr)
override fun getPullRequests(
repo: String,
state: String
): DataSource.Factory<Int, PullRequestModel> = dao.getPullRequests(repo, state)
override fun getPullRequestById(id: String): LiveData<PullRequestModel> = dao.getPullRequestById(id)
override fun getPullRequestByNumber(
repo: String,
number: Int
): LiveData<PullRequestModel?> = dao.getPullRequestByNumber(repo, number)
override fun getPullRequestByNumberMaybe(
repo: String,
number: Int
): Maybe<PullRequestModel> = dao.getPullRequestByNumberSingle(repo, number)
override fun deleteAll(repo: String) = dao.deleteAll(repo)
override fun deleteAll() = dao.deleteAll()
}
interface PullRequestRepository {
fun upsert(pr: PullRequestModel)
fun getPullRequests(
repo: String,
state: String
): DataSource.Factory<Int, PullRequestModel>
fun getPullRequestById(id: String): LiveData<PullRequestModel>
fun getPullRequestByNumber(
repo: String,
number: Int
): LiveData<PullRequestModel?>
fun getPullRequestByNumberMaybe(
repo: String,
number: Int
): Maybe<PullRequestModel>
fun deleteAll(repo: String)
fun deleteAll()
}

View File

@ -6,6 +6,7 @@ import com.fastaccess.data.persistence.dao.SuggestionDao
import com.fastaccess.data.persistence.models.SuggestionsModel
import io.reactivex.Completable
import javax.inject.Inject
import javax.inject.Singleton
/**
* Created by Kosh on 10.06.18.
@ -22,7 +23,7 @@ class SuggestionRepositoryProvider @Inject constructor(
interface SuggestionRepository {
fun getAll(): DataSource.Factory<Int, SuggestionsModel>
fun getSuggestions(keyword: String): LiveData<List<SuggestionsModel>>
fun getSuggestions(keyword: String): LiveData<List<SuggestionsModel>>
fun upsert(query: String): Completable
fun deleteAll(): Completable
}

View File

@ -17,33 +17,42 @@ import javax.inject.Inject
* Created by Kosh on 11.10.18.
*/
class UserFollowersFollowingRepositoryProvider @Inject constructor(
private val dao: UserFollowersFollowingsDao,
private val apolloClient: ApolloClient
private val dao: UserFollowersFollowingsDao,
private val apolloClient: ApolloClient
) : FollowersFollowingRepository {
override fun getFollowersFromRemote(login: String, page: String?): Observable<FollowingsFollowersModel> {
override fun getFollowersFromRemote(
login: String,
page: String?
): Observable<FollowingsFollowersModel> {
return Rx2Apollo.from(apolloClient.query(GetProfileFollowersQuery(login, Input.optional(page))))
.filter { !it.hasErrors() }
.map {
val data = FollowingsFollowersModel.newFollowersInstance(it.data(), login)
if (page.isNullOrBlank()) dao.deleteAll(login, true)
data?.users?.let { repos -> dao.insert(repos) }
return@map data
}
.filter { !it.hasErrors() }
.map {
val data = FollowingsFollowersModel.newFollowersInstance(it.data(), login)
if (page.isNullOrBlank()) dao.deleteAll(login, true)
data?.users?.let { repos -> dao.insert(repos) }
return@map data
}
}
override fun getFollowingFromRemote(login: String, page: String?): Observable<FollowingsFollowersModel> {
override fun getFollowingFromRemote(
login: String,
page: String?
): Observable<FollowingsFollowersModel> {
return Rx2Apollo.from(apolloClient.query(GetProfileFollowingQuery(login, Input.optional(page))))
.filter { !it.hasErrors() }
.map {
val data = FollowingsFollowersModel.newFollowingInstance(it.data(), login)
if (page.isNullOrBlank()) dao.deleteAll(login, false)
data?.users?.let { repos -> dao.insert(repos) }
return@map data
}
.filter { !it.hasErrors() }
.map {
val data = FollowingsFollowersModel.newFollowingInstance(it.data(), login)
if (page.isNullOrBlank()) dao.deleteAll(login, false)
data?.users?.let { repos -> dao.insert(repos) }
return@map data
}
}
override fun getFollowersOrFollowing(login: String, isFollowers: Boolean): DataSource.Factory<Int, FollowingFollowerModel> {
override fun getFollowersOrFollowing(
login: String,
isFollowers: Boolean
): DataSource.Factory<Int, FollowingFollowerModel> {
return when (isFollowers) {
true -> dao.getFollowers(login)
else -> dao.getFollowing(login)
@ -52,16 +61,34 @@ class UserFollowersFollowingRepositoryProvider @Inject constructor(
override fun getUser(login: String): LiveData<FollowingFollowerModel> = dao.getUser(login)
override fun deleteAll() = dao.deleteAll()
override fun deleteAll(login: String, isFollowers: Boolean) = dao.deleteAll(login, isFollowers)
override fun deleteAll(
login: String,
isFollowers: Boolean
) = dao.deleteAll(login, isFollowers)
}
interface FollowersFollowingRepository {
fun getFollowersFromRemote(login: String, page: String?): Observable<FollowingsFollowersModel>
fun getFollowingFromRemote(login: String, page: String?): Observable<FollowingsFollowersModel>
fun getFollowersOrFollowing(login: String, isFollowers: Boolean): DataSource.Factory<Int, FollowingFollowerModel>
fun getFollowersFromRemote(
login: String,
page: String?
): Observable<FollowingsFollowersModel>
fun getFollowingFromRemote(
login: String,
page: String?
): Observable<FollowingsFollowersModel>
fun getFollowersOrFollowing(
login: String,
isFollowers: Boolean
): DataSource.Factory<Int, FollowingFollowerModel>
fun getUser(login: String): LiveData<FollowingFollowerModel>
fun deleteAll()
fun deleteAll(login: String, isFollowers: Boolean)
fun deleteAll(
login: String,
isFollowers: Boolean
)
}

View File

@ -6,29 +6,33 @@ import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.api.Input
import com.apollographql.apollo.rx2.Rx2Apollo
import com.fastaccess.data.persistence.dao.UserGistsDao
import com.fastaccess.data.persistence.models.ProfileGistModel
import com.fastaccess.data.persistence.models.GistsModel
import com.fastaccess.data.persistence.models.ProfileGistModel
import github.GetProfileGistsQuery
import io.reactivex.Observable
import javax.inject.Inject
import javax.inject.Singleton
/**
* Created by Kosh on 11.10.18.
*/
class UserGistsRepositoryProvider @Inject constructor(
private val dao: UserGistsDao,
private val apolloClient: ApolloClient
private val dao: UserGistsDao,
private val apolloClient: ApolloClient
) : UserGistsRepository {
override fun getGistsFromRemote(login: String, page: String?): Observable<GistsModel> {
override fun getGistsFromRemote(
login: String,
page: String?
): Observable<GistsModel> {
return Rx2Apollo.from(apolloClient.query(GetProfileGistsQuery(login, Input.optional(page))))
.filter { !it.hasErrors() }
.map {
val data = GistsModel.newInstance(it.data(), login)
if (page.isNullOrBlank()) dao.deleteAll(login)
data?.gists?.let { repos -> dao.insert(repos) }
return@map data
}
.filter { !it.hasErrors() }
.map {
val data = GistsModel.newInstance(it.data(), login)
if (page.isNullOrBlank()) dao.deleteAll(login)
data?.gists?.let { repos -> dao.insert(repos) }
return@map data
}
}
@ -40,7 +44,11 @@ class UserGistsRepositoryProvider @Inject constructor(
}
interface UserGistsRepository {
fun getGistsFromRemote(login: String, page: String?): Observable<GistsModel>
fun getGistsFromRemote(
login: String,
page: String?
): Observable<GistsModel>
fun getGists(login: String): DataSource.Factory<Int, ProfileGistModel>
fun getGist(id: String): LiveData<ProfileGistModel>
fun deleteAll()

View File

@ -11,24 +11,28 @@ import com.fastaccess.data.persistence.models.ProfileReposModel
import github.GetProfileReposQuery
import io.reactivex.Observable
import javax.inject.Inject
import javax.inject.Singleton
/**
* Created by Kosh on 11.10.18.
*/
class UserReposRepositoryProvider @Inject constructor(
private val reposDao: UserReposDao,
private val apolloClient: ApolloClient
private val reposDao: UserReposDao,
private val apolloClient: ApolloClient
) : UserReposRepository {
override fun getReposFromRemote(login: String, page: String?): Observable<ProfileReposModel> {
override fun getReposFromRemote(
login: String,
page: String?
): Observable<ProfileReposModel> {
return Rx2Apollo.from(apolloClient.query(GetProfileReposQuery(login, Input.optional(page))))
.filter { !it.hasErrors() }
.map {
val data = ProfileReposModel.newInstance(it.data(), login)
if (page.isNullOrBlank()) reposDao.deleteAll(login)
data?.repos?.let { repos -> reposDao.insert(repos) }
return@map data
}
.filter { !it.hasErrors() }
.map {
val data = ProfileReposModel.newInstance(it.data(), login)
if (page.isNullOrBlank()) reposDao.deleteAll(login)
data?.repos?.let { repos -> reposDao.insert(repos) }
return@map data
}
}
@ -40,7 +44,11 @@ class UserReposRepositoryProvider @Inject constructor(
}
interface UserReposRepository {
fun getReposFromRemote(login: String, page: String?): Observable<ProfileReposModel>
fun getReposFromRemote(
login: String,
page: String?
): Observable<ProfileReposModel>
fun getRepos(login: String): DataSource.Factory<Int, ProfileRepoModel>
fun getRepo(id: String): LiveData<ProfileRepoModel>
fun deleteAll()

View File

@ -12,6 +12,7 @@ import github.GetProfileQuery
import io.reactivex.Observable
import retrofit2.Response
import javax.inject.Inject
import javax.inject.Singleton
/**
* Created by Kosh on 10.06.18.

View File

@ -11,24 +11,28 @@ import com.fastaccess.data.persistence.models.ProfileStarredReposModel
import github.GetProfileStarredReposQuery
import io.reactivex.Observable
import javax.inject.Inject
import javax.inject.Singleton
/**
* Created by Kosh on 11.10.18.
*/
class UserStarredReposRepositoryProvider @Inject constructor(
private val reposDao: UserStarredReposDao,
private val apolloClient: ApolloClient
private val reposDao: UserStarredReposDao,
private val apolloClient: ApolloClient
) : UserStarredReposRepository {
override fun getStarredReposFromRemote(login: String, page: String?): Observable<ProfileStarredReposModel> {
override fun getStarredReposFromRemote(
login: String,
page: String?
): Observable<ProfileStarredReposModel> {
return Rx2Apollo.from(apolloClient.query(GetProfileStarredReposQuery(login, Input.optional(page))))
.filter { !it.hasErrors() }
.map {
val data = ProfileStarredReposModel.newInstance(it.data(), login)
if (page.isNullOrBlank()) reposDao.deleteAll(login)
data?.repos?.let { repos -> reposDao.insert(repos) }
return@map data
}
.filter { !it.hasErrors() }
.map {
val data = ProfileStarredReposModel.newInstance(it.data(), login)
if (page.isNullOrBlank()) reposDao.deleteAll(login)
data?.repos?.let { repos -> reposDao.insert(repos) }
return@map data
}
}
override fun getStarredRepos(login: String): DataSource.Factory<Int, ProfileStarredRepoModel> = reposDao.getStarredRepos(login)
@ -39,7 +43,11 @@ class UserStarredReposRepositoryProvider @Inject constructor(
}
interface UserStarredReposRepository {
fun getStarredReposFromRemote(login: String, page: String?): Observable<ProfileStarredReposModel>
fun getStarredReposFromRemote(
login: String,
page: String?
): Observable<ProfileStarredReposModel>
fun getStarredRepos(login: String): DataSource.Factory<Int, ProfileStarredRepoModel>
fun getStarredRepo(id: String): LiveData<ProfileStarredRepoModel>
fun deleteAll()

View File

@ -36,4 +36,7 @@ fun Labels?.toLabels(): LabelModel = LabelModel(this?.name, this?.color, this?.u
fun FullIssue.Milestone.toMilestone(): MilestoneModel = this.fragments.milestoneFragment.let {
MilestoneModel(it.id, it.title, it.description, it.state.rawValue(), it.url.toString(), it.number, it.isClosed, it.dueOn)
}
fun FullPullRequest.Milestone.toMilestone(): MilestoneModel = this.fragments.milestoneFragment.let {
MilestoneModel(it.id, it.title, it.description, it.state.rawValue(), it.url.toString(), it.number, it.isClosed, it.dueOn)
}