Improve offline task creation/editing. Fixes #1009

This commit is contained in:
Phillip Thelen 2018-08-28 14:17:43 +02:00
parent 43db91293b
commit affbe2d90e
6 changed files with 26 additions and 28 deletions

View file

@ -28,8 +28,8 @@ interface TaskRepository : BaseRepository {
fun getTask(taskId: String): Flowable<Task>
fun getTaskCopy(taskId: String): Flowable<Task>
fun createTask(task: Task): Flowable<Task>
fun updateTask(task: Task): Maybe<Task>?
fun createTask(task: Task, force: Boolean = false): Flowable<Task>
fun updateTask(task: Task, force: Boolean = false): Maybe<Task>?
fun deleteTask(taskId: String): Flowable<Void>
fun saveTask(task: Task)

View file

@ -134,9 +134,9 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
override fun getTaskCopy(taskId: String): Flowable<Task> = localRepository.getTaskCopy(taskId)
override fun createTask(task: Task): Flowable<Task> {
override fun createTask(task: Task, force: Boolean): Flowable<Task> {
val now = Date().time
if (lastTaskAction > now - 500) {
if (lastTaskAction > now - 500 && !force) {
return Flowable.empty()
}
lastTaskAction = now
@ -171,44 +171,43 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
if (task.id == null) {
task.id = UUID.randomUUID().toString()
}
localRepository.saveTask(task)
localRepository.saveSyncronous(task)
return apiClient.createTask(task)
.map { task1 ->
task1.dateCreated = Date()
task1
}
.doOnNext { localRepository.saveTask(it) }
.doOnNext { localRepository.save(it) }
.doOnError {
task.hasErrored = true
task.isSaving = false
localRepository.save(task)
localRepository.saveSyncronous(task)
}
}
@Suppress("ReturnCount")
override fun updateTask(task: Task): Maybe<Task> {
override fun updateTask(task: Task, force: Boolean): Maybe<Task> {
val now = Date().time
if (lastTaskAction > now - 500 || !task.isValid) {
if ((lastTaskAction > now - 500 && !force)|| !task.isValid ) {
return Maybe.just(task)
}
lastTaskAction = now
val id = task.id ?: return Maybe.just(task)
task.isSaving = true
task.hasErrored = false
localRepository.saveTask(task)
return localRepository.getTaskCopy(id).firstElement()
.flatMap { task1 -> apiClient.updateTask(id, task1).singleElement() }
val unmanagedTask = localRepository.getUnmanagedCopy(task)
unmanagedTask.isSaving = true
unmanagedTask.hasErrored = false
localRepository.saveSyncronous(unmanagedTask)
return apiClient.updateTask(id, unmanagedTask).singleElement()
.map { task1 ->
task1.position = task.position
task1
}
.doOnSuccess { localRepository.saveTask(it) }
.doOnSuccess { localRepository.save(it) }
.doOnError {
task.hasErrored = true
task.isSaving = false
localRepository.save(task)
unmanagedTask.hasErrored = true
unmanagedTask.isSaving = false
localRepository.saveSyncronous(unmanagedTask)
}
}
@ -218,7 +217,7 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
}
override fun saveTask(task: Task) {
localRepository.saveTask(task)
localRepository.save(task)
}
override fun createTasks(newTasks: List<Task>): Flowable<List<Task>> = apiClient.createTasks(newTasks)
@ -273,9 +272,9 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
.map { localRepository.getUnmanagedCopy(it) }
.flatMap {
return@flatMap if (it.isCreating) {
createTask(it)
createTask(it, true)
} else {
updateTask(it).toFlowable()
updateTask(it, true).toFlowable()
}
}.toList()
}

View file

@ -17,4 +17,5 @@ interface BaseLocalRepository {
fun <T : RealmObject> save(objects: List<T>)
fun <T : RealmObject> save(`object`: T)
fun <T : RealmObject> saveSyncronous(`object`: T)
}

View file

@ -15,8 +15,6 @@ interface TaskLocalRepository : BaseLocalRepository {
fun saveTasks(userId: String, tasksOrder: TasksOrder, tasks: TaskList)
fun saveTask(task: Task)
fun deleteTask(taskID: String)
fun getTask(taskId: String): Flowable<Task>

View file

@ -43,4 +43,8 @@ abstract class RealmBaseLocalRepository internal constructor(protected var realm
override fun <T : RealmObject> save(objects: List<T>) {
realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(objects) }
}
override fun <T : RealmObject> saveSyncronous(`object`: T) {
realm.executeTransaction { realm1 -> realm1.insertOrUpdate(`object`) }
}
}

View file

@ -68,10 +68,6 @@ class RealmTaskLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm),
return taskList
}
override fun saveTask(task: Task) {
realm.executeTransaction { realm1 -> realm1.insertOrUpdate(task) }
}
private fun removeOldTasks(userID: String, onlineTaskList: List<Task>) {
val localTasks = realm.where(Task::class.java)
.equalTo("userId", userID)