workspace extends ../common/moderation-common-model.dsl {
    name "Moderation score system"
    description "Moderatino score system is responsible for calculating moderation score for streamers from different resources"
    !identifiers hierarchical

    model {
        !extend streamSystem {
            streamDetail = container "Stream-detail" {
                tags "Google Cloud Platform - Kubernetes Engine" "notOwned"
                technology "Java"

                mainKafkaCluster.moderationScoreTopic -> this "Provide moderation scores" "Kafka"
                -> mainKafkaCluster.streamDetailTopic "Provide stream details" "Kafka"
            }

            stream = container "Stream" {
                tags "Google Cloud Platform - Kubernetes Engine" "notOwned"
                technology "Java"

                mainKafkaCluster.streamDetailTopic -> this "Get stream details" "Kafka"
                -> mainKafkaCluster.richFragmentTopic "Send rich fragment" "Kafka"
                viewer -> this "Start watch" "HTTPS"
            }
        }
    }

    views {

        systemLandscape "SystemLandscape" "Moderation score system landscape" {
            include *
            autoLayout
        }

        systemContext moderationSystem "moderationSystemContext" {
            include *
            autoLayout
        }

        container moderationSystem "moderationSystemContainer" {
            include *
            autoLayout
        }

        dynamic moderationSystem "calculate-moderation-score-flow" {
            title "Calculate moderation score flow"

            streamer -> streamSystem.streamSignaling
            streamSystem.streamSignaling -> mainKafkaCluster.streamSignalingStateTopic
            {
                {
                    mainKafkaCluster.streamSignalingStateTopic -> moderationSystem.moderationStream
                }
                {
                    mainKafkaCluster.streamSignalingStateTopic -> moderationSystem.moderationScoreService
                }
            }
            {
                {
                    moderationSystem.moderationStream -> mainKafkaCluster.streamHiveResultTopic
                }
                {
                    moderationSystem.moderation  -> mainKafkaCluster.moderationActionsTopic
                }
            }
            {
                {
                    mainKafkaCluster.streamHiveResultTopic -> moderationSystem.moderationScoreService
                }
                {
                    mainKafkaCluster.moderationActionsTopic  -> moderationSystem.moderationScoreService
                }
            }
            moderationSystem.moderationScoreService -> mainKafkaCluster.moderationScoreTopic
            mainKafkaCluster.moderationScoreTopic -> streamSystem.streamDetail
            streamSystem.streamDetail -> mainKafkaCluster.streamDetailTopic
            {
                {
                    mainKafkaCluster.streamDetailTopic -> streamSystem.stream
                }
                {
                    mainKafkaCluster.streamDetailTopic -> recommendationSystem.recommendator
                }
            }
            streamSystem.stream -> mainKafkaCluster.richFragmentTopic
            mainKafkaCluster.richFragmentTopic -> notificationSystem.richFragment
            {
                {
                    notificationSystem.richFragment -> viewer
                }
                {
                    viewer -> streamSystem.stream
                }
                {
                    viewer -> recommendationSystem.recommendator
                }
            }
        }
    }
}