@startuml

skinparam sequenceArrowThickness 2
skinparam roundcorner 20
skinparam maxmessagesize 150
skinparam sequenceParticipant underline

actor "Unregistered user" as Actor
participant ": US001RegisterAppUserUI" as UI
participant ": US001RegisterAppUserController" as controller
participant ": UserService" as service
participant " : RegisterAppUserDTO" as dto
participant " : UserStore" as store
participant " : Request" as request

autonumber


/'Diagram'/
Actor -> UI : Types requested data
activate Actor
activate UI

UI -> controller : registerAsApplicationUser(RegisterAppUserDTO userDTO)
activate controller

controller -> service : registerAndSaveUser(RegisterAppUserDTO userDTO)
activate service

service -> dto : getEmail()
activate dto
dto --> service : email
deactivate dto
service -> store: existsByEmail(String email)
activate store
store --> service : true
deactivate store

ref over service : unwrap userDTO

service -> user ** : createUser(String email, String password, String passwordConfirmation, String name, String function, String photo)
activate user
ref over user : createUser

user --> service : user
deactivate user


service -> store : saveUserInStore(User user)
activate store
deactivate store

service -> request ** : sendRequest(String emailSender, String message)
activate request
service <-- request : true
deactivate request


service -> controller : userDTO
deactivate service

controller --> UI : newUserDTO
deactivate controller

UI --> Actor : Informs operation success
deactivate UI
deactivate Actor

@enduml