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")
|
||||
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)
|
||||
}
|
||||
|
||||
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(
|
||||
id = id,
|
||||
content = content,
|
||||
|
||||
@@ -15,4 +15,11 @@ interface TaskRepository {
|
||||
suspend fun updateTask(task: Task)
|
||||
suspend fun deleteTask(id: String)
|
||||
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