@startuml domain-layer skinparam classAttributeIconSize 0 skinparam nodesep 20 skinparam ranksep 30 skinparam defaultFontSize 9 skinparam wrapWidth 150 scale 2000 width package "domain" #DDFFDD { class Task <> { -id: TaskId -name: TaskName -description: Description -scripts: Map +create(): Task +setScript(script) +canVerify(): boolean } class TaskId <> class TaskName <> class Description <> class Script <> { +isExecutable(): boolean } enum ScriptType { INITIALIZATION VERIFICATION DELETION } interface TaskRepository <> { +findByContextId(uuid): Optional +save(task): Task } interface ScriptExecutor <> { +runVerificationScript(id, script): boolean } interface LMSGateway <> { +exchangeForAccessToken(clientId): String } interface HistoryRepository <> { +logAction(deployId, contextId, type, msg) } } Task *-- TaskId Task *-- TaskName Task *-- Description Task *-- Script Script -- ScriptType TaskRepository ..> Task Task <.down... "TaskServiceImpl\n(application)" : uses TaskRepository <|.down.... "TaskRepositoryAdapter\n(infrastructure)" : implements ScriptExecutor <|.down.... "BashScriptAdapter\n(infrastructure)" : implements LMSGateway <|.down.... "LMSRestAdapter\n(infrastructure)" : implements HistoryRepository <|.down.... "HistoryJpaAdapter\n(infrastructure)" : implements @enduml