Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
8bd7621
fix coverage report download
Apr 28, 2025
13096b0
Merge remote-tracking branch 'origin/development' into development
moathsaad Apr 29, 2025
fb870d8
Merge remote-tracking branch 'origin/development' into feature/audit-…
moathsaad Apr 29, 2025
6e029ea
implement audit system logic and test cases
moathsaad May 1, 2025
b152bff
Merge remote-tracking branch 'origin/development' into development
moathsaad May 1, 2025
a6e9a7a
Merge branch 'development' into feature/audit-system
moathsaad May 1, 2025
956e3c3
refactor audit system structure and remove unused helpers
moathsaad May 2, 2025
e32b0a1
Merge remote-tracking branch 'origin/development' into development
moathsaad May 2, 2025
6cec65f
Merge branch 'development' into feature/audit-system
moathsaad May 2, 2025
2561a86
updated the auditLog model and all related files (use case, helper, t…
moathsaad May 2, 2025
0633d2d
Merge remote-tracking branch 'origin/development' into development
moathsaad May 2, 2025
2740b2b
Merge branch 'development' into feature/audit-system
moathsaad May 2, 2025
93df922
Merge remote-tracking branch 'origin/development' into development
moathsaad May 2, 2025
4a7837a
Merge remote-tracking branch 'origin/development' into development
moathsaad May 5, 2025
cddab48
Merge remote-tracking branch 'origin/development' into development
moathsaad May 10, 2025
7758792
Merge remote-tracking branch 'origin/development' into development
moathsaad May 13, 2025
c4d0d03
Merge remote-tracking branch 'origin/development' into development
moathsaad May 14, 2025
19757a1
Merge remote-tracking branch 'origin/development' into development
moathsaad May 15, 2025
9d37ef6
refactor duplicate by make validate function general
moathsaad May 15, 2025
990ac2d
Merge remote-tracking branch 'origin/development' into development
moathsaad May 15, 2025
a5d7edb
Merge branch 'development' into feature/general-validate-function
moathsaad May 15, 2025
84a8804
merge conflict
moathsaad May 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/main/kotlin/data/UserCache.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import com.berlin.data.mapper.UserMapper
import com.berlin.domain.model.Permission
import com.berlin.domain.model.user.User
import com.berlin.domain.permission.assignPermissions
import com.berlin.domain.repository.AuthenticationRepository

class UserCache(
user: User,
Expand Down
5 changes: 5 additions & 0 deletions src/main/kotlin/di/useCaseModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,16 @@ 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 com.berlin.domain.usecase.utils.validation.NonBlankNonNumericValidator
import com.berlin.domain.usecase.utils.validation.Validator
import domain.usecase.auth_service.LoginUserUseCase
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.bind
import org.koin.dsl.module

val useCaseModule = module {
singleOf(::NonBlankNonNumericValidator) bind Validator::class

singleOf(::CreateTaskUseCase)
singleOf(::AssignTaskUseCase)
singleOf(::DeleteTaskUseCase)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@ package com.berlin.domain.usecase.audit_system
import com.berlin.domain.exception.InvalidProjectIdException
import com.berlin.domain.model.AuditLog
import com.berlin.domain.repository.AuditRepository
import com.berlin.domain.usecase.utils.validation.Validator


class GetAuditLogsByProjectIdUseCase(
private val auditRepository: AuditRepository
private val auditRepository: AuditRepository,
private val validator: Validator
) {

operator fun invoke(projectId: String): List<AuditLog> {

if (!validateProjectId(projectId))
if (!validator.isValid(projectId))
throw InvalidProjectIdException("Project ID must not be empty, blank, or purely numeric")

return auditRepository.getAuditLogsByProjectId(projectId)
}

private fun validateProjectId(projectId: String): Boolean =
projectId.isNotBlank() && !(projectId.all { it.isDigit() })
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@ package com.berlin.domain.usecase.audit_system
import com.berlin.domain.exception.InvalidTaskIdException
import com.berlin.domain.model.AuditLog
import com.berlin.domain.repository.AuditRepository
import com.berlin.domain.usecase.utils.validation.Validator

class GetAuditLogsByTaskIdUseCase(
private val auditRepository: AuditRepository,
private val validator: Validator
) {

operator fun invoke(taskId: String): List<AuditLog> {

if (!validateTaskId(taskId)) throw InvalidTaskIdException("Task ID must not be empty, blank, or purely numeric")
if (!validator.isValid(taskId))
throw InvalidTaskIdException("Task ID must not be empty, blank, or purely numeric")

return auditRepository.getAuditLogsByTaskId(taskId)
}

private fun validateTaskId(projectId: String): Boolean = projectId.isNotBlank() && !(projectId.all { it.isDigit() })
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,19 @@ package com.berlin.domain.usecase.audit_system
import com.berlin.domain.exception.InvalidUserIdException
import com.berlin.domain.model.AuditLog
import com.berlin.domain.repository.AuditRepository
import com.berlin.domain.usecase.utils.validation.Validator

class GetAuditLogsByUserIdUseCase(
private val auditRepository: AuditRepository
private val auditRepository: AuditRepository,
private val validator: Validator
) {

operator fun invoke(userId:String): List<AuditLog>{
operator fun invoke(userId: String): List<AuditLog> {

if (!validateUserId(userId))
if (!validator.isValid(userId))
throw InvalidUserIdException("User ID must not be empty, blank, or purely numeric")

return auditRepository.getAuditLogsByUserId(userId)

}

private fun validateUserId(projectId: String): Boolean =
projectId.isNotBlank() && !(projectId.all { it.isDigit() })
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,23 @@ import com.berlin.domain.model.Project
import com.berlin.domain.repository.ProjectRepository
import com.berlin.domain.usecase.audit_system.AddAuditLogUseCase
import com.berlin.domain.usecase.utils.id_generator.IdGenerator
import com.berlin.domain.usecase.utils.validation.Validator
import data.UserCache

class CreateProjectUseCase(
private val projectRepository: ProjectRepository,
private val idGenerator: IdGenerator,
private val addAuditLogUseCase: AddAuditLogUseCase,
private val cashedUser: UserCache,
private val validator: Validator
) {
operator fun invoke(
projectName: String,
description: String?,
stateId: List<String>?,
taskId: List<String>?,
): String {
if (validateProjectName(projectName)) {
if (validator.isValid(projectName)) {
val newProject = Project(
id = idGenerator.generateId(projectName),
title = projectName,
Expand All @@ -42,7 +44,4 @@ class CreateProjectUseCase(
throw Exception("Project Name must not be empty or blank")
}
}

private fun validateProjectName(projectName: String): Boolean =
projectName.isNotBlank() && !(projectName.all { it.isDigit() })
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
package com.berlin.domain.usecase.project

import com.berlin.domain.exception.InvalidProjectIdException
import com.berlin.domain.exception.ProjectNotFoundException
import com.berlin.domain.model.AuditLog
import com.berlin.domain.repository.ProjectRepository
import com.berlin.domain.usecase.audit_system.AddAuditLogUseCase
import com.berlin.domain.usecase.utils.validation.Validator
import data.UserCache

class DeleteProjectUseCase(
private val projectRepository: ProjectRepository,
private val addAuditLogUseCase: AddAuditLogUseCase,
private val cashedUser: UserCache,
private val validator: Validator
) {
operator fun invoke(projectId: String): String {

if (!validateProjectId(projectId)) {
if (!validator.isValid(projectId)) {
throw InvalidProjectIdException("Project ID must not be empty or blank")
}

Expand All @@ -29,8 +30,4 @@ class DeleteProjectUseCase(

return deletedProject
}

private fun validateProjectId(projectId: String): Boolean =
projectId.isNotBlank() && !(projectId.all { it.isDigit() })

}
10 changes: 4 additions & 6 deletions src/main/kotlin/domain/usecase/project/GetProjectByIdUseCase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,17 @@ package com.berlin.domain.usecase.project
import com.berlin.domain.exception.InvalidProjectIdException
import com.berlin.domain.repository.ProjectRepository
import com.berlin.domain.model.Project
import com.berlin.domain.usecase.utils.validation.Validator

class GetProjectByIdUseCase (
private val projectRepository: ProjectRepository
private val projectRepository: ProjectRepository,
private val validator: Validator
) {

operator fun invoke(projectId: String): Project {
if(!validateProjectId(projectId))
if(!validator.isValid(projectId))
throw InvalidProjectIdException("project id must not be empty, blank, or purely numeric")

return projectRepository.getProjectById(projectId)
}

private fun validateProjectId(projectId: String): Boolean =
projectId.isNotBlank() && !(projectId.all { it.isDigit() })

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,17 @@ import com.berlin.domain.model.AuditLog
import com.berlin.domain.model.Project
import com.berlin.domain.repository.ProjectRepository
import com.berlin.domain.usecase.audit_system.AddAuditLogUseCase
import com.berlin.domain.usecase.utils.validation.Validator
import data.UserCache

class UpdateProjectUseCase(
private val projectRepository: ProjectRepository,
private val addAuditLogUseCase: AddAuditLogUseCase,
private val cashedUser: UserCache,
private val validator: Validator
) {
operator fun invoke(project: Project): String {
if (!validateProjectName(project.title)) throw InvalidProjectException("Project Name must not be empty or blank")
if (!validator.isValid(project.title)) throw InvalidProjectException("Project Name must not be empty or blank")

val updatedProject = projectRepository.updateProject(project)

Expand All @@ -26,7 +28,4 @@ class UpdateProjectUseCase(

return updatedProject
}

private fun validateProjectName(projectName: String): Boolean =
projectName.isNotBlank() && !(projectName.all { it.isDigit() })
}
7 changes: 3 additions & 4 deletions src/main/kotlin/domain/usecase/task/ChangeTaskStateUseCase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,21 @@ import com.berlin.domain.model.AuditLog
import com.berlin.domain.model.Task
import com.berlin.domain.repository.TaskRepository
import com.berlin.domain.usecase.audit_system.AddAuditLogUseCase
import com.berlin.domain.usecase.utils.validation.Validator
import data.UserCache

class ChangeTaskStateUseCase(
private val taskRepository: TaskRepository,
private val addAuditLogUseCase: AddAuditLogUseCase,
private val cashedUser: UserCache,
private val validator: Validator
) {

operator fun invoke(taskId: String, newStateId: String): Task {

val original = taskRepository.getTaskById(taskId)

if (!validateStateId(newStateId)) {
if (!validator.isValid(newStateId)) {
throw InvalidTaskStateException("State id must not be empty, blank, or purely numeric")
}

Expand All @@ -33,7 +35,4 @@ class ChangeTaskStateUseCase(

return updatedTask
}

private fun validateStateId(stateId: String): Boolean =
stateId.isNotBlank() && !stateId.all { it.isDigit() }
}
10 changes: 4 additions & 6 deletions src/main/kotlin/domain/usecase/task/CreateTaskUseCase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ import com.berlin.domain.model.Task
import com.berlin.domain.repository.TaskRepository
import com.berlin.domain.usecase.audit_system.AddAuditLogUseCase
import com.berlin.domain.usecase.utils.id_generator.IdGenerator
import com.berlin.domain.usecase.utils.validation.Validator

class CreateTaskUseCase(
private val taskRepository: TaskRepository,
private val defaultIdGenerator: IdGenerator,
private val addAuditLogUseCase: AddAuditLogUseCase
private val addAuditLogUseCase: AddAuditLogUseCase,
private val validator: Validator
) {
operator fun invoke(
projectId: String,
Expand All @@ -21,7 +23,7 @@ class CreateTaskUseCase(
createByUserId: String,
assignedToUserId: String,
): Task {
if (validateTaskTitle(title.trim())) {
if (validator.isValid(title.trim())) {
val newTask = Task(
id = defaultIdGenerator.generateId(title.trim()),
projectId = projectId,
Expand Down Expand Up @@ -50,10 +52,6 @@ class CreateTaskUseCase(
}
}

private fun validateTaskTitle(title: String): Boolean {
return title.isNotBlank() && !title.any { it.isDigit() }
}

private fun validateUniqueTask(taskId: String): Boolean {
return try {
taskRepository.getTaskById(taskId)
Expand Down
6 changes: 3 additions & 3 deletions src/main/kotlin/domain/usecase/task/DeleteTaskUseCase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,17 @@ package com.berlin.domain.usecase.task
import com.berlin.domain.model.AuditLog
import com.berlin.domain.repository.TaskRepository
import com.berlin.domain.usecase.audit_system.AddAuditLogUseCase
import com.berlin.domain.usecase.utils.validation.Validator
import data.UserCache

class DeleteTaskUseCase(
private val taskRepository: TaskRepository,
private val addAuditLogUseCase: AddAuditLogUseCase,
private val cashedUser: UserCache,
private val validator: Validator
) {
operator fun invoke(taskId: String) : String {
if (!validateTaskId(taskId)) {
if (!validator.isValid(taskId)) {
throw Exception("Project ID must not be empty or blank")
}
taskRepository.deleteTask(taskId)
Expand All @@ -25,6 +27,4 @@ class DeleteTaskUseCase(

return "Deleted."
}

private fun validateTaskId(taskId: String): Boolean = taskId.isNotBlank() && !(taskId.all { it.isDigit() })
}
7 changes: 3 additions & 4 deletions src/main/kotlin/domain/usecase/task/GetTaskByIdUseCase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,19 @@ package com.berlin.domain.usecase.task
import com.berlin.domain.exception.InvalidTaskIdException
import com.berlin.domain.model.Task
import com.berlin.domain.repository.TaskRepository
import com.berlin.domain.usecase.utils.validation.Validator

class GetTaskByIdUseCase(
private val taskRepository: TaskRepository,
private val validator: Validator
) {

operator fun invoke(taskId: String): Task {

if (!validateTaskId(taskId)) {
if (!validator.isValid(taskId)) {
throw InvalidTaskIdException("Task id must not be empty, blank, or purely numeric")
}

return taskRepository.getTaskById(taskId)
}

private fun validateTaskId(id: String): Boolean =
id.isNotBlank() && !id.all { it.isDigit() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,18 @@ package com.berlin.domain.usecase.task
import com.berlin.domain.exception.InvalidProjectIdException
import com.berlin.domain.model.Task
import com.berlin.domain.repository.TaskRepository
import com.berlin.domain.usecase.utils.validation.Validator

class GetTasksByProjectUseCase(
private val taskRepository: TaskRepository
private val taskRepository: TaskRepository,
private val validator: Validator
) {

operator fun invoke(projectId: String): List<Task> {

if (!validateProjectId(projectId)) {
if (!validator.isValid(projectId)) {
throw InvalidProjectIdException("Project id must not be empty, blank, or purely numeric")
}
return taskRepository.getTasksByProjectId(projectId)
}

private fun validateProjectId(id: String): Boolean =
id.isNotBlank() && !id.all { it.isDigit() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ import com.berlin.domain.exception.InvalidStateNameException
import com.berlin.domain.repository.TaskStateRepository
import com.berlin.domain.model.TaskState
import com.berlin.domain.usecase.utils.id_generator.IdGeneratorImplementation
import com.berlin.domain.usecase.utils.validation.Validator

class CreateTaskStateUseCase(
private val taskStateRepository: TaskStateRepository,
private val idGenerator: IdGeneratorImplementation,
private val validator: Validator
) {
operator fun invoke(stateName: String, projectId: String): String {
if (validateStateName(stateName)) {
if (validator.isValid(stateName)) {
val newState = TaskState(
id = idGenerator.generateId(stateName),
name = stateName,
Expand All @@ -22,7 +24,4 @@ class CreateTaskStateUseCase(
throw InvalidStateNameException("State Name must not be empty or blank")
}
}

private fun validateStateName(stateName: String): Boolean =
stateName.isNotBlank() && !(stateName.all { it.isDigit() })
}
Loading