@startuml contexto
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
AddRelTag("async", $lineStyle = DashedLine())
SHOW_PERSON_PORTRAIT()

title "Codeflix: Projeto Prático do Curso Full Cycle"
Person(administrador_catalogo,"Administrador do catálogo de vídeos","Gerencia os vídeos do catálogo e suas categorias")
Person(administrador_assinantes,"Administrador dos assinantes","Gerencia os assinantes do sistema, bem como os planos de assinatura")
Person(assinante,"Assinante da plataforma","Assina a plataforma para ter acesso aos vídeos")

System_Boundary(gateway, "Codeflix") {
    Container(frontend_catalogo_admin,"Frontend: Admin do Catálogo de Vídeos","React","SPA que gerencia os vídeos, incluindo as categorias e gêneros")
    Container(backend_catalogo_admin,"Backend: Admin do Catálogo de Vídeos","Linguagem livre","Gerencia o catálogo de vídeos, incluindo as categorias e gêneros")
    Container(backend_catalogo_admin_database,"Database Admin do Catálogo de Vídeos","MySQL","Armazena dados do catálogo de vídeos")
    Rel(frontend_catalogo_admin,backend_catalogo_admin,"Interage com via","HTTPS/JSON")
    Rel(backend_catalogo_admin,backend_catalogo_admin_database,"Interage com usando","TCP")

    Container(encoder,"Encoder de vídeos","Go","Realiza o encoding dos vídeos para mpeg-dash")
    Container(bucket_videos,"Bucket de armazenamento de vídeos encodados","GCP")
    Container(bucket_videos_raw,"Bucket de armazenamento de vídeos raw","GCP")
    Rel(encoder,bucket_videos,"Faz upload do vídeo convertido via","HTTPS")
    Rel(encoder,bucket_videos_raw,"Faz download do vídeo raw via","HTTPS")
    Rel(backend_catalogo_admin,bucket_videos_raw,"Faz upload do vídeo raw via","HTTPS")

    Rel(encoder,backend_catalogo_admin,"Consome dados do vídeo recém-criado via","RabbitMQ Fila videos.new",$tags = "async")
    Rel(encoder, backend_catalogo_admin,"Publica que vídeo foi convertido via","RabbitMQ Fila videos.converted",$tags = "async")
    Rel(backend_catalogo_admin, encoder,"Consome dados do vídeo convertido via","RabbitMQ Fila videos.converted",$tags = "async")
    Rel(backend_catalogo_admin, encoder,"Publica que novo vídeo foi enviado para o bucket raw via","RabbitMQ Fila videos.new",$tags = "async")

    Container(frontend_catalogo,"Frontend do catálogo de vídeos","React","Disponibiliza a navegação e o playback dos vídeos para os assinantes")
    Container(api_catalogo,"API do Catálogo de Vídeos","Linguagem livre","Disponibiliza os endpoints para a navegação e playback dos vídeos")
    Container(elasticsearch_api_catalogo,"Database API do Catálogo","Elasticsearch","Armazena dados dos vídeos, gêneros, cast members e categorias")
    Container(apache_kafka,"Apache Kafka","Message Broker","Armazena e serve dados vindos do kafka Connect")
    Container(kafka_connect,"Kafka Connect","Integração de dados","Serviço de replicação de dados do catálogo")
    Rel(api_catalogo,elasticsearch_api_catalogo,"Interage com via","HTTPS/JSON")
    Rel(kafka_connect,elasticsearch_api_catalogo,"Envia dados do catálogo de vídeos via","Sink Elasticsearch",$tags = "async")
    Rel(kafka_connect,backend_catalogo_admin_database,"Copia dados usando connector","Debezium MySQL",$tags = "async")
    Rel(kafka_connect,apache_kafka,"Interage com via","Protocolo Kafka",$tags = "async")


    Container(assinatura,"Linguagem livre","Assinatura","Gerencia planos e assinaturas dos assinantes")
    Container(assinatura_postgres,"Database de Assinaturas","Postgres","Armazena dados dos assinantes e seus planos")
    Rel(assinatura,assinatura_postgres,"Interage com via","Protocolo Postgres")

    Container(keycloak,"Keycloak","Serviço de Identidade","Realiza a autenticação de todos usuários da plataforma")



    Rel(administrador_catalogo,frontend_catalogo_admin,"Interage com via","HTTPS")

    Rel(assinante,assinatura,"Interage com via","HTTPS")
    Rel(assinante,keycloak,"Interage com via","HTTPS")
    Rel(assinatura,keycloak,"Interage com via","HTTPS")

    Rel(frontend_catalogo_admin,keycloak,"Se autentica em","HTTPS")

    Rel(assinante,frontend_catalogo,"Interage com via","HTTPS")
    Rel(frontend_catalogo,api_catalogo,"Interage com via","HTTPS/JSON")

    Rel(administrador_assinantes,assinatura,"Interage com","HTTPS")
}
@enduml
