Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
0179c07
updated project dto to include BSON serialization annotations
Zeinab979 May 11, 2025
95860d7
updated project dto to include BSON serialization annotations
Zeinab979 May 11, 2025
56a824f
change mapper to exertion function
mohammed-akkad May 11, 2025
32f9599
Merge remote-tracking branch 'origin/develop' into refactor/102-refac…
mohammed-akkad May 11, 2025
bb35c0e
update user dto
mohammed-akkad May 11, 2025
143a881
Merge pull request #111 from Beijing-Squad/refactor/102-refactor-user…
karimdeabes May 11, 2025
a09b10a
refactor show animation function in base screen
mohammed-akkad May 11, 2025
bab0f3c
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
Zeinab979 May 11, 2025
517f51f
replace project mapping functions with extension functions
Zeinab979 May 11, 2025
f9e6b26
Merge pull request #112 from Beijing-Squad/feature/79-project-managem…
MohamedOmar989 May 11, 2025
1241a37
rename extension functions, copy user role from sessionManagerUseCase
Zeinab979 May 11, 2025
10969dc
refactor taskState use cases
May 11, 2025
b496def
refactor taskState repo abstraction
May 11, 2025
92e5775
Merge pull request #113 from Beijing-Squad/feature/79-project-managem…
MohamedOmar989 May 11, 2025
d180c2d
refactor taskState data repo impl
May 11, 2025
fea1eb6
refactor taskState mongo impl
May 11, 2025
0eb65c7
delete unwanted di after refactor taskState
May 11, 2025
8ef06b2
change the return type of projectId in fake createState
May 11, 2025
05f94b1
some enhancement for test cases after refactoring use cases and creat…
May 11, 2025
e55506c
some enhancement for the state, task screen
May 11, 2025
ad0fc31
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
May 11, 2025
ba0ab65
enhance taskState csv dataSource test cases
May 11, 2025
67e795a
add an id as a parameter to fake createProject that needed in state t…
May 11, 2025
4f12b05
Merge pull request #114 from Beijing-Squad/refactor/58-refactor-state…
MohamedOmar989 May 11, 2025
61828d3
update project screen test cases
Zeinab979 May 12, 2025
a34230c
update project screen
Zeinab979 May 12, 2025
1bcf089
update csv parser test cases
Zeinab979 May 12, 2025
c90c9c5
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
Zeinab979 May 12, 2025
4e0d3fc
refactor get all user in user screen
mohammed-akkad May 12, 2025
8995ba3
solve issue of id with project test cases
Zeinab979 May 12, 2025
dc7c17f
get id from session manager
Zeinab979 May 12, 2025
7afa96f
add animation for project screen
Zeinab979 May 12, 2025
5b97bbd
handle feature choice
Zeinab979 May 12, 2025
d93eec8
removed to task entity
Radwa85 May 12, 2025
55500d5
deleted custom codec
Radwa85 May 12, 2025
349fba7
removed bson id annotation
Radwa85 May 12, 2025
4b0e5df
rename TaskDTO to TaskDto for consistent naming convention.
Radwa85 May 12, 2025
743a619
Remove unused CoroutineScope from MongoConnection
Radwa85 May 12, 2025
9e4beea
removed unused imports and use replace one to update task
Radwa85 May 12, 2025
f8f61c8
rename taskDTO to taskDto
Radwa85 May 12, 2025
4ed5a06
used extension function for mapper
Radwa85 May 12, 2025
361d8dc
used extension function for mapper and removed exception
Radwa85 May 12, 2025
15828ec
used showAnimation fun and simplify exception
Radwa85 May 12, 2025
efb2752
update user repository implementation
mohammed-akkad May 12, 2025
6bef694
Refactor tests to map new screen edits
Radwa85 May 12, 2025
eae47f0
used showAnimation fun and simplify exception
Radwa85 May 12, 2025
14e9e54
solve import conflict
Radwa85 May 12, 2025
25555b6
remove unused filter
Radwa85 May 12, 2025
459e32b
fix import conflicts
Radwa85 May 12, 2025
5410cc7
fix import conflicts
Radwa85 May 12, 2025
45056dc
enhance TaskStateScreen
May 12, 2025
af1bd9b
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
mohammed-akkad May 12, 2025
231bb13
fix conflict
mohammed-akkad May 12, 2025
72f7835
removed run blocking where using show animation
Radwa85 May 12, 2025
de3b2c8
solve mege errors
Radwa85 May 12, 2025
353aea7
Merge pull request #118 from Beijing-Squad/refactor/58-refactor-state…
mohammed-akkad May 12, 2025
f70bfff
Merge pull request #116 from Beijing-Squad/refactor/refactor-task-mon…
mohammed-akkad May 12, 2025
fbe4edd
update ui
Zeinab979 May 12, 2025
69f002b
update animation
Zeinab979 May 12, 2025
14b9910
remove all separated csv files and combine them together
MohamedOmar989 May 12, 2025
90df5d8
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
MohamedOmar989 May 12, 2025
f75d990
changing task state name in local data source
MohamedOmar989 May 12, 2025
3e50879
solve merge errors
Radwa85 May 12, 2025
a4d27c5
Merge remote-tracking branch 'origin/refactor/refactor-task-mongodb-i…
Radwa85 May 12, 2025
331c6d3
refactor add audit log use case test
May 12, 2025
b9e1700
refactor add audit log use case test
May 12, 2025
df6e946
refactor audit repository impl
May 12, 2025
c5804e3
refactor audit screen
May 12, 2025
996575c
refactor audit screen test
May 12, 2025
49940a3
refactor get all audit logs use C
May 12, 2025
8d88f53
refactor get all projects use case test
May 12, 2025
12af08b
refactor get audit logs by project id use case
May 12, 2025
0938cf5
refactor get audit logs by project id use case
May 12, 2025
0a5772e
refactor get audit logs by task id use case test
May 12, 2025
c7f3b34
refactor update project use case test
May 12, 2025
8eb0dc8
refactor use case module
May 12, 2025
598e1f9
rename state to task state in local data source
MohamedOmar989 May 12, 2025
f4b8389
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
May 12, 2025
2dda5d9
Merge pull request #119 from Beijing-Squad/refactor/57-refactor-authe…
mohammed-akkad May 12, 2025
a600cd3
refactor get audit logs by project id use case
May 12, 2025
c367d72
update needed changes
MohamedOmar989 May 12, 2025
d150e14
add audit test cases to local data source impl test
MohamedOmar989 May 12, 2025
7e7b3ae
Merge pull request #121 from Beijing-Squad/refactor/57-refactor-authe…
MohamedOmar989 May 12, 2025
fe1dd2e
Merge pull request #120 from Beijing-Squad/feature/77-implement-audit…
mohammed-akkad May 12, 2025
2217984
solve update issue after change call animation place
Radwa85 May 12, 2025
67c0deb
fix animation issues in project screen and base screen
karrar-abbas May 12, 2025
7e5a3f8
delete id in add audit log fun in add audit log use case
karrar-abbas May 12, 2025
0499ff1
removed call of get task by id in update
Radwa85 May 12, 2025
93d390d
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
Radwa85 May 12, 2025
d7cfa23
Merge pull request #122 from Beijing-Squad/refactor/refactor-task-mon…
mohammed-akkad May 12, 2025
344d6e0
used current user in update function
Radwa85 May 12, 2025
6ff7706
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
Radwa85 May 12, 2025
a251e9e
refactor audit screen test siwtch verifysequence to verify
May 12, 2025
ea6ee69
refactor audit csv parser test
May 12, 2025
30b6ad2
Merge pull request #124 from Beijing-Squad/refactor/63-refactor-aduit…
MohamedOmar989 May 12, 2025
3039fb6
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
Zeinab979 May 13, 2025
8b076cc
add test cases for delete and update project
Zeinab979 May 13, 2025
656b3d5
update project screen
Zeinab979 May 13, 2025
222430a
remove run blocking from audit screen
Zeinab979 May 13, 2025
193d8c4
remove duplicated id
Zeinab979 May 13, 2025
c7d5747
remove new line after animation
Zeinab979 May 13, 2025
ffd7502
Merge pull request #115 from Beijing-Squad/feature/79-project-managem…
mohamedibrahim3 May 13, 2025
90eb6d9
Merge pull request #125 from Beijing-Squad/refactor/63-refactor-aduit…
mohamedibrahim3 May 13, 2025
4571587
refactor TaskState LocalDataSource to support new DTO and unify with …
May 13, 2025
b4ca841
refactor the package name from entities to entity
mohamedibrahim3 May 13, 2025
cf47c72
refactor the package name from entities to entity
mohamedibrahim3 May 13, 2025
d5e2d43
refactor for all mappers to use extension functions
mohamedibrahim3 May 13, 2025
4327bd9
update taskState tests after local data source refactor
May 13, 2025
9953580
refactor all the feature screens and unify the function names to star…
mohamedibrahim3 May 13, 2025
9a4876e
refactor project screens and unify the function names to start with o…
mohamedibrahim3 May 13, 2025
f46836b
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
Radwa85 May 13, 2025
39d2581
make created by and created at values from existingTask
Radwa85 May 13, 2025
002de7c
refactor the entire project, remove unnecessary spaces, and clean up …
mohamedibrahim3 May 13, 2025
efeeaf3
Merge branch 'refactor/105-refactor-mongodb-implementation' into refa…
mohamedibrahim3 May 13, 2025
ae30e4e
Merge pull request #126 from Beijing-Squad/refactor/refactor-task-mon…
mohammed-akkad May 13, 2025
9e93ab2
remove run blocking from audit screen
mohamedibrahim3 May 13, 2025
226d264
Merge remote-tracking branch 'origin/refactor/105-refactor-mongodb-im…
May 13, 2025
b02f587
refactor LocalDataSource to use TaskState instead of TaskStateDto
mohamedibrahim3 May 13, 2025
286398a
Merge branch 'refactor/105-refactor-mongodb-implementation' into refa…
mohamedibrahim3 May 13, 2025
5a44bea
Merge remote-tracking branch 'origin/refactor/109-refactor-mapper-and…
May 13, 2025
735fc1c
change audit ui back navigation to audit options
May 13, 2025
3252dd8
fix audit feature behavior in the AuditScreen
May 13, 2025
223d2e8
Merge pull request #127 from Beijing-Squad/refactor/109-refactor-mapp…
mohammed-akkad May 13, 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
34 changes: 0 additions & 34 deletions src/main/kotlin/data/local/csvDataSource/AuditCsvDataSourceImpl.kt

