From 727389d628d06e611d0a04ad70abb672b930e687 Mon Sep 17 00:00:00 2001 From: braintelligencePL Date: Fri, 12 Apr 2019 07:53:40 +0200 Subject: [PATCH 1/7] project feature basic validation --- .idea/compiler.xml | 9 + .idea/encodings.xml | 4 + .idea/markdown-navigator.xml | 85 ++++++++ .../markdown-navigator/profiles_settings.xml | 3 + .idea/misc.xml | 4 + .idea/modules.xml | 10 + ...braintelligence.project-manager-kotlin.iml | 13 ++ ...telligence.project-manager-kotlin.main.iml | 125 +++++++++++ ...telligence.project-manager-kotlin.test.iml | 196 ++++++++++++++++++ .idea/vcs.xml | 6 + .../core/projects/domain/Feature.kt | 27 ++- .../core/projects/domain/PriorityLevel.kt | 3 +- .../core/projects/domain/Project.kt | 17 +- .../projects/domain/ProjectCreatorService.kt | 9 +- .../core/projects/domain/ProjectExceptions.kt | 4 + .../core/projects/domain/ProjectFactory.kt | 7 +- .../projects/domain/ProjectQueryService.kt | 6 +- .../core/projects/domain/Status.kt | 3 +- .../InMemoryProjectRepository.kt | 4 +- .../domain/configuration/TeamConfiguration.kt | 2 - .../ports/outgoing/ProjectQueryRepository.kt | 2 + .../core/team/domain/Employee.kt | 3 +- .../incoming/rest/ProjectController.kt | 46 ---- .../adapter/incoming/rest/TeamController.kt | 40 ---- .../adapter/incoming/rest/dto/ProjectDtos.kt | 7 - .../adapter/incoming/rest/dto/TeamDtos.kt | 40 ---- .../mongo/project/TeamCreatorRepository.kt | 23 -- .../mongo/project/TeamQueryRepository.kt | 20 -- .../mongo/project/entities/DbFeature.kt | 7 - .../mongo/project/entities/DbProject.kt | 53 ----- .../mongo/team/MongoTeamRepository.kt | 39 ---- .../mongo/team/entities/DbEmployee.kt | 28 --- .../outgoing/mongo/team/entities/DbTeam.kt | 35 ---- .../project/ProjectAcceptanceTest.groovy | 10 +- .../project/base/BaseProjectUnitTest.groovy | 2 +- .../project/domain/ProjectCreationTest.groovy | 23 -- .../project/domain/ProjectQueryTest.groovy | 29 +++ .../domain/AddingTeamMembersToTeamTest.groovy | 26 --- .../team/domain/TeamCreationTest.groovy | 37 ---- .../team/domain/TeamValidationTest.groovy | 44 ---- 40 files changed, 555 insertions(+), 496 deletions(-) create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/markdown-navigator.xml create mode 100644 .idea/markdown-navigator/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/modules/pl.braintelligence.project-manager-kotlin.iml create mode 100644 .idea/modules/pl.braintelligence.project-manager-kotlin.main.iml create mode 100644 .idea/modules/pl.braintelligence.project-manager-kotlin.test.iml create mode 100644 .idea/vcs.xml delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/ProjectController.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/TeamController.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/ProjectDtos.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/TeamDtos.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamCreatorRepository.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamQueryRepository.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbFeature.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbProject.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/MongoTeamRepository.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbEmployee.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbTeam.kt delete mode 100644 src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationTest.groovy delete mode 100644 src/test/groovy/pl/braintelligence/projectmanager/team/domain/AddingTeamMembersToTeamTest.groovy delete mode 100644 src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationTest.groovy delete mode 100644 src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamValidationTest.groovy diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..131f0be --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml new file mode 100644 index 0000000..d030f38 --- /dev/null +++ b/.idea/markdown-navigator.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml new file mode 100644 index 0000000..57927c5 --- /dev/null +++ b/.idea/markdown-navigator/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..aa34541 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..fea60b4 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/pl.braintelligence.project-manager-kotlin.iml b/.idea/modules/pl.braintelligence.project-manager-kotlin.iml new file mode 100644 index 0000000..7c1473f --- /dev/null +++ b/.idea/modules/pl.braintelligence.project-manager-kotlin.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/pl.braintelligence.project-manager-kotlin.main.iml b/.idea/modules/pl.braintelligence.project-manager-kotlin.main.iml new file mode 100644 index 0000000..0c58a18 --- /dev/null +++ b/.idea/modules/pl.braintelligence.project-manager-kotlin.main.iml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml b/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml new file mode 100644 index 0000000..25819aa --- /dev/null +++ b/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Feature.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Feature.kt index f369df7..991686f 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Feature.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Feature.kt @@ -1,7 +1,32 @@ package pl.braintelligence.projectmanager.core.projects.domain +import arrow.core.Try +import arrow.core.getOrElse +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.NewFeature + class Feature( val name: String, val status: Status = Status.TO_DO, val priorityLevel: PriorityLevel = PriorityLevel.NOT_DEFINED -) +) { + fun hasNoBlankName() = name.isNotBlank() + + companion object { + fun toFeatures(newFeatures: List) = + newFeatures.map { + Feature( + it.name, + validateStatus(it), + validatePriorityLevel(it) + ) + } + + private fun validatePriorityLevel(it: NewFeature) = Try { + PriorityLevel.valueOf(it.priorityLevel) + }.getOrElse { PriorityLevel.INVALID } + + private fun validateStatus(it: NewFeature) = Try { + Status.valueOf(it.status) + }.getOrElse { Status.INVALID } + } +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/PriorityLevel.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/PriorityLevel.kt index 1b50509..6ff6607 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/PriorityLevel.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/PriorityLevel.kt @@ -6,5 +6,6 @@ enum class PriorityLevel { MEDIUM, LOW, LOWEST, - NOT_DEFINED + NOT_DEFINED, + INVALID; } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Project.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Project.kt index 731e0d4..809ea5c 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Project.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Project.kt @@ -1,9 +1,22 @@ package pl.braintelligence.projectmanager.core.projects.domain -data class Project( +data class Project @JvmOverloads constructor( val id: String, val name: String, val status: Status = Status.TO_DO, val teamAssigned: String = "", val features: List = listOf() -) +) { + init { + require(id.isNotBlank()) { throw InvalidProjectException("Project id cannot be empty.") } + require(name.isNotBlank()) { throw InvalidProjectException("Project name cannot be empty.") } + validateFeatures(features) + } + + private fun validateFeatures(features: List) { + features.forEach { + require(it.hasNoBlankName()) { throw InvalidProjectFeatureException("Project feature must have a name.") } + } + } + +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectCreatorService.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectCreatorService.kt index dc4083c..8379941 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectCreatorService.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectCreatorService.kt @@ -16,8 +16,11 @@ class ProjectCreatorService( projectFactory.createProjectDraft(projectDraft.projectName) .also { projectCreatorRepository.save(it) } - override fun createProjectWithFeatures(projectWithFeatures: ProjectWithFeatures): Project = - projectFactory.createProjectWithFeatures(projectWithFeatures) - .also { projectCreatorRepository.save(it) } + override fun createProjectWithFeatures(projectWithFeatures: ProjectWithFeatures): Project { + val features = Feature.toFeatures(projectWithFeatures.features) + + return projectFactory.createProjectWithFeatures(projectWithFeatures.projectName, features) + .also { projectCreatorRepository.save(it) } + } } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectExceptions.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectExceptions.kt index e9e2c53..91235aa 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectExceptions.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectExceptions.kt @@ -4,3 +4,7 @@ import pl.braintelligence.projectmanager.shared.DomainException internal class MissingProjectException(message: String) : DomainException(message) + +internal class InvalidProjectException(message: String) : DomainException(message) + +internal class InvalidProjectFeatureException(message: String) : DomainException(message) diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectFactory.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectFactory.kt index 9d16de5..34121ce 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectFactory.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectFactory.kt @@ -1,7 +1,6 @@ package pl.braintelligence.projectmanager.core.projects.domain import org.springframework.stereotype.Component -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectWithFeatures import java.util.* @Component @@ -12,14 +11,10 @@ open class ProjectFactory { return Project(id = id, name = projectName) } - fun createProjectWithFeatures(projectWithFeatures: ProjectWithFeatures): Project { + fun createProjectWithFeatures(name: String, features: List): Project { val id = generateProjectUniqueId() - val name = projectWithFeatures.projectName - val features = projectWithFeatures.features - return Project(id = id, name = name, features = features) } - private fun generateProjectUniqueId() = UUID.randomUUID().toString() } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectQueryService.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectQueryService.kt index 79e2b52..c423b90 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectQueryService.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectQueryService.kt @@ -13,9 +13,9 @@ class ProjectQueryService( projectQueryRepository.findById(id) ?: throw MissingProjectException("Project does not exist.") - override fun getProjects(): List { - TODO("not implemented") - } + override fun getProjects(): List = + projectQueryRepository.findAll() + } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Status.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Status.kt index dec795a..02c9922 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Status.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Status.kt @@ -3,5 +3,6 @@ package pl.braintelligence.projectmanager.core.projects.domain enum class Status { TO_DO, IN_PROGRESS, - COMPLETED + COMPLETED, + INVALID; } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/InMemoryProjectRepository.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/InMemoryProjectRepository.kt index a8603e0..00b3c8c 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/InMemoryProjectRepository.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/InMemoryProjectRepository.kt @@ -5,7 +5,9 @@ import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectCre import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectQueryRepository import pl.braintelligence.projectmanager.shared.InMemoryCrudRepository -open class InMemoryProjectRepository : InMemoryCrudRepository(), ProjectCreatorRepository, ProjectQueryRepository { +open class InMemoryProjectRepository + : InMemoryCrudRepository(), + ProjectCreatorRepository, ProjectQueryRepository { override fun save(project: Project) { super.save(entity = project, id = project.id) diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/TeamConfiguration.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/TeamConfiguration.kt index 149a3fd..a82ca59 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/TeamConfiguration.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/TeamConfiguration.kt @@ -26,7 +26,6 @@ open class ProjectConfiguration { ): ProjectCreatorPort = ProjectCreatorService(projectFactory, projectCreatorRepository) - open fun buildProjectQuery( inMemoryProjectRepository: InMemoryProjectRepository ): ProjectQueryPort = @@ -38,5 +37,4 @@ open class ProjectConfiguration { ): ProjectQueryPort = ProjectQueryService(projectQueryRepository) - } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/outgoing/ProjectQueryRepository.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/outgoing/ProjectQueryRepository.kt index 2aea2fb..2cd7814 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/outgoing/ProjectQueryRepository.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/outgoing/ProjectQueryRepository.kt @@ -6,4 +6,6 @@ interface ProjectQueryRepository { fun findById(id: String): Project? + fun findAll(): List + } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Employee.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Employee.kt index 698879f..a4810c7 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Employee.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Employee.kt @@ -22,7 +22,6 @@ class Employee( ) private fun toJobPosition(jobPosition: String) = - Try { JobPosition.valueOf(jobPosition) } - .getOrElse { JobPosition.INVALID } + Try { JobPosition.valueOf(jobPosition) }.getOrElse { JobPosition.INVALID } } } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/ProjectController.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/ProjectController.kt deleted file mode 100644 index 0c57306..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/ProjectController.kt +++ /dev/null @@ -1,46 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest - -import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.http.HttpStatus -import org.springframework.web.bind.annotation.* -import pl.braintelligence.projectmanager.core.projects.domain.Project -import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectCreatorPort -import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectQueryPort -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectDraft -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectWithFeatures - -/** - * Primary Adapter - */ - -@RestController -@RequestMapping("/projects") -internal class ProjectController( - @Qualifier("projectCreatorService") private val projectCreatorPort: ProjectCreatorPort, - @Qualifier("projectQueryService") private val projectQueryPort: ProjectQueryPort -) { - - @PostMapping("drafts") - @ResponseStatus(HttpStatus.CREATED) - fun createProjectDraft( - @RequestBody projectDraft: ProjectDraft - ): Project = projectCreatorPort.createProjectDraft(projectDraft) - - @PostMapping - @ResponseStatus(HttpStatus.CREATED) - fun createProjectWithFeatures( - @RequestBody projectWithFeatures: ProjectWithFeatures - ): Project = projectCreatorPort.createProjectWithFeatures(projectWithFeatures) - - @GetMapping("/{id}") - @ResponseStatus(HttpStatus.OK) - fun getProject( - @PathVariable id: String - ): Project = projectQueryPort.getProject(id) - - @GetMapping - @ResponseStatus(HttpStatus.OK) - fun getProjects(): List = TODO() - - -} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/TeamController.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/TeamController.kt deleted file mode 100644 index 80b6dd3..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/TeamController.kt +++ /dev/null @@ -1,40 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest - -import org.springframework.http.HttpStatus -import org.springframework.web.bind.annotation.* -import pl.braintelligence.projectmanager.core.team.ports.incoming.TeamManager -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ExistingTeam -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.NewTeam -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.TeamMember - -/** - * Primary Adapter - */ - -@RestController -@RequestMapping("/teams") -class TeamController( - private val teamManager: TeamManager -) { - - @ResponseStatus(HttpStatus.CREATED) - @PostMapping - fun createTeam( - @RequestBody newTeamDto: NewTeam - ) = teamManager.createTeam(newTeamDto) - - @ResponseStatus(HttpStatus.CREATED) - @PostMapping("{teamName}/members") - fun addMemberToTeam( - @PathVariable teamName: String, - @RequestBody teamMember: TeamMember - ) = teamManager.addMemberToTeam(teamName, teamMember) - - @ResponseStatus(HttpStatus.OK) - @GetMapping - fun getTeams(): List = - ExistingTeam.toExistingTeams(teamManager.getTeams()) - - -} - diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/ProjectDtos.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/ProjectDtos.kt deleted file mode 100644 index 1ebb278..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/ProjectDtos.kt +++ /dev/null @@ -1,7 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto - -import pl.braintelligence.projectmanager.core.projects.domain.Feature - -data class ProjectDraft(val projectName: String) - -data class ProjectWithFeatures(val projectName: String, val features: List) diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/TeamDtos.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/TeamDtos.kt deleted file mode 100644 index 6e1edae..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/TeamDtos.kt +++ /dev/null @@ -1,40 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto - -import pl.braintelligence.projectmanager.core.team.domain.Employee -import pl.braintelligence.projectmanager.core.team.domain.Team - -data class NewTeam(val name: String) - -data class TeamMember( - val firstName: String, - val lastName: String, - val jobPosition: String -) { - companion object { - fun toTeamMembers(employees: List): List = - employees.map { - TeamMember( - it.firstName, - it.lastName, - it.jobPosition.toString()) - } - } -} - -data class ExistingTeam( - val name: String, - val currentlyImplementedProjects: Int, - val members: List, - val isTeamBusy: Boolean -) { - companion object { - fun toExistingTeams(teams: List): List = - teams.map { - ExistingTeam( - it.name, - it.numberOfOngoingProjects, - TeamMember.toTeamMembers(it.members), - it.isTeamBusy()) - } - } -} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamCreatorRepository.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamCreatorRepository.kt deleted file mode 100644 index 7947a60..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamCreatorRepository.kt +++ /dev/null @@ -1,23 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.outgoing.mongo.project - -import org.springframework.data.repository.CrudRepository -import org.springframework.stereotype.Component -import org.springframework.stereotype.Repository -import pl.braintelligence.projectmanager.core.projects.domain.Project -import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectCreatorRepository -import pl.braintelligence.projectmanager.infrastructure.adapter.outgoing.mongo.project.entities.DbProject - -@Repository -interface MongoTeamCreationRepository : CrudRepository - -@Component -class TeamCreatorRepository( - private val mongo: MongoTeamCreationRepository -) : ProjectCreatorRepository { - - override fun save(project: Project) { - val dbProject = DbProject.toDbProject(project) - mongo.save(dbProject) - } - -} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamQueryRepository.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamQueryRepository.kt deleted file mode 100644 index a5c2d34..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamQueryRepository.kt +++ /dev/null @@ -1,20 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.outgoing.mongo.project - -import org.springframework.data.mongodb.repository.MongoRepository -import org.springframework.stereotype.Component -import org.springframework.stereotype.Repository -import pl.braintelligence.projectmanager.core.projects.domain.Project -import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectQueryRepository -import pl.braintelligence.projectmanager.infrastructure.adapter.outgoing.mongo.project.entities.DbProject - -@Repository -interface MongoTeamQueryRepository : MongoRepository - -@Component -class TeamQueryRepository( - private val mongo: MongoTeamCreationRepository -) : ProjectQueryRepository { - - override fun findById(id: String): Project? = DbProject.toProject(mongo.findById(id).get()) - -} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbFeature.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbFeature.kt deleted file mode 100644 index af31fac..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbFeature.kt +++ /dev/null @@ -1,7 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.outgoing.mongo.project.entities - -data class DbFeature( - val name: String, - val status: String, - val priorityLevel: String -) diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbProject.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbProject.kt deleted file mode 100644 index a5dbf76..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbProject.kt +++ /dev/null @@ -1,53 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.outgoing.mongo.project.entities - -import arrow.core.Try -import arrow.core.getOrElse -import org.springframework.data.annotation.Id -import org.springframework.data.mongodb.core.mapping.Document -import pl.braintelligence.projectmanager.core.projects.domain.Feature -import pl.braintelligence.projectmanager.core.projects.domain.PriorityLevel -import pl.braintelligence.projectmanager.core.projects.domain.Project -import pl.braintelligence.projectmanager.core.projects.domain.Status - -@Document(collection = "projects") -class DbProject( - @Id val id: String, - val name: String, - val status: Status = Status.TO_DO, - val teamAssigned: String = "", - val features: List = listOf() -) { - companion object { - fun toDbProject(project: Project): DbProject = DbProject( - project.id, - project.name, - project.status, - project.teamAssigned, - project.features.map { - DbFeature( - name = it.name, - status = it.status.toString(), - priorityLevel = it.priorityLevel.toString() - ) - } - ) - - fun toProject(dbProject: DbProject): Project = Project( - dbProject.id, - dbProject.name, - dbProject.status, - dbProject.teamAssigned, - dbProject.features.map { - Feature( - name = it.name, - status = Try { Status.valueOf(it.status) } - .getOrElse { throw IllegalArgumentException("Not valid Feature status") }, - priorityLevel = Try { PriorityLevel.valueOf(it.priorityLevel) } - .getOrElse { throw IllegalArgumentException("Not valid Feature priorityLevel") } - ) - } - - ) - - } -} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/MongoTeamRepository.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/MongoTeamRepository.kt deleted file mode 100644 index 41b4dd7..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/MongoTeamRepository.kt +++ /dev/null @@ -1,39 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.outgoing.mongo.team - -import DbTeam -import org.springframework.data.repository.CrudRepository -import org.springframework.stereotype.Component -import org.springframework.stereotype.Repository -import pl.braintelligence.projectmanager.core.team.domain.Team -import pl.braintelligence.projectmanager.core.team.ports.outgoing.TeamRepository - - -@Repository -interface CrudTeamRepository : CrudRepository { - fun findByName(name: String): DbTeam? -} - -/** - * Secondary adapter - */ - -@Component -class MongoTeamRepository( - private val mongo: CrudTeamRepository -) : TeamRepository { - - override fun existsByName(name: String): Boolean = - mongo.existsById(name) - - override fun findByName(name: String): Team? { - val dbTeam = mongo.findByName(name) - return dbTeam?.let { DbTeam.toTeam(it) } - } - - override fun findAll(): List = DbTeam.toTeams( - mongo.findAll().toList()) - - override fun save(team: Team) { - DbTeam.toDbTeam(team).also { mongo.save(it) } - } -} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbEmployee.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbEmployee.kt deleted file mode 100644 index 5bdf965..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbEmployee.kt +++ /dev/null @@ -1,28 +0,0 @@ -import pl.braintelligence.projectmanager.core.team.domain.Employee -import pl.braintelligence.projectmanager.core.team.domain.JobPosition - -data class DbEmployee( - private val firstName: String, - private val lastName: String, - private val jobPosition: String -) { - companion object { - fun toDbEmployee(employee: List): List = - employee.map { toDbEmployee(it) } - - private fun toDbEmployee(employee: Employee): DbEmployee = - DbEmployee( - employee.firstName, - employee.lastName, - employee.jobPosition.toString() - ) - - fun toEmployee(dbEmployee: DbEmployee): Employee = - - Employee( - dbEmployee.firstName, - dbEmployee.lastName, - JobPosition.valueOf(dbEmployee.jobPosition) - ) - } -} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbTeam.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbTeam.kt deleted file mode 100644 index fc6731c..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbTeam.kt +++ /dev/null @@ -1,35 +0,0 @@ -import org.springframework.data.annotation.Id -import org.springframework.data.mongodb.core.mapping.Document -import pl.braintelligence.projectmanager.core.team.domain.Team - -@Document(collection = "teams") -data class DbTeam( - @Id private val name: String, - private val numberOfOngoingProjects: Int, - private val members: List -) { - companion object { - fun toDbTeam(team: Team): DbTeam = - DbTeam( - team.name, - team.numberOfOngoingProjects, - DbEmployee.toDbEmployee(team.members) - ) - - fun toTeams(dbTeams: List): List = - dbTeams.map { - Team( - it.name, - it.numberOfOngoingProjects, - it.members.map { member -> DbEmployee.toEmployee(member) } - ) - } - - fun toTeam(dbTeam: DbTeam): Team? = - Team( - dbTeam.name, - dbTeam.numberOfOngoingProjects, - dbTeam.members.map { DbEmployee.toEmployee(it) } - ) - } -} diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectAcceptanceTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectAcceptanceTest.groovy index 9e02e12..770967d 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectAcceptanceTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectAcceptanceTest.groovy @@ -1,6 +1,6 @@ package pl.braintelligence.projectmanager.project - +import org.springframework.core.ParameterizedTypeReference import org.springframework.http.HttpStatus import pl.braintelligence.projectmanager.base.BaseIntegrationTest import pl.braintelligence.projectmanager.core.projects.domain.Project @@ -24,11 +24,11 @@ class ProjectAcceptanceTest extends BaseIntegrationTest { then: response.statusCode == HttpStatus.CREATED -// when: "browse for all projects" -// response = get("/projects", new ParameterizedTypeReference>() {}) + when: "browse for all projects" + response = get("/projects", new ParameterizedTypeReference>() {}) -// then: -// response.statusCode == HttpStatus.OK + then: + response.statusCode == HttpStatus.OK } } diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/base/BaseProjectUnitTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/base/BaseProjectUnitTest.groovy index 39a7363..ce9eac3 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/project/base/BaseProjectUnitTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/base/BaseProjectUnitTest.groovy @@ -26,7 +26,7 @@ class BaseProjectUnitTest extends BaseUnitTest { id != null name == newProjectDraftDto.projectName status == Status.TO_DO - teamAssigned == "" + teamAssigned.isBlank() features == [] } } diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationTest.groovy deleted file mode 100644 index 7ae60fd..0000000 --- a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationTest.groovy +++ /dev/null @@ -1,23 +0,0 @@ -package pl.braintelligence.projectmanager.project.domain - - -import pl.braintelligence.projectmanager.project.base.BaseProjectUnitTest - -class ProjectCreationTest extends BaseProjectUnitTest { - - def "Should create a project draft and browse for it"() { - when: - def project = projectCreator.createProjectDraft(newProjectDraftDto) - - then: - verifyProjectDraft(project) - } - - def "Should create project with features and browse it"() { - when: - def project = projectCreator.createProjectWithFeatures(newProjectWithFeaturesDto) - - then: - verifyProjectWithFeatures(project) - } -} diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectQueryTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectQueryTest.groovy index 845092d..6fa2245 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectQueryTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectQueryTest.groovy @@ -1,5 +1,6 @@ package pl.braintelligence.projectmanager.project.domain +import pl.braintelligence.projectmanager.core.projects.domain.MissingProjectException import pl.braintelligence.projectmanager.project.base.BaseProjectUnitTest class ProjectQueryTest extends BaseProjectUnitTest { @@ -15,4 +16,32 @@ class ProjectQueryTest extends BaseProjectUnitTest { verifyProjectWithFeatures(response) } + def "Should throw MissingProjectException when project does not exist"() { + when: + projectQuery.getProject("projectId") + + then: + def thrown = thrown(MissingProjectException) + thrown.message == "Project does not exist." + } + + def "Should browse for projects"() { + given: + projectCreator.createProjectWithFeatures(newProjectWithFeaturesDto) + projectCreator.createProjectDraft(newProjectDraftDto) + + when: + def response = projectQuery.getProjects() + + then: + response.size() == 2 + } + + def "Should throw MissingProjectException when there is no projects available"() { + when: + def response = projectQuery.getProjects() + + then: + response.empty + } } diff --git a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/AddingTeamMembersToTeamTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/AddingTeamMembersToTeamTest.groovy deleted file mode 100644 index 6c0a1fd..0000000 --- a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/AddingTeamMembersToTeamTest.groovy +++ /dev/null @@ -1,26 +0,0 @@ -package pl.braintelligence.projectmanager.team.domain - - -import pl.braintelligence.projectmanager.team.base.BaseTeamUnitTest - -class AddingTeamMembersToTeamTest extends BaseTeamUnitTest { - - def "Should add member to a team"() { - given: "new team is created" - teamService.createTeam(newTeamDto) - - and: "member is added to a team" - teamService.addMemberToTeam(newTeamDto.name, teamMemberDto) - - when: "teams are retrieved" - def response = teamService.getTeam(newTeamDto.name) - - then: "new member is in a team" - with(response.members[0]) { - firstName == teamMemberDto.firstName - lastName == teamMemberDto.lastName - jobPosition.name() == teamMemberDto.jobPosition - } - } - -} diff --git a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationTest.groovy deleted file mode 100644 index 175c1d2..0000000 --- a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationTest.groovy +++ /dev/null @@ -1,37 +0,0 @@ -package pl.braintelligence.projectmanager.team.domain - -import pl.braintelligence.projectmanager.team.base.BaseTeamUnitTest - -class TeamCreationTest extends BaseTeamUnitTest { - - def "Should create a team (with default values)"() { - given: - teamService.createTeam(newTeamDto) - - when: - def response = teamService.getTeam(newTeamDto.name) - - then: - with(response) { - name == newTeamDto.name - numberOfOngoingProjects == 0 - members == [] - } - } - - def "Should create a teams (with default values)"() { - given: - teamService.createTeam(newTeamDto) - teamService.createTeam(newTeamDto1) - - when: - def response = teamService.getTeams() - - then: - with(response) { - name[0] == newTeamDto.name - name[1] == newTeamDto1.name - } - } - -} diff --git a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamValidationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamValidationTest.groovy deleted file mode 100644 index 6b2f09c..0000000 --- a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamValidationTest.groovy +++ /dev/null @@ -1,44 +0,0 @@ -package pl.braintelligence.projectmanager.team.domain - - -import pl.braintelligence.projectmanager.core.team.domain.EntityAlreadyExistsException -import pl.braintelligence.projectmanager.core.team.domain.InvalidTeamException -import pl.braintelligence.projectmanager.core.team.domain.MissingTeamException -import pl.braintelligence.projectmanager.core.team.domain.Team -import pl.braintelligence.projectmanager.team.base.BaseTeamUnitTest - -class TeamValidationTest extends BaseTeamUnitTest { - - def "Should throw exception when team does not exist"() { - when: - teamService.addMemberToTeam("non-existent team name", teamMemberDto) - - then: - def thrown = thrown(MissingTeamException.class) - thrown.message == "Team does not exist." - } - - def "Should throw an exception when team name is empty"() { - when: - new Team(teamName) - - then: - def ex = thrown(InvalidTeamException.class) - ex.message == "Empty team name." - - where: - teamName << ['', ' '] - } - - def "Should not create team that already exists"() { - given: "create a team" - teamService.createTeam(newTeamDto) - - when: "create another team with the same name" - teamService.createTeam(newTeamDto) - - then: - def thrown = thrown(EntityAlreadyExistsException.class) - thrown.message == "Team already exist." - } -} From a02ebbdf8c0ae1b076e5b3c07501905c1cd14401 Mon Sep 17 00:00:00 2001 From: braintelligencePL Date: Fri, 12 Apr 2019 23:22:10 +0200 Subject: [PATCH 2/7] validation for project features completed --- .idea/markdown-exported-files.xml | 8 +++++ ...telligence.project-manager-kotlin.test.iml | 6 ++-- .../core/projects/domain/Feature.kt | 32 ------------------- .../core/projects/domain/PriorityLevel.kt | 11 ------- .../core/projects/domain/Project.kt | 9 ++++-- .../projects/domain/ProjectCreatorService.kt | 26 --------------- .../core/projects/domain/ProjectExceptions.kt | 10 ------ .../core/projects/domain/ProjectFactory.kt | 1 + .../projects/domain/ProjectQueryService.kt | 21 ------------ .../core/projects/domain/Status.kt | 8 ----- .../domain/configuration/TeamConfiguration.kt | 4 +-- .../ports/incoming/ProjectCreatorPort.kt | 4 +-- .../ports/incoming/ProjectQueryPort.kt | 1 + .../core/team/domain/Employee.kt | 2 +- .../core/team/domain/TeamFacade.kt | 4 +-- .../core/team/ports/incoming/TeamManager.kt | 4 +-- .../projectmanager/base/BaseDtoObjects.groovy | 14 ++++---- .../base/BaseIntegrationTest.groovy | 2 +- .../project/base/BaseProjectUnitTest.groovy | 3 +- .../domain/TeamMembersValidationTest.groovy | 2 +- 20 files changed, 40 insertions(+), 132 deletions(-) create mode 100644 .idea/markdown-exported-files.xml delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Feature.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/PriorityLevel.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectCreatorService.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectExceptions.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectQueryService.kt delete mode 100644 src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Status.kt diff --git a/.idea/markdown-exported-files.xml b/.idea/markdown-exported-files.xml new file mode 100644 index 0000000..5d1f129 --- /dev/null +++ b/.idea/markdown-exported-files.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml b/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml index 25819aa..a9ed74d 100644 --- a/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml +++ b/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml @@ -17,7 +17,7 @@