@startuml

skinparam sequenceMessageAlign center
title TO START THE NEXT SPRINT OF A PROJECT IN THE WEB UI
legend top
US031 - As Project Manager, I want to start the next sprint of a project in the web UI.
end legend


class SprintWebController {
- sprintStatusChangeService
+ changeStatus(sprintStatusChangeDto)
}

class SprintStatusChangeService {
- iSprintRepository
+ changeStatus(sprintStatusChangeDto)
- openSprint(sprint)
}

interface ISprintRepository {
+ findById(sprintId)
+ existsByStatus(sprintStatus)
}


class SprintRepositoryJpa {
- iSprintJpaRepository
- sprintDomainDataAssembler
+ findById(sprintId)
+ existsByStatus(sprintStatus)
}

interface ISprintJpaRepository {
+ findById(id)
+ existsByStatus(status)
}

interface ISprintFactory{
+ createSprint(projectCode, sprintId, sprintNumber, period)
}

class SprintFactory{
+ createSprint(projectCode, sprintId, sprintNumber, period)
}

class Sprint {
- sprintId
- status
+ changeStatus(status)
+ getStatus()
}

class SprintJpa {
- sprintId
- status
}

class SprintDomainDataAssembler{
- factory
+ toData(sprint)
+ toDomain(sprintJpa)
}

class SprintStatusChangeDto {
+ sprintId
+ status
}

interface CrudRepository {
+ findById(id)
}


SprintWebController ..> SprintStatusChangeDto: uses
SprintWebController <.. SprintStatusChangeService: is injected
SprintStatusChangeService <.. ISprintRepository: is injected
SprintStatusChangeService ..> SprintStatusChangeDto: uses
ISprintRepository <|.. SprintRepositoryJpa: implements
SprintRepositoryJpa <.. ISprintJpaRepository: is injected
ISprintJpaRepository <|-- CrudRepository: extends
SprintRepositoryJpa <.. SprintDomainDataAssembler: is injected
SprintDomainDataAssembler ..> SprintJpa: creates
SprintDomainDataAssembler <.. ISprintFactory: is injected
ISprintFactory <|.. SprintFactory: implements
SprintFactory ..> Sprint: creates
SprintRepositoryJpa "1"--> "*"SprintJpa: has






@enduml