This file was deleted.

This file was deleted.

208 changes: 208 additions & 0 deletions src/main/kotlin/data/local/csvDataSource/LocalDataSourceImpl.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
package data.local.csvDataSource

import data.local.csvDataSource.csv.CsvDataSourceImpl
import data.repository.localDataSource.LocalDataSource
import data.utils.hashPassword
import logic.entity.*
import logic.entity.type.UserRole
import logic.exceptions.*
import kotlin.uuid.ExperimentalUuidApi
import kotlin.uuid.Uuid

class LocalDataSourceImpl(
private val auditCsvDataSource: CsvDataSourceImpl<Audit>,
private val userCsvDataSource: CsvDataSourceImpl<User>,
private val projectCsvDataSource: CsvDataSourceImpl<Project>,
private val taskCsvDataSource: CsvDataSourceImpl<Task>,
private val taskStateCsvDataSource: CsvDataSourceImpl<TaskState>
) : LocalDataSource {
private val states = getAllTaskStates().toMutableList()

//region authentication
override fun saveUser(username: String, password: String, role: UserRole): Boolean {
val existingUser = this.getAllUsers()
.find { it.userName == username }
if (existingUser != null) {
throw UserExistsException("User already exists")
}
val hashedPassword = hashPassword(password)

return try {
val user = createUser(username, hashedPassword, role)
userCsvDataSource.appendToFile(user)
true
} catch (e: Exception) {
false
}
}

override fun getAuthenticatedUser(username: String, password: String): User {
val user = this.getAllUsers()
.find { it.userName == username }
?: throw UserNotFoundException("Invalid username or password")

val hashedInputPassword = hashPassword(password)
if (user.password != hashedInputPassword) {
throw InvalidPasswordException("Invalid password")
}
return user
}

@OptIn(ExperimentalUuidApi::class)
private fun createUser(username: String, hashedPassword: String, role: UserRole): User {
return User(Uuid.random(), username, hashedPassword, role)
}
//endregion

//region audit
override fun getAllAuditLogs(): List<Audit> {
return auditCsvDataSource.loadAllDataFromFile()
}

override fun addAuditLog(audit: Audit) {
auditCsvDataSource.appendToFile(audit)
}

override fun getAuditLogsByProjectId(projectId: String): List<Audit> {
return getAllAuditLogs().filter { auditLog -> isMatchingProject(auditLog, projectId) }
}

override fun getAuditLogsByTaskId(taskId: String): List<Audit> {
return getAllAuditLogs().filter { audit: Audit ->
audit.entityId == taskId
&& audit.entityType == Audit.EntityType.TASK
}
}

private fun isMatchingProject(audit: Audit, projectId: String): Boolean {
return audit.entityId == projectId && audit.entityType == Audit.EntityType.PROJECT
}
//endregion

//region project
override fun getAllProjects(): List<Project> = projectCsvDataSource.loadAllDataFromFile()

override fun addProject(project: Project) = projectCsvDataSource.appendToFile(project)

override fun deleteProject(projectId: String) = projectCsvDataSource.deleteById(projectId)

override fun updateProject(newProjects: Project) = projectCsvDataSource.updateItem(newProjects)

override fun getProjectById(projectId: String): Project = projectCsvDataSource.getById(projectId)
//endregion

//region task state
override fun addTaskState(taskState: TaskState): Boolean {
return try {
taskStateCsvDataSource.appendToFile(taskState)
true
} catch (e: StateException) {
false
}
}

@OptIn(ExperimentalUuidApi::class)
override fun deleteTaskState(taskState: TaskState): Boolean {
return try {
taskStateCsvDataSource.deleteById(taskState.id.toString())
true
} catch (e: StateException) {
false
}
}

override fun getAllTaskStates(): List<TaskState> {
return taskStateCsvDataSource.loadAllDataFromFile()
}

@OptIn(ExperimentalUuidApi::class)
override fun getTaskStateById(stateId: String): TaskState {
return getAllTaskStates()
.find { it.id.toString() == stateId }
?: throw StateNotFoundException()
}

@OptIn(ExperimentalUuidApi::class)
override fun getTaskStatesByProjectId(projectId: String): List<TaskState> {
return getAllTaskStates()
.filter { it.projectId.toString() == projectId }
}

@OptIn(ExperimentalUuidApi::class)
override fun updateTaskState(taskState: TaskState): TaskState {
return getTaskStateById(taskState.id.toString()).let { currentState ->
val updatedState = currentState.copy(
name = taskState.name,
projectId = taskState.projectId
)
val updatedStates = states.map { if (it == currentState) updatedState else it }
taskStateCsvDataSource.updateFile(updatedStates)
updatedState
}
}
//endregion

//region task
override fun getAllTasks(): List<Task> {
return taskCsvDataSource.loadAllDataFromFile()
}

@OptIn(ExperimentalUuidApi::class)
override fun getTaskById(taskId: String): Task {

val tasks = taskCsvDataSource.loadAllDataFromFile()
return tasks.find { it.id.toString() == taskId }
?: throw TaskNotFoundException("Task with ID $taskId not found")
}

override fun addTask(task: Task) = taskCsvDataSource.appendToFile(task)


override fun deleteTask(taskId: String) = taskCsvDataSource.deleteById(taskId)

@OptIn(ExperimentalUuidApi::class)
override fun updateTask(updatedTask: Task): Task {

val tasks = taskCsvDataSource.loadAllDataFromFile().toMutableList()

val taskIndex = tasks.indexOfFirst { it.id.toString() == updatedTask.id.toString() }
if (updatedTask.title.isEmpty()) throw InvalidInputException("Task title cannot be empty")
if (taskIndex == -1) throw TaskNotFoundException("Task with ID ${updatedTask.id} not found")

tasks[taskIndex] = updatedTask
taskCsvDataSource.updateFile(tasks)
return updatedTask
}
//endregion

//region user
override fun getAllUsers(): List<User> {
return userCsvDataSource
.loadAllDataFromFile()
.toMutableList()
.toList()
}

@OptIn(ExperimentalUuidApi::class)
override fun getUserByUserId(userId: String): User {
return getAllUsers()
.find { it.id.toString() == userId }
?: throw UserNotFoundException()

}

@OptIn(ExperimentalUuidApi::class)
override fun updateUser(user: User): User {
val currentUser = getUserByUserId(user.id.toString())
val passwordToUse = if (user.password != currentUser.password) {
hashPassword(user.password)
} else {
currentUser.password
}
val updatedUser = currentUser
.copy(userName = user.userName, password = passwordToUse)
userCsvDataSource.updateItem(updatedUser)
return updatedUser
}
//endregion
}

This file was deleted.

This file was deleted.

Loading
Loading