Skip to content

Instantly share code, notes, and snippets.

@dmitriy-chernysh
Created May 18, 2020 19:46
Show Gist options
  • Save dmitriy-chernysh/f6234913fb5a6491a4a8f3ff0efb4b35 to your computer and use it in GitHub Desktop.
Save dmitriy-chernysh/f6234913fb5a6491a4a8f3ff0efb4b35 to your computer and use it in GitHub Desktop.
Template | Use Case | Domain Layer
package com.mobiledevpro.interactor.usecase.base
import com.mobiledevpro.interactor.usecase.base.executor.ExecutionThread
import com.mobiledevpro.interactor.usecase.base.executor.PostExecutionThread
import io.reactivex.Scheduler
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable
abstract class BaseRxUseCase(
executionThread: ExecutionThread,
postExecutionThread: PostExecutionThread
) {
protected val executionThreadScheduler: Scheduler = executionThread.scheduler
protected val postExecutionThreadScheduler: Scheduler = postExecutionThread.scheduler
private val disposables = CompositeDisposable()
open fun dispose() {
if (!disposables.isDisposed) {
disposables.dispose()
}
}
protected fun addToDisposable(disposable: Disposable) {
disposables.add(disposable)
}
}
interface ExecutionThread {
val scheduler: Scheduler
}
abstract class ObservableUseCase<Results, in Params>(
executionThread: ExecutionThread,
postExecutionThread: PostExecutionThread
) : BaseRxUseCase(executionThread, postExecutionThread) {
/**
* Builds Observable
*/
abstract fun buildUseCaseObservable(params: Params? = null): Observable<Results>
/**
* Executes the current use case.
*/
fun execute(observer: DisposableObserver<Results>, params: Params? = null) {
val observable = this.buildUseCaseObservable(params)
.subscribeOn(executionThreadScheduler)
.observeOn(postExecutionThreadScheduler)
addToDisposable(observable.subscribeWith(observer))
}
/**
* Executes the current use case.
*/
fun execute(params: Params? = null): Observable<Results> =
this.buildUseCaseObservable(params)
.subscribeOn(executionThreadScheduler)
.observeOn(postExecutionThreadScheduler)
}
interface PostExecutionThread {
val scheduler: Scheduler
}
@dmitriy-chernysh
Copy link
Author

dmitriy-chernysh commented May 18, 2020

It's a real Use Case from my app, based on templates above

class GetVehicleUseCase(
    threadExecutor: ExecutionThread,
    postExecutionThread: PostExecutionThread,
    private val vehicleRepository: VehicleDetailsNewRepository,
    private val dealerRepository: DealerRepository
) : ObservableUseCase<InventoryItem, String>(threadExecutor, postExecutionThread) {

    override fun buildUseCaseObservable(params: String?): Observable<InventoryItem> =
        vehicleRepository.updateSelectedStockNumber(params ?: "")
            .flatMap {
                dealerRepository.getCurrentDealerId()
            }
            .flatMapObservable {
                vehicleRepository.getCachedVehicleData(it, params ?: "")
            }

}

How to execute Use case:

getVehicleUseCase.execute(stockNumber)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment