feat: [#22][#23][#24][#25][#26] extension TaskDao/Repository (scheduled, label, search, completed, repeating, priority, reorder)
This commit is contained in:
@@ -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>)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user