Skip to content

Commit 63040c0

Browse files
authored
Merge pull request #37 from janewaitara/feat_code_cleanup
Feat code cleanup
2 parents 94bd034 + 9c9c37c commit 63040c0

26 files changed

+535
-273
lines changed

app/src/main/java/com/mumbicodes/projectie/data/db/ProjectsDao.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ interface ProjectsDao {
1717

1818
/** Fetch */
1919
@Query("SELECT * from projects_table WHERE projectId = :projectId")
20-
suspend fun getProjectById(projectId: Int): Project
20+
fun getProjectById(projectId: Int): Flow<Project>
2121

2222
@Transaction
2323
@Query("SELECT * FROM projects_table WHERE projectId = :projectId")
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.mumbicodes.projectie.data.helpers
2+
3+
sealed interface LocalResult<out T> {
4+
data class Success<T>(val data: T) : LocalResult<T>
5+
data class Error(val errorMessage: String) : LocalResult<Nothing>
6+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.mumbicodes.projectie.data.helpers
2+
3+
import com.mumbicodes.projectie.domain.model.DataResult
4+
5+
fun <T> LocalResult<T>.toDataResult(): DataResult<T> = when (this) {
6+
is LocalResult.Error -> DataResult.Error(this.errorMessage)
7+
is LocalResult.Success -> DataResult.Success(this.data)
8+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.mumbicodes.projectie.data.helpers
2+
3+
suspend fun <T> safeTransaction(
4+
block: suspend () -> T,
5+
): LocalResult<T> =
6+
try {
7+
LocalResult.Success(block())
8+
} catch (exception: Exception) {
9+
LocalResult.Error(exception.localizedMessage ?: "There was an error received")
10+
}

app/src/main/java/com/mumbicodes/projectie/data/repository/ProjectsRepositoryImpl.kt

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package com.mumbicodes.projectie.data.repository
22

33
import com.mumbicodes.projectie.data.db.ProjectsDao
4+
import com.mumbicodes.projectie.data.helpers.LocalResult
5+
import com.mumbicodes.projectie.data.helpers.safeTransaction
6+
import com.mumbicodes.projectie.data.helpers.toDataResult
7+
import com.mumbicodes.projectie.domain.model.DataResult
48
import com.mumbicodes.projectie.domain.model.Project
59
import com.mumbicodes.projectie.domain.model.ProjectName
610
import com.mumbicodes.projectie.domain.relations.ProjectWithMilestones
711
import com.mumbicodes.projectie.domain.repository.ProjectsRepository
12+
import com.mumbicodes.projectie.domain.util.OrderType
13+
import com.mumbicodes.projectie.domain.util.ProjectsOrder
814
import kotlinx.coroutines.flow.Flow
15+
import kotlinx.coroutines.flow.map
916

1017
class ProjectsRepositoryImpl(
1118
private val projectsDao: ProjectsDao,
@@ -18,17 +25,51 @@ class ProjectsRepositoryImpl(
1825
projectsDao.updateProject(project = project)
1926
}
2027

21-
override suspend fun getProjectById(projectId: Int): Project =
22-
projectsDao.getProjectById(projectId)
28+
override suspend fun getProjectById(projectId: Int): DataResult<Flow<Project>> =
29+
when (val localResult = safeTransaction { projectsDao.getProjectById(projectId) }) {
30+
is LocalResult.Error -> DataResult.Error(localResult.errorMessage)
31+
is LocalResult.Success -> DataResult.Success(localResult.data)
32+
}
2333

24-
override fun getProjectByIdWithMilestones(projectId: Int): Flow<ProjectWithMilestones?> =
25-
projectsDao.getProjectByIdWithMilestones(projectId)
34+
override suspend fun getProjectByIdWithMilestones(projectId: Int): DataResult<Flow<ProjectWithMilestones?>> =
35+
when (
36+
val localResult =
37+
safeTransaction { projectsDao.getProjectByIdWithMilestones(projectId) }
38+
) {
39+
is LocalResult.Error -> DataResult.Error(localResult.errorMessage)
40+
is LocalResult.Success -> DataResult.Success(localResult.data)
41+
}
2642

27-
override fun getAllProjects(): Flow<List<Project>> =
28-
projectsDao.getAllProjects()
43+
/**
44+
* Added logic to get projects and sort the projects
45+
*
46+
* By default, the order is the date added
47+
* */
48+
override suspend fun getAllProjects(projectOrder: ProjectsOrder): DataResult<Flow<List<Project>>> =
49+
safeTransaction {
50+
projectsDao.getAllProjects().map { projects ->
51+
when (projectOrder.orderType) {
52+
is OrderType.Ascending -> {
53+
when (projectOrder) {
54+
is ProjectsOrder.Name -> projects.sortedBy { it.projectName.lowercase() }
55+
is ProjectsOrder.Deadline -> projects.sortedBy { it.projectDeadline }
56+
is ProjectsOrder.DateAdded -> projects.sortedBy { it.timeStamp }
57+
}
58+
}
2959

30-
override fun getProjectNameAndId(): Flow<List<ProjectName>> =
31-
projectsDao.getProjectNameAndId()
60+
is OrderType.Descending -> {
61+
when (projectOrder) {
62+
is ProjectsOrder.Name -> projects.sortedByDescending { it.projectName.lowercase() }
63+
is ProjectsOrder.Deadline -> projects.sortedByDescending { it.projectDeadline }
64+
is ProjectsOrder.DateAdded -> projects.sortedByDescending { it.timeStamp }
65+
}
66+
}
67+
}
68+
}
69+
}.toDataResult()
70+
71+
override suspend fun getProjectNameAndId(): DataResult<Flow<List<ProjectName>>> =
72+
safeTransaction { projectsDao.getProjectNameAndId() }.toDataResult()
3273

3374
override suspend fun deleteProject(project: Project) {
3475
projectsDao.deleteProject(project)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.mumbicodes.projectie.domain.model
2+
3+
sealed interface DataResult<out T> {
4+
data class Success<T>(val data: T) : DataResult<T>
5+
data class Error(val errorMessage: String) : DataResult<Nothing>
6+
}

app/src/main/java/com/mumbicodes/projectie/domain/repository/ProjectsRepository.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.mumbicodes.projectie.domain.repository
22

3+
import com.mumbicodes.projectie.domain.model.DataResult
34
import com.mumbicodes.projectie.domain.model.Project
45
import com.mumbicodes.projectie.domain.model.ProjectName
56
import com.mumbicodes.projectie.domain.relations.ProjectWithMilestones
7+
import com.mumbicodes.projectie.domain.util.ProjectsOrder
68
import kotlinx.coroutines.flow.Flow
79

810
interface ProjectsRepository {
@@ -11,13 +13,13 @@ interface ProjectsRepository {
1113

1214
suspend fun updateProject(project: Project)
1315

14-
suspend fun getProjectById(projectId: Int): Project
16+
suspend fun getProjectById(projectId: Int): DataResult<Flow<Project>>
1517

16-
fun getProjectByIdWithMilestones(projectId: Int): Flow<ProjectWithMilestones?>
18+
suspend fun getProjectByIdWithMilestones(projectId: Int): DataResult <Flow<ProjectWithMilestones?>>
1719

18-
fun getAllProjects(): Flow<List<Project>>
20+
suspend fun getAllProjects(projectOrder: ProjectsOrder): DataResult<Flow<List<Project>>>
1921

20-
fun getProjectNameAndId(): Flow<List<ProjectName>>
22+
suspend fun getProjectNameAndId(): DataResult<Flow<List<ProjectName>>>
2123

2224
suspend fun deleteProject(project: Project)
2325

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.mumbicodes.projectie.domain.use_case.projects
22

3+
import com.mumbicodes.projectie.domain.model.DataResult
34
import com.mumbicodes.projectie.domain.model.Project
45
import com.mumbicodes.projectie.domain.repository.ProjectsRepository
6+
import kotlinx.coroutines.flow.Flow
57

68
class GetProjectByIdUseCase(
79
private val repository: ProjectsRepository
810
) {
9-
suspend operator fun invoke(projectId: Int): Project =
11+
suspend operator fun invoke(projectId: Int): DataResult<Flow<Project>> =
1012
repository.getProjectById(projectId)
1113
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package com.mumbicodes.projectie.domain.use_case.projects
22

3+
import com.mumbicodes.projectie.domain.model.DataResult
34
import com.mumbicodes.projectie.domain.relations.ProjectWithMilestones
45
import com.mumbicodes.projectie.domain.repository.ProjectsRepository
56
import kotlinx.coroutines.flow.Flow
67

78
class GetProjectByIdWithMilestonesUseCase(
89
private val repository: ProjectsRepository,
910
) {
10-
operator fun invoke(
11+
suspend operator fun invoke(
1112
projectId: Int,
12-
): Flow<ProjectWithMilestones?> =
13+
): DataResult<Flow<ProjectWithMilestones?>> =
1314
repository.getProjectByIdWithMilestones(projectId)
1415
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.mumbicodes.projectie.domain.use_case.projects
22

3+
import com.mumbicodes.projectie.domain.model.DataResult
34
import com.mumbicodes.projectie.domain.model.ProjectName
45
import com.mumbicodes.projectie.domain.repository.ProjectsRepository
56
import kotlinx.coroutines.flow.Flow
67

78
class GetProjectNameAndIdUseCase(
89
private val repository: ProjectsRepository,
910
) {
10-
operator fun invoke(): Flow<List<ProjectName>> =
11+
suspend operator fun invoke(): DataResult<Flow<List<ProjectName>>> =
1112
repository.getProjectNameAndId()
1213
}

0 commit comments

Comments
 (0)