@startuml
'http://plantuml.com/skinparam.html
skinparam handwritten true
skinparam monochrome true
skinparam packageStyle rect
skinparam defaultFontName FG Virgil
skinparam shadowing false

actor User as Actor
participant HttpServerAjax as Server <<http server>>
participant CreatePostItController as Controller <<application>>
participant SessionManager as SM
participant PostItService as Service <<service>>
participant PostItFactory as PFactory <<factory>>
participant PostIt as Domain <<domain>>
database PostItRepository as Repository <<repository>>
database BoardRepository as RepositoryB <<repository>>


Actor --> Server: Create Post-It
activate Server
    Server -> Controller: create()
    Server -> SM: create()

    Server --> Actor: Ask post-it information
    Actor --> Server: PostItContent, PostItRow, PostItColumn, BoardId


    Server -> SM: getUserByToken(token)
    activate SM
    SM -> Server: authUser
    deactivate SM
        
    Server -> Controller: createPostIt(postItContent, postItRow,\npostItColumn, boardId, authUser)
    activate Controller


    Controller -> Service: create()
    note right: dependency injection was abastracted\nfor diagram readability

    Controller -> Service: createPostIt(postItContent, postItRow,\npostItColumn, boardId, authUser)
    activate Service

        Service -> RepositoryB: ofIdentity(boardId)
        activate RepositoryB
        RepositoryB -> Service: board
        deactivate RepositoryB

        Service -> Service: checkIfIsRowEntryTitle(postItRow, board)
        Service -> Service: checkIfIsColumnEntryTitle(postItColumn, board)
        Service -> Service: postItByPosition(postItRow, postItColumn, board)
        Service -> Service: board.userHasPermission(postItOwner, AccessLevelType.WRITE)


        Service -> PFactory: create()
        Service -> PFactory: create(postItContent, postItRow, postItColumn, postItOwner, board)
        activate PFactory

        PFactory -> Domain: PostIt(postItContent, postItRow, postItColumn, postItOwner, board)
        activate Domain
            Domain -> PFactory: postIt
        deactivate Domain
            PFactory -> Service: postIt
        deactivate PFactory


        Service -> Repository: save(postIt)
        activate Repository
        Repository -> Service: postIt
        deactivate Repository

        Service -> Controller: postIt
        deactivate Service
        Controller -> Server: postIt
        deactivate Controller

        Server --> Actor: displayPostItCreated

deactivate Server
@enduml