feat: [#22][#23][#24][#25][#26] extension TaskDao/Repository (scheduled, label, search, completed, repeating, priority, reorder)

This commit is contained in:
2026-06-06 06:38:56 +02:00
parent 53c597a365
commit 8827c85c82
3 changed files with 81 additions and 0 deletions
@@ -59,4 +59,56 @@ interface TaskDao {
@Query("UPDATE tasks SET is_deleted = 1, updated_at = :updatedAt WHERE id = :id") @Query("UPDATE tasks SET is_deleted = 1, updated_at = :updatedAt WHERE id = :id")
suspend fun softDelete(id: String, updatedAt: String) suspend fun softDelete(id: String, updatedAt: String)
// #22 — Scheduled: tasks with future due date
@Query("""
SELECT * FROM tasks
WHERE date(due_date) >= date('now') AND checked = 0 AND is_deleted = 0
ORDER BY due_date ASC
""")
fun getScheduledTasks(): Flow<List<TaskEntity>>
// #23 — Labels: tasks containing a label name in their labels JSON
@Query("""
SELECT * FROM tasks
WHERE labels LIKE :labelPattern AND is_deleted = 0
ORDER BY child_order ASC
""")
fun getTasksByLabel(labelPattern: String): Flow<List<TaskEntity>>
// #24 — Search
@Query("""
SELECT * FROM tasks
WHERE (content LIKE :query OR description LIKE :query) AND is_deleted = 0
ORDER BY child_order ASC
""")
fun searchTasks(query: String): Flow<List<TaskEntity>>
// #26 — Completed tasks
@Query("""
SELECT * FROM tasks
WHERE checked = 1 AND is_deleted = 0
ORDER BY completed_at DESC
""")
fun getCompletedTasks(): Flow<List<TaskEntity>>
// #26 — Repeating tasks (due_date contains isRecurring:true)
@Query("""
SELECT * FROM tasks
WHERE labels LIKE '%' AND is_deleted = 0 AND due_date LIKE '%isRecurring%:true%'
ORDER BY child_order ASC
""")
fun getRepeatingTasks(): Flow<List<TaskEntity>>
// #26 — Tasks by priority
@Query("""
SELECT * FROM tasks
WHERE priority = :priority AND checked = 0 AND is_deleted = 0
ORDER BY child_order ASC
""")
fun getTasksByPriority(priority: Int): Flow<List<TaskEntity>>
// #25 — Reorder: update child_order for a single task
@Query("UPDATE tasks SET child_order = :order WHERE id = :id")
suspend fun updateChildOrder(id: String, order: Int)
} }
@@ -56,6 +56,28 @@ class TaskRepositoryImpl @Inject constructor(
dao.setChecked(id, checked, if (checked) now else null, now) dao.setChecked(id, checked, if (checked) now else null, now)
} }
override fun getScheduledTasks(): Flow<List<Task>> =
dao.getScheduledTasks().map { it.map { e -> e.toDomain() } }
override fun getTasksByLabel(labelName: String): Flow<List<Task>> =
dao.getTasksByLabel("%\"$labelName\"%").map { it.map { e -> e.toDomain() } }
override fun searchTasks(query: String): Flow<List<Task>> =
dao.searchTasks("%$query%").map { it.map { e -> e.toDomain() } }
override fun getCompletedTasks(): Flow<List<Task>> =
dao.getCompletedTasks().map { it.map { e -> e.toDomain() } }
override fun getRepeatingTasks(): Flow<List<Task>> =
dao.getRepeatingTasks().map { it.map { e -> e.toDomain() } }
override fun getTasksByPriority(priority: Int): Flow<List<Task>> =
dao.getTasksByPriority(priority).map { it.map { e -> e.toDomain() } }
override suspend fun reorderTasks(orderedIds: List<String>) {
orderedIds.forEachIndexed { index, id -> dao.updateChildOrder(id, index) }
}
private fun TaskEntity.toDomain() = Task( private fun TaskEntity.toDomain() = Task(
id = id, id = id,
content = content, content = content,
@@ -15,4 +15,11 @@ interface TaskRepository {
suspend fun updateTask(task: Task) suspend fun updateTask(task: Task)
suspend fun deleteTask(id: String) suspend fun deleteTask(id: String)
suspend fun checkTask(id: String, checked: Boolean) suspend fun checkTask(id: String, checked: Boolean)
fun getScheduledTasks(): Flow<List<Task>>
fun getTasksByLabel(labelName: String): Flow<List<Task>>
fun searchTasks(query: String): Flow<List<Task>>
fun getCompletedTasks(): Flow<List<Task>>
fun getRepeatingTasks(): Flow<List<Task>>
fun getTasksByPriority(priority: Int): Flow<List<Task>>
suspend fun reorderTasks(orderedIds: List<String>)
} }