@startuml

class US017ListOfProjectsAllocatedUI{

}

class US017ListOfProjectsAllocatedController {
+whichProjectsImAllocated(email)
}

class Company {
+getProjectStore()
}

class User {
-String email
}

class ProjectStore {
+getProjectByEmail(String email)
}

class Project {
+isPMEmail(String email)
+isPOEmail(String email)
+isSMEmail(String email)
+isProjectTeamEmail(String email)
+hasSprintsInList(String email)
+getSprintList(String email)
}

class ProductOwner {
+hasEmail(String email)
}

class ProjectManager {
+hasEmail(String email)
}

class ScrumMaster {
+hasEmail(String email)
}

class ProjectTeamList {
+getProjectTeamMember(String email)
+isEmailProjectMember(String email)
}

class ProjectMember {
+hasEmail(String email}
}

class SprintList {
+hasSprints()
+getLastSprint()
}

class Sprint {
+isPMEmail(String email)
+isPOEmail(String email)
+isSMEmail(String email)
+isProjectTeamEmail(String email)
}

US017ListOfProjectsAllocatedUI " " .> " " US017ListOfProjectsAllocatedController
US017ListOfProjectsAllocatedController " " ..> " " Company
US017ListOfProjectsAllocatedController " " ..> " " ProjectStore
Company " " o-> "  1" ProjectStore
ProjectStore " " *--> "    0..*" Project

ProductOwner " 0..* "--> "1 " User
ProjectManager " 0..*  " --> "1 " User
ScrumMaster " 0..*" --> "1 " User
ProjectMember "0..*     " -> "1 " User

Project " " o--> "0..1  " ProductOwner
Sprint " " o--> "  1" ProductOwner
Project " " o--> "0..1" ProjectManager
Sprint " " o--> "1  " ProjectManager
Project " " o--> "0..1  " ProjectTeamList
ProjectTeamList " " *--> "  0..*" ProjectMember
Sprint " " o--> "1" ProjectTeamList
Project " " o-> "0..1     " ScrumMaster
Sprint " " o--> "    1" ScrumMaster

SprintList" " *--> "1..* " Sprint
Project " " o--> "1 " SprintList

@enduml

@startuml
skinparam sequenceArrowThickness 2
skinparam roundcorner 20
skinparam maxmessagesize 60
skinparam sequenceParticipant underline

actor AuthenticatedUser
participant ": US017ListOfProjectsAllocatedUI" as A
participant ": US017ListOfProjectsAllocatedController" as B
participant ": Company" as C
participant "projList : ProjectStore" as D
participant "proj : Project" as E
participant "sl : SprintList" as F
participant "sp : Sprint" as G
participant ": myProjList" as Z

activate AuthenticatedUser
AuthenticatedUser -> A : types requested data
activate A

A -> B : 1 whichProjectsImAllocated(String email)
activate B

B -> C : 2 projList = getProjectStore()
activate C
deactivate C

B -> D : 4 getProjectByEmail(String email)
activate D
D -> Z : 3 myProjList = new ArrayList<>()
activate Z

loop verifies if user is allocated in each project in project store
alt hasSprints true
D -> E : hasSprintsInList
activate E

deactivate F
E --> D : true
deactivate E

D -> E : spl = getSprintList()
activate E
deactivate E

D -> F : sp = getLastSprint()
activate F
deactivate F

D -> G : isPMEmail(String email)
activate G
G --> D : true
deactivate G

D -> G : isPOEmail
activate G
G --> D : false
deactivate G

D -> G : isSMEmail
activate G
G --> D : false
deactivate G

D -> G : isProjectTeamEmail
activate G
G --> D : false
deactivate G

D -> Z : add(proj)
activate Z
deactivate Z

else hasSprints False
D -> E : hasSprintsInList
activate E
E --> D : true
deactivate E

D -> E : isPOEmail
activate E
E --> D : false
deactivate E

D -> E : isPMEmail
activate E
E --> D : false
deactivate E

D -> E : isSMEmail
activate E
E --> D : true
deactivate E

D -> E : isProjectTeamEmail
activate E
E --> D : false
deactivate E

D -> Z : add(proj)
activate Z
deactivate Z
end
end

Z --> D : myProjList
deactivate Z
D --> B : myProjList
deactivate D
B --> A : myProjList
deactivate B
A --> AuthenticatedUser : shows myProjList
@enduml