in shared/src/main/java/com/example/android/trackr/db/dao/TaskDao.kt [107:166]
suspend fun setIsArchived(ids: List<Long>, isArchived: Boolean)
@Query("SELECT * FROM user_tasks WHERE taskId = :taskId AND userId = :userId")
suspend fun getUserTask(taskId: Long, userId: Long): UserTask?
@Query("SELECT * FROM users")
suspend fun loadUsers(): List<User>
@Query("SELECT * FROM tags")
suspend fun loadTags(): List<Tag>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertTask(task: Task): Long
@Query("SELECT tagId FROM task_tags WHERE taskId = :taskId")
suspend fun loadTaskTagIds(taskId: Long): List<Long>
@Query("DELETE FROM task_tags WHERE taskId = :taskId AND tagId IN(:tagIds)")
suspend fun deleteTaskTags(taskId: Long, tagIds: List<Long>)
@Query(
"""
SELECT MIN(orderInCategory) FROM tasks
WHERE
status = :status
AND id <> :excludeTaskId
"""
)
suspend fun loadMinOrderInCategory(status: TaskStatus, excludeTaskId: Long): Int?
@Transaction
suspend fun saveTaskDetail(detail: TaskDetail, topOrderInCategory: Boolean) {
if (detail.title.isEmpty()) {
throw IllegalArgumentException("Task must include non-empty title.")
}
val task = Task(
id = detail.id,
title = detail.title,
description = detail.description,
status = detail.status,
creatorId = detail.creator.id,
ownerId = detail.owner.id,
createdAt = detail.createdAt,
dueAt = detail.dueAt,
isArchived = detail.isArchived,
orderInCategory = if (topOrderInCategory) {
val min = loadMinOrderInCategory(detail.status, detail.id)
if (min == null) 1 else min - 1
} else {
detail.orderInCategory
}
)
val taskId = insertTask(task)
val updatedTagIds = detail.tags.map { tag -> tag.id }
val currentTagIds = loadTaskTagIds(taskId)
val removedTagIds = currentTagIds.filter { id -> id !in updatedTagIds }
deleteTaskTags(taskId, removedTagIds)
val newTagIds = updatedTagIds.filter { id -> id !in currentTagIds }
insertTaskTags(newTagIds.map { id -> TaskTag(taskId = taskId, tagId = id) })
}