Kyoo/DIAGRAMS.md
2024-07-01 00:31:55 +07:00

8.8 KiB

Diagrams

Project Structure

Kyoo is a monorepo that consists of several projects each in their own directory. Diagram below shows an outline of kyoo, projects, and artifacts.

block-beta
  columns 1
  block:proj1:1
    proj_name["Kyoo"]:1
  end
  block:proj2:1
    dir_1["autosync/"]
    dir_2["back/"]
    dir_3["front/"]
    dir_4["transcoder/"]
    dir_5["scanner/"]
  end
  block:proj3:1
    %% columns auto (default)
    block:autosync_b:1
      autosync_i1("kyoo_autosync")
    end
    block:back_b:1
      columns 1
      back_i1("kyoo_back")
      back_i2("kyoo_migrations")
    end
    block:front_b:1
      front_i1("kyoo_front")
    end
    block:transcoder_b:1
      transcoder_i1("kyoo_transcoder")
    end
    block:scanner_b:1
      columns 1
      scanner_i1("kyoo_scanner")
      scanner_i2("kyoo_scanner*")
    end
  end

  style proj_name fill:transparent,stroke-width:0px
  style proj1 fill:#1168bd,stroke-width:0px
  style proj2 fill:#1168bd,stroke-width:0px
  style proj3 fill:#1168bd,stroke-width:0px
  
  style dir_1 fill:#438dd5,stroke-width:0px
  style dir_2 fill:#438dd5,stroke-width:0px
  style dir_3 fill:#438dd5,stroke-width:0px
  style dir_4 fill:#438dd5,stroke-width:0px
  style dir_5 fill:#438dd5,stroke-width:0px

  style autosync_b fill:#438dd5,stroke-width:0px
  style back_b fill:#438dd5,stroke-width:0px
  style front_b fill:#438dd5,stroke-width:0px
  style transcoder_b fill:#438dd5,stroke-width:0px
  style scanner_b fill:#438dd5,stroke-width:0px

  style autosync_i1 fill:#85bbf0,stroke-width:0px
  style back_i1 fill:#85bbf0,stroke-width:0px
  style back_i2 fill:#85bbf0,stroke-width:0px
  style front_i1 fill:#85bbf0,stroke-width:0px
  style transcoder_i1 fill:#85bbf0,stroke-width:0px
  style scanner_i1 fill:#85bbf0,stroke-width:0px
  style scanner_i2 fill:#85bbf0,stroke-width:0px

C4 Diagrams

Diagrams that focus on capturing project from a high level point of view. Context, Container, Component, Code

Context

    C4Context

      title Context diagram for Kyoo System
      Person(user, "User")

      System(kyoo, "Kyoo", "")
      System_Ext(media, "MediaLibrary", "")
      System_Ext(content, "ContentDatabase", "")
      System_Ext(tracker, "ActivityTracker", "")

      Rel(user, kyoo, "")
      Rel(kyoo, content, "")
      Rel(kyoo, media, "")
      Rel(kyoo, tracker, "")
    UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="2")

Container

Messaging is middleware. EnterpriseMessageBus is for any messaging handled between different projects.

  C4Container
  UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")
  title Container diagram for Kyoo System
    Person(user, "User")

    System_Boundary(internal, "Kyoo") {
      Container(frontend, "front/")
      Container(backend, "back/")
      Container(transcoder, "transcoder/")

      Container(autosync, "autosync/")
      ContainerQueue(emb, "emb", "", "EnterpriseMessageBus")
      Container(scanner, "scanner/")        
    }

    System_Boundary(external, "External") {
      System_Ext(tracker, "ActivityTracker", "")
      System_Ext(media, "MediaLibrary", "")
      System_Ext(content, "ContentDatabase", "")
      
    }

    Rel(user, frontend, "")
    Rel(user, backend, "")
    Rel(frontend, backend, "")
    Rel(backend, emb, "")
    Rel(backend, media, "")
    Rel(backend, transcoder, "")
    Rel_Back(autosync, emb, "")
    Rel(autosync, tracker, "")
    Rel_Back(scanner, emb, "")
    Rel(scanner, backend, "")
    Rel(scanner, media, "")
    Rel(scanner, content, "")
    Rel(transcoder, media, "")

Component

Component

Autosync

  C4Component
  title Component Diagram
  UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2")
  
  Container_Boundary(autosync, "autosync") {
    Component(autosync_c1, "kyoo_autosync", "python, python3.12", "")
  }

  Container_Boundary(emb, "emb") {
    ComponentQueue(emb_q1, "autosync", "RabbitMQ, Queue", "")
    ComponentQueue(emb_e1, "events.watched", "RabbitMQ, Exchange", "")
    
  }

  Container_Boundary(tracker, "ActivityTracker") {
    Component_Ext(tracker_c1, "TrackerProvider", "API", "simkl")
  }

  Container_Boundary(backend, "back") {
    Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend")
  }

  Rel(emb_e1, emb_q1, "bound")
  Rel(autosync_c1, emb_q1, "consumes")
  Rel(backend_c2, emb_e1, "produces")
  Rel(autosync_c1, tracker_c1, "updates")

