@startuml LTI Provider ' Настройка для A4 портретной ориентации с ГОСТ отступами (3см слева) skinparam dpi 150 skinparam defaultFontSize 10 skinparam class { BackgroundColor<> LightBlue BackgroundColor<> LightGreen BackgroundColor<> Wheat BackgroundColor<> LightSalmon FontSize 10 } skinparam packageStyle rectangle skinparam linetype polyline ' Слой Controllers - верх по центру package "Controller Layer" { class LaunchController <> { + login() + redirect() } class TaskController <> { + getTask() + updateTask() + submitTask() } } ' Левая колонка - Service/Repository/Infrastructure package "Service Layer" { class TaskServiceImpl <> { + getTask(UUID): TaskData + saveTask(RequestUpdateTask) + checkTask(ResultRequest) } class JwtService <> { + getPayload(jwt): Payload + getTokenPayload(jwt): IdTokenPayload } class HistoryService <> { + logEvent() + logAction() } } package "Repository Layer" { interface LMSContentRepository { + getLMSContentByContentUuid() } interface HistoryRepository { + findByContentUuid() + findByDeploymentId() } } package "Infrastructure Layer" { class LMSService <> { + ltiAuth() + exchangeForAccessToken() } class Runner <> { + run(userId, script) + check(userId, script) } } ' Правая колонка - Entity/Domain package "Entity Layer" { class LMSContent <> { - id: long - contentUuid: UUID - deploymentId: UUID - task: Task } class Task <> { - id: long - name: String - description: String - initScript: String - verificationScript: String - deleteScript: String } class History <> { - id: long - contentUuid: UUID - message: String } } package "Domain Models" { class TaskData { - name: String - description: String - initScript: String - verificationScript: String - deleteScript: String } } ' Вертикальное выравнивание левой колонки "Controller Layer" -[hidden]down- "Service Layer" "Service Layer" -[hidden]down- "Repository Layer" "Repository Layer" -[hidden]down- "Infrastructure Layer" ' Вертикальное выравнивание правой колонки "Entity Layer" -[hidden]down- "Domain Models" ' Горизонтальное расположение колонок "Service Layer" -[hidden]right- "Entity Layer" "Repository Layer" -[hidden]right- "Entity Layer" "Infrastructure Layer" -[hidden]right- "Domain Models" ' Связи Controllers -> Services LaunchController --> JwtService LaunchController --> LMSService LaunchController --> HistoryService TaskController --> TaskServiceImpl TaskController --> HistoryService ' Связи Services -> Infrastructure/Repository TaskServiceImpl --> LMSContentRepository TaskServiceImpl --> Runner TaskServiceImpl --> LMSService TaskServiceImpl --> HistoryService TaskServiceImpl ..> TaskData Runner --> HistoryService ' Связи Repository -> Entity LMSContentRepository ..> LMSContent HistoryRepository ..> History ' Связи Entity LMSContent "*" --> "1" Task @enduml