From 2197a445b259f6b38ba83101766a946f84dfe402 Mon Sep 17 00:00:00 2001 From: Menna Srour Date: Wed, 14 May 2025 17:03:35 +0300 Subject: [PATCH 1/4] replace single in useCaseModule and uiModule with singleOf --- src/main/kotlin/di/dataModule.kt | 6 +-- src/main/kotlin/di/uiModule.kt | 66 ++++++++++++++++------------- src/main/kotlin/di/useCaseModule.kt | 62 +++++++++++++-------------- 3 files changed, 70 insertions(+), 64 deletions(-) diff --git a/src/main/kotlin/di/dataModule.kt b/src/main/kotlin/di/dataModule.kt index 3ed91aa..cecaaff 100644 --- a/src/main/kotlin/di/dataModule.kt +++ b/src/main/kotlin/di/dataModule.kt @@ -21,15 +21,15 @@ import com.berlin.domain.usecase.utils.id_generator.IdGenerator import com.berlin.domain.usecase.utils.id_generator.IdGeneratorImplementation import data.AdminUserProvider import data.UserCache +import org.koin.core.module.dsl.singleOf import org.koin.core.qualifier.named import org.koin.dsl.bind import org.koin.dsl.module val dataModule = module { - single { IdGeneratorImplementation() } - single { IdGeneratorImplementation() } - single { MD5Hasher() } + singleOf(::IdGeneratorImplementation) bind IdGenerator::class + singleOf(::MD5Hasher) bind HashingString::class single { AdminUserProvider(get(named("UserDtoDataSource")), get()) } single { UserCache(get().load()) } diff --git a/src/main/kotlin/di/uiModule.kt b/src/main/kotlin/di/uiModule.kt index 5b95d48..c0c46eb 100644 --- a/src/main/kotlin/di/uiModule.kt +++ b/src/main/kotlin/di/uiModule.kt @@ -16,42 +16,44 @@ import com.berlin.presentation.project.* import com.berlin.presentation.task_state.* import com.berlin.presentation.task.* import data.UserCache +import org.koin.core.module.dsl.singleOf import org.koin.core.qualifier.named +import org.koin.dsl.bind import org.koin.dsl.module val uiModule = module { - single { ConsoleViewer() } - single { ConsoleReader() } - single { CreateTaskUI(get(), get(), get(), get(), get(), get(), get()) } - single { AssignTaskUI(get(), get(), get(), get(), get()) } - single { DeleteTaskUI(get(), get(), get(), get()) } - single { GetTasksByProjectIdUI(get(), get(), get(), get(), get()) } - single { UpdateTaskUI(get(), get(), get(), get(), get()) } - single { ChangeTaskStateUI(get(), get(), get(), get(), get()) } - single { GetTaskByIdUI(get(), get(), get()) } + singleOf(::ConsoleViewer) bind Viewer::class + singleOf(::ConsoleReader) bind Reader::class + singleOf(::CreateTaskUI) + singleOf(::AssignTaskUI) + singleOf(::DeleteTaskUI) + singleOf(::GetTasksByProjectIdUI) + singleOf(::UpdateTaskUI) + singleOf(::ChangeTaskStateUI) + singleOf(::GetTaskByIdUI) - single { CreateProjectUi(get(), get(), get()) } - single { DeleteProjectUi(get(), get(), get(), get()) } - single { GetAllProjectsUi(get(), get()) } - single { GetProjectByIdUi(get(), get(), get()) } - single { UpdateProjectUi(get(), get(), get(), get(), get()) } + singleOf(::CreateProjectUi) + singleOf(::DeleteProjectUi) + singleOf(::GetAllProjectsUi) + singleOf(::GetProjectByIdUi) + singleOf(::UpdateProjectUi) - single { CreateTaskStateUI(get(), get(), get(), get()) } - single { DeleteTaskStateUi(get(), get(), get(), get()) } - single { GetAllTaskStatesByProjectIdUI(get(), get(), get(), get()) } - single { GetTaskStateByIdUi(get(), get(), get()) } - single { UpdateTaskStateUI(get(), get(), get(), get()) } + singleOf(::CreateTaskStateUI) + singleOf(::DeleteTaskStateUi) + singleOf(::GetAllTaskStatesByProjectIdUI) + singleOf(::GetTaskStateByIdUi) + singleOf(::UpdateTaskStateUI) - single { AuditByProjectUI(get(), get(), get(), get()) } - single { AuditByTaskUI(get(), get(), get(), get(), get()) } - single { AuditByUserUI(get(), get(), get(), get()) } + singleOf(::AuditByProjectUI) + singleOf(::AuditByTaskUI) + singleOf(::AuditByUserUI) - single { GettingUsersLoggedInUI(get(), get()) } - single { CreateMateUI(get(), get(), get()) } - single { FetchAllUsersUI(get(), get()) } - single { GetUserByIDUI(get(), get(), get()) } - single { GetUserByIDUseCase(get()) } - single { AuthenticateUserUI(get(), get(), get()) } + singleOf(::GettingUsersLoggedInUI) + singleOf(::CreateMateUI) + singleOf(::FetchAllUsersUI) + singleOf(::GetUserByIDUI) + singleOf(::GetUserByIDUseCase) + singleOf(::AuthenticateUserUI) single(named("tasksCategory")) { CategoryUI( @@ -103,7 +105,7 @@ val uiModule = module { CategoryUI( id = 5, label = "Users", children = listOf( get(), get(), get(), get() - ),viewer = get(), reader = get(), userCache = get() + ), viewer = get(), reader = get(), userCache = get() ) } @@ -115,7 +117,11 @@ val uiModule = module { get(named("statesCategory")), get(named("auditCategory")), get(named("usersCategory")) - ), viewer = get(), reader = get(), authUi = get(), userCache = get() + ), + viewer = get(), + reader = get(), + authUi = get(), + userCache = get() ) } } diff --git a/src/main/kotlin/di/useCaseModule.kt b/src/main/kotlin/di/useCaseModule.kt index f2b42a5..6b9e00d 100644 --- a/src/main/kotlin/di/useCaseModule.kt +++ b/src/main/kotlin/di/useCaseModule.kt @@ -18,43 +18,43 @@ import com.berlin.domain.usecase.task_state.GetTaskStateByIdUseCase import com.berlin.domain.usecase.task_state.GetTaskStateByTaskIdUseCase import com.berlin.domain.usecase.task_state.GetTasksByTaskStateIdUseCase import com.berlin.domain.usecase.task_state.UpdateTaskStateUseCase -import data.UserCache import domain.usecase.auth_service.LoginUserUseCase +import org.koin.core.module.dsl.singleOf import org.koin.dsl.module val useCaseModule = module { - single { CreateTaskUseCase(get(), get(), get()) } - single { AssignTaskUseCase(get(), get(), get()) } - single { DeleteTaskUseCase(get(), get(), get()) } - single { GetTasksByProjectUseCase(get()) } - single { UpdateTaskUseCase(get(), get(), get()) } - single { ChangeTaskStateUseCase(get(), get(), get()) } - single { GetTaskByIdUseCase(get()) } - single { GetAllTasksUseCase(get()) } + singleOf(::CreateTaskUseCase) + singleOf(::AssignTaskUseCase) + singleOf(::DeleteTaskUseCase) + singleOf(::GetTasksByProjectUseCase) + singleOf(::UpdateTaskUseCase) + singleOf(::ChangeTaskStateUseCase) + singleOf(::GetTaskByIdUseCase) + singleOf(::GetAllTasksUseCase) - single { CreateProjectUseCase(get(), get(), get(), get()) } - single { GetAllProjectsUseCase(get()) } - single { DeleteProjectUseCase(get(), get(), get()) } - single { GetProjectByIdUseCase(get()) } - single { UpdateProjectUseCase(get(), get(), get() ) } + singleOf(::CreateProjectUseCase) + singleOf(::GetAllProjectsUseCase) + singleOf(::DeleteProjectUseCase) + singleOf(::GetProjectByIdUseCase) + singleOf(::UpdateProjectUseCase) - single { AddAuditLogUseCase(get(), get()) } - single { GetAuditLogsByProjectIdUseCase(get()) } - single { GetAuditLogsByTaskIdUseCase(get()) } - single { GetAuditLogsByUserIdUseCase(get()) } + singleOf(::AddAuditLogUseCase) + singleOf(::GetAuditLogsByProjectIdUseCase) + singleOf(::GetAuditLogsByTaskIdUseCase) + singleOf(::GetAuditLogsByUserIdUseCase) - single { GetUserByIDUseCase(get()) } - single { GetUserLoggedInUseCase(get()) } - single { GetAllUsersUseCase(get()) } - single { LoginUserUseCase(get(),get(), get()) } - single { CreateMateUseCase(get(), get(), get()) } + singleOf(::GetUserByIDUseCase) + singleOf(::GetUserLoggedInUseCase) + singleOf(::GetAllUsersUseCase) + singleOf(::LoginUserUseCase) + singleOf(::CreateMateUseCase) - single { CreateTaskStateUseCase(get(), get()) } - single { DeleteTaskStateUseCase(get()) } - single { GetAllTaskStatesByProjectIdUseCase(get(), get()) } - single { GetTaskStateByIdUseCase(get()) } - single { GetTaskStateByTaskIdUseCase(get(), get()) } - single { GetTasksByTaskStateIdUseCase(get()) } - single { UpdateTaskStateUseCase(get()) } - single { GetAllTaskStatesUseCase(get()) } + singleOf(::CreateTaskStateUseCase) + singleOf(::DeleteTaskStateUseCase) + singleOf(::GetAllTaskStatesByProjectIdUseCase) + singleOf(::GetTaskStateByIdUseCase) + singleOf(::GetTaskStateByTaskIdUseCase) + singleOf(::GetTasksByTaskStateIdUseCase) + singleOf(::UpdateTaskStateUseCase) + singleOf(::GetAllTaskStatesUseCase) } \ No newline at end of file From 11f13e77fb4c9051acaf61cfb155eadcc887768e Mon Sep 17 00:00:00 2001 From: Menna Srour Date: Wed, 14 May 2025 17:06:09 +0300 Subject: [PATCH 2/4] refactor exceptions to use base classes --- .../kotlin/domain/exception/Exceptions.kt | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/domain/exception/Exceptions.kt b/src/main/kotlin/domain/exception/Exceptions.kt index ab78c84..f120603 100644 --- a/src/main/kotlin/domain/exception/Exceptions.kt +++ b/src/main/kotlin/domain/exception/Exceptions.kt @@ -1,23 +1,29 @@ package com.berlin.domain.exception -class TaskAlreadyExistsException(message: String) : IllegalStateException(message) -class TaskNotFoundException(message: String) : NoSuchElementException(message) -class StateNotFoundException(message: String) : NoSuchElementException(message) -class ProjectNotFoundException(message: String) : NoSuchElementException(message) -class InputCancelledException(message: String) : RuntimeException(message) -class InvalidSelectionException(message: String) : RuntimeException(message) -class InvalidTaskTitle(message: String): Exception(message) -class InvalidAssigneeException(message: String): Exception(message) -class InvalidTaskStateException(message: String): Exception(message) -class InvalidProjectIdException(message: String): Exception(message) -class InvalidTaskIdException(message: String): Exception(message) -class InvalidCredentialsException(message: String): Exception(message) -class UserNotFoundException(message: String) : NoSuchElementException(message) -class InvalidUserIdException(message: String): Exception(message) -class UserNotLoggedInException(message: String) : NoSuchElementException(message) -class InvalidTaskException(message: String): Exception(message) -class InvalidProjectException(message: String): Exception(message) -class InvalidStateException(message: String): Exception(message) -class InvalidAuditLogException(message: String): Exception(message) -class InvalidStateIdException(message: String): Exception(message) -class InvalidStateNameException(message: String): Exception(message) +open class InvalidInputException(message: String) : Exception(message) +class InvalidTaskTitle(message: String) : InvalidInputException(message) +class InvalidAssigneeException(message: String) : InvalidInputException(message) +class InvalidTaskStateException(message: String) : InvalidInputException(message) +class InvalidProjectIdException(message: String) : InvalidInputException(message) +class InvalidTaskIdException(message: String) : InvalidInputException(message) +class InvalidCredentialsException(message: String) : InvalidInputException(message) +class InvalidUserIdException(message: String) : InvalidInputException(message) +class InvalidTaskException(message: String) : InvalidInputException(message) +class InvalidProjectException(message: String) : InvalidInputException(message) +class InvalidStateException(message: String) : InvalidInputException(message) +class InvalidAuditLogException(message: String) : InvalidInputException(message) +class InvalidStateIdException(message: String) : InvalidInputException(message) +class InvalidStateNameException(message: String) : InvalidInputException(message) + +open class NotFoundException(message: String) : NoSuchElementException(message) +class TaskNotFoundException(message: String) : NotFoundException(message) +class StateNotFoundException(message: String) : NotFoundException(message) +class ProjectNotFoundException(message: String) : NotFoundException(message) +class UserNotFoundException(message: String) : NotFoundException(message) + +open class SelectionException(message: String) : RuntimeException(message) +class InputCancelledException(message: String) : SelectionException(message) +class InvalidSelectionException(message: String) : SelectionException(message) + +open class AlreadyExistsException(message: String) : IllegalStateException(message) +class TaskAlreadyExistsException(message: String) : AlreadyExistsException(message) From 324aec272fb2ec914c55770b970f88a99662b9d2 Mon Sep 17 00:00:00 2001 From: Menna Srour Date: Thu, 15 May 2025 13:12:24 +0300 Subject: [PATCH 3/4] create repoModule --- src/main/kotlin/di/appModule.kt | 2 +- src/main/kotlin/di/dataModule.kt | 31 ++-------------------- src/main/kotlin/di/repoModule.kt | 44 ++++++++++++++++++++++++++++++++ src/main/kotlin/di/uiModule.kt | 2 ++ 4 files changed, 49 insertions(+), 30 deletions(-) create mode 100644 src/main/kotlin/di/repoModule.kt diff --git a/src/main/kotlin/di/appModule.kt b/src/main/kotlin/di/appModule.kt index a816063..c5c8934 100644 --- a/src/main/kotlin/di/appModule.kt +++ b/src/main/kotlin/di/appModule.kt @@ -5,5 +5,5 @@ import org.koin.dsl.module val appModule = module { - includes(dataModule, uiModule, useCaseModule) + includes(dataModule, repoModule, uiModule, useCaseModule) } diff --git a/src/main/kotlin/di/dataModule.kt b/src/main/kotlin/di/dataModule.kt index cecaaff..86de66f 100644 --- a/src/main/kotlin/di/dataModule.kt +++ b/src/main/kotlin/di/dataModule.kt @@ -1,20 +1,14 @@ package com.berlin.di import com.berlin.data.BaseDataSource -import com.berlin.data.audit.AuditRepositoryImpl import com.berlin.data.csv_data_source.CsvDataSource import com.berlin.data.csv_data_source.schema.* import com.berlin.data.dto.* import com.berlin.data.mapper.* import com.berlin.data.mongodb.config.MongoConfig import com.berlin.data.mongodb.datasource.* -import com.berlin.data.repository.AuthenticationRepositoryImpl -import com.berlin.data.repository.ProjectRepositoryImpl -import com.berlin.data.repository.TaskStateRepositoryImpl -import com.berlin.data.repository.TaskRepositoryImpl import com.berlin.domain.model.* import com.berlin.domain.model.user.User -import com.berlin.domain.repository.* import com.berlin.domain.usecase.utils.hash_algorithm.HashingString import com.berlin.domain.usecase.utils.hash_algorithm.MD5Hasher import com.berlin.domain.usecase.utils.id_generator.IdGenerator @@ -80,16 +74,13 @@ val dataModule = module { "csv_files", get(named("ProjectSchema")) ) } - single>(named("UserDtoDataSource")) { CsvDataSource("csv_files", get(named("UserSchema"))) } - single>(named("TaskDataSource")) { CsvDataSource("csv_files", get(named("TaskSchema"))) } single>(named("StateDataSource")) { CsvDataSource( - "csv_files", - get(named("StateSchema")) + "csv_files", get(named("StateSchema")) ) } single>(named("AuditDataSource")) { CsvDataSource("csv_files", get(named("AuditSchema"))) } @@ -99,23 +90,5 @@ val dataModule = module { single { TaskStateMapper() }.bind>() single { UserMapper(get()) }.bind>() single { AuditLogMapper() }.bind>() +} - single { ProjectRepositoryImpl(get(named("ProjectDataSource")), get()) } - single { TaskRepositoryImpl(get(named("TaskDataSource")), get()) } - single { AuditRepositoryImpl(get(named("AuditDataSource")), get()) } - single { - TaskStateRepositoryImpl( - get(named("StateDataSource")), - get(), - get(), - get() - ) - } - single { - AuthenticationRepositoryImpl( - get(), - get(named("UserDataSource")), - get() - ) - } -} \ No newline at end of file diff --git a/src/main/kotlin/di/repoModule.kt b/src/main/kotlin/di/repoModule.kt new file mode 100644 index 0000000..7386e06 --- /dev/null +++ b/src/main/kotlin/di/repoModule.kt @@ -0,0 +1,44 @@ +package com.berlin.di + +import com.berlin.data.audit.AuditRepositoryImpl +import com.berlin.data.mapper.* +import com.berlin.data.repository.AuthenticationRepositoryImpl +import com.berlin.data.repository.ProjectRepositoryImpl +import com.berlin.data.repository.TaskRepositoryImpl +import com.berlin.data.repository.TaskStateRepositoryImpl +import com.berlin.domain.repository.* +import org.koin.core.qualifier.named +import org.koin.dsl.module + +val repoModule = module { + + single { + ProjectRepositoryImpl( + get(named("ProjectDataSource")), get() + ) + } + + single { + TaskRepositoryImpl( + get(named("TaskDataSource")), get() + ) + } + + single { + AuditRepositoryImpl( + get(named("AuditDataSource")), get() + ) + } + + single { + TaskStateRepositoryImpl( + get(named("StateDataSource")), get(), get(), get() + ) + } + + single { + AuthenticationRepositoryImpl( + get(), get(named("UserDataSource")), get() + ) + } +} diff --git a/src/main/kotlin/di/uiModule.kt b/src/main/kotlin/di/uiModule.kt index c0c46eb..8567b5c 100644 --- a/src/main/kotlin/di/uiModule.kt +++ b/src/main/kotlin/di/uiModule.kt @@ -22,8 +22,10 @@ import org.koin.dsl.bind import org.koin.dsl.module val uiModule = module { + singleOf(::ConsoleViewer) bind Viewer::class singleOf(::ConsoleReader) bind Reader::class + singleOf(::CreateTaskUI) singleOf(::AssignTaskUI) singleOf(::DeleteTaskUI) From 6f1b4cbfbc581e7cb3fc5d846d2fbc1e68ac7e80 Mon Sep 17 00:00:00 2001 From: Menna Srour Date: Thu, 15 May 2025 14:07:25 +0300 Subject: [PATCH 4/4] rename repoModule to repositoryModule --- src/main/kotlin/di/appModule.kt | 2 +- src/main/kotlin/di/{repoModule.kt => repositoryModule.kt} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/kotlin/di/{repoModule.kt => repositoryModule.kt} (97%) diff --git a/src/main/kotlin/di/appModule.kt b/src/main/kotlin/di/appModule.kt index c5c8934..9a4c79e 100644 --- a/src/main/kotlin/di/appModule.kt +++ b/src/main/kotlin/di/appModule.kt @@ -5,5 +5,5 @@ import org.koin.dsl.module val appModule = module { - includes(dataModule, repoModule, uiModule, useCaseModule) + includes(dataModule, repositoryModule, uiModule, useCaseModule) } diff --git a/src/main/kotlin/di/repoModule.kt b/src/main/kotlin/di/repositoryModule.kt similarity index 97% rename from src/main/kotlin/di/repoModule.kt rename to src/main/kotlin/di/repositoryModule.kt index 7386e06..6c3f64c 100644 --- a/src/main/kotlin/di/repoModule.kt +++ b/src/main/kotlin/di/repositoryModule.kt @@ -10,7 +10,7 @@ import com.berlin.domain.repository.* import org.koin.core.qualifier.named import org.koin.dsl.module -val repoModule = module { +val repositoryModule = module { single { ProjectRepositoryImpl(