Scanner

  C4Component
  title Component Diagram
  UpdateLayoutConfig($c4ShapeInRow="1", $c4BoundaryInRow="3")

  Container_Boundary(media, "MediaLibrary") {
    Component_Ext(media_c1, "MediaShare", "Volume", "Read Only")
  }

  Container_Boundary(scanner, "scanner") {
    Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner")
    ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "")
    Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher")
    
    
  }

  Container_Boundary(emb, "emb") {
    ComponentQueue(emb_q2, "scanner.rescan", "RabbitMQ, Queue", "")
  }




  Container_Boundary(content, "ContentDatabase") {
    Component_Ext(content_c1, "ContentProvider", "API", "tmdb or tvdb")
  }
  Container_Boundary(backend, "back") {
    Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend")
  }


  Rel(scanner_c1, scanner_q1, "produces")
  Rel(scanner_c1, media_c1, "watches")
  Rel(scanner_c2, content_c1, "Fetch media data")
  Rel(scanner_c2, backend_c2, "Pushes media data")
  Rel(scanner_c2, scanner_q1, "consumes")
  Rel(scanner_c2, emb_q2, "consumes")
  Rel(backend_c2, emb_q2, "produces")

OLD

Ideally this would be per component drill down, instead of global

    C4Component

      title Component diagram for Kyoo
      UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2")

      Person(user, "User")

      System_Boundary(s1, "Kyoo") {

        Container_Boundary(backend, "backend") {
          ComponentDb(backend_db2, "search", "Meilisearch", "search resource")
          Component(backend_c2, "kyoo_back", "C#, .NET 8.0", "API Backend")
          Component(backend_c3, "BackendMetadata", "Volume", "Persistent. Distributed Metadata")
          Component(backend_c1, "kyoo_migrations", "C#, .NET 8.0", "Postgres Migration")
          ComponentDb(backend_db1, "backend", "Postgres", "user data and session state")
        }

        Container_Boundary(frontend, "frontend") {
          Component(frontend_c1, "kyoo_front", "typescript, node.js", "Static Content")
        }

        Container_Boundary(sharem, "sharemessage") {
          ComponentQueue(sharem_e1, "events.watched", "RabbitMQ, Exchange", "")
          ComponentQueue(sharem_e2, "events.resource", "RabbitMQ, Exchange", "")
          ComponentQueue(sharem_q1, "autosync", "RabbitMQ, Queue", "")
          ComponentQueue(sharem_q2, "scanner.rescan", "RabbitMQ, Queue", "")
        }

        Container_Boundary(autosync, "autosync") {
          Component(autosync_c1, "kyoo_autosync", "python, python3.12", "")
        }

        Container_Boundary(scanner, "scanner") {
          Component(scanner_c2, "kyoo_scanner", "python, python3.12", "matcher")
          Component(scanner_c1, "kyoo_scanner", "python, python3.12", "scanner")
          ComponentQueue(scanner_q1, "scanner", "RabbitMQ, Queue", "")
        }

        Container_Boundary(transcoder, "transcoder") {
          Component(transcoder_c1, "kyoo_transcoder", "go, go", "Video Transcoder")
          Component(transcoder_c2, "TranscodeMetadata", "Volume", "Persistent. Distributed Metadata")
          Component(transcoder_c3, "TranscodeCache", "Volume", "Volatile. Local cache")
        }


      }
  
  Container_Boundary(media, "MediaLibrary") {
    Component_Ext(media_c1, "MediaShare", "Volume", "Read Only")
  }

  Container_Boundary(content, "ContentDatabase") {
    Component_Ext(content_c1, "ContentProvider", "API", "tmdb or tvdb")
  }

  Container_Boundary(tracker, "ActivityTracker") {
    Component_Ext(tracker_c1, "TrackerProvider", "API", "simkl")
  }

  Rel(user, frontend_c1, "")
  Rel(user, backend_c2, "")

  Rel(backend_c1, backend_db1, "Managed schema")
  Rel(backend_c2, backend_db1, "")
  Rel(backend_c2, backend_db2, "")
  Rel(backend_c2, sharem_q2, "produces")
  Rel(backend_c2, sharem_e1, "produces")
  Rel(backend_c2, sharem_e2, "produces")
  Rel(backend_c2, backend_c3, "")
  Rel(backend_c2, media_c1, "")
  Rel(backend_c2, transcoder_c1, "")

  Rel(autosync_c1, tracker_c1, "")
  Rel(autosync_c1, sharem_q1, "consumes")

  Rel(frontend_c1, backend_c2, "")

  Rel(scanner_c1, scanner_q1, "produces")
  Rel(scanner_c2, content_c1, "Fetch media metadata")
  Rel(scanner_c2, backend_c2, "Pushes media metadata")
  Rel(scanner_c2, scanner_q1, "consumes")
  Rel(scanner_c2, sharem_q2, "consumes")
  Rel(scanner_c1, media_c1, "")

  Rel(transcoder_c1, media_c1, "")
  Rel(transcoder_c1, transcoder_c2, "")
  Rel(transcoder_c1, transcoder_c3, "")

  Rel(sharem_e1, sharem_q1, "bound")

  BiRel(backend_c2, scanner_c1, "Request/Push media metadata")