diff --git a/app/src/main/java/com/planify/mobile/data/local/dao/TaskDao.kt b/app/src/main/java/com/planify/mobile/data/local/dao/TaskDao.kt index f4a05b0..124b427 100644 --- a/app/src/main/java/com/planify/mobile/data/local/dao/TaskDao.kt +++ b/app/src/main/java/com/planify/mobile/data/local/dao/TaskDao.kt @@ -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> + + // #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> + + // #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> + + // #26 — Completed tasks + @Query(""" + SELECT * FROM tasks + WHERE checked = 1 AND is_deleted = 0 + ORDER BY completed_at DESC + """) + fun getCompletedTasks(): Flow> + + // #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> + + // #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> + + // #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) } diff --git a/app/src/main/java/com/planify/mobile/data/repository/TaskRepositoryImpl.kt b/app/src/main/java/com/planify/mobile/data/repository/TaskRepositoryImpl.kt index d049947..1763910 100644 --- a/app/src/main/java/com/planify/mobile/data/repository/TaskRepositoryImpl.kt +++ b/app/src/main/java/com/planify/mobile/data/repository/TaskRepositoryImpl.kt @@ -56,6 +56,28 @@ class TaskRepositoryImpl @Inject constructor( dao.setChecked(id, checked, if (checked) now else null, now) } + override fun getScheduledTasks(): Flow> = + dao.getScheduledTasks().map { it.map { e -> e.toDomain() } } + + override fun getTasksByLabel(labelName: String): Flow> = + dao.getTasksByLabel("%\"$labelName\"%").map { it.map { e -> e.toDomain() } } + + override fun searchTasks(query: String): Flow> = + dao.searchTasks("%$query%").map { it.map { e -> e.toDomain() } } + + override fun getCompletedTasks(): Flow> = + dao.getCompletedTasks().map { it.map { e -> e.toDomain() } } + + override fun getRepeatingTasks(): Flow> = + dao.getRepeatingTasks().map { it.map { e -> e.toDomain() } } + + override fun getTasksByPriority(priority: Int): Flow> = + dao.getTasksByPriority(priority).map { it.map { e -> e.toDomain() } } + + override suspend fun reorderTasks(orderedIds: List) { + orderedIds.forEachIndexed { index, id -> dao.updateChildOrder(id, index) } + } + private fun TaskEntity.toDomain() = Task( id = id, content = content, diff --git a/app/src/main/java/com/planify/mobile/domain/repository/TaskRepository.kt b/app/src/main/java/com/planify/mobile/domain/repository/TaskRepository.kt index 90556dd..e0eae9c 100644 --- a/app/src/main/java/com/planify/mobile/domain/repository/TaskRepository.kt +++ b/app/src/main/java/com/planify/mobile/domain/repository/TaskRepository.kt @@ -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> + fun getTasksByLabel(labelName: String): Flow> + fun searchTasks(query: String): Flow> + fun getCompletedTasks(): Flow> + fun getRepeatingTasks(): Flow> + fun getTasksByPriority(priority: Int): Flow> + suspend fun reorderTasks(orderedIds: List) }