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

View file

@ -17,4 +17,5 @@ interface BaseLocalRepository {
fun <T : RealmObject> save(objects: List<T>) fun <T : RealmObject> save(objects: List<T>)
fun <T : RealmObject> save(`object`: 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 saveTasks(userId: String, tasksOrder: TasksOrder, tasks: TaskList)
fun saveTask(task: Task)
fun deleteTask(taskID: String) fun deleteTask(taskID: String)
fun getTask(taskId: String): Flowable<Task> 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>) { override fun <T : RealmObject> save(objects: List<T>) {
realm.executeTransactionAsync { realm1 -> realm1.insertOrUpdate(objects) } 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 return taskList
} }
override fun saveTask(task: Task) {
realm.executeTransaction { realm1 -> realm1.insertOrUpdate(task) }
}
private fun removeOldTasks(userID: String, onlineTaskList: List<Task>) { private fun removeOldTasks(userID: String, onlineTaskList: List<Task>) {
val localTasks = realm.where(Task::class.java) val localTasks = realm.where(Task::class.java)
.equalTo("userId", userID) .equalTo("userId", userID)