@startuml "User and Course Aggregates"

hide methods

skinparam classAttributeIconSize 0

skinparam class {
    LifeLineBorderColor DodgerBlue
    LifeLineBackgroundColor APPLICATION
    BackgroundColor #D8F5FF
    ArrowColor DodgerBlue
    BorderColor DodgerBlue
}

skinparam packageStyle rectangle
skinparam card {
    LifeLineBorderColor DodgerBlue
    LifeLineBackgroundColor APPLICATION
    BackgroundColor #D8F5FF
    ArrowColor DodgerBlue
    BorderColor DodgerBlue
}


package UserAggregate{
    entity User <<entity>><<root>>
    entity Student <<entity>>
    'Student value objects
    card BirthDate <<Value Object>>{
    }
    card TaxPayerNumber <<Value Object>>{
    }
    card MechanographicNumber <<Value Object>>{
    }
    Student -- BirthDate
    Student -- TaxPayerNumber
    Student -- MechanographicNumber

    entity Teacher <<entity>>
    'Teacher value objects
    card Acronym <<Value Object>>{
    }
    Teacher -- BirthDate
    Teacher -- TaxPayerNumber
    Teacher -- Acronym

    entity Manager <<entity>>


'User value objects
    card Email <<Value Object>>{
    }
    card Password <<Value Object>>{
    }
    card FullName <<Value Object>>{
    }
    card ShortName <<Value Object>>{
    }
    card Role <<Value Object>>{
    }

    User -- Email
    User -- Password
    User -- FullName
    User -- ShortName
    User -- Role

    Student --|> User
    Teacher --|> User
    Manager --|> User

    note left of Role
         Can be one of the following:
            - Manager
            - Teacher
            - Student
    end note

}

package CourseAggregate{
    entity Course <<entity>><<root>>

    'Course value objects
    card Code <<Value Object>> {
    }
    card Name <<Value Object>>{
    }
    card State <<Value Object>>{
    }
    card Description <<Value Object>>{
    }
    card Limit <<Value Object>>{
    }


    Course -- Name
    Course -- State
    Course -- Description
    Course -- Limit
    Course -- Code

    note right of State
        Can be one of the following:
            - Open
            - Closed
    end note

    note left of Limit
        Each course as a lower
        and higher limit
        number of students
    end note

    note right of Code
        Each course has a unique code
        Example: "JAVA-1"
    end note
}

package EditionAggregate{
    entity Edition <<entity>>

    'Edition value objects
    card Year <<Value Object>>{
    }
    card Semester <<Value Object>>{
    }

    Edition -- Year
    Edition -- Semester

    note left
     Still waiting for the client answer
     since Edition is a concept that needs
     to be further specified.
    end note
}

    User --> Course
    Course --> Edition

@enduml