workspace "product-configurators" { model { implementationUser = person "ImplementationUser" "The User responsible to configure the system" productConfig = softwareSystem "1-Product Configurator" "The product configurator is the top level system that will help us to configure the product all the essential capabilities of the configurator will be part of the product configurator" "system" { !docs docs configUI = container productConfigurationManagementUI "The user interface for the product configurator use to configure the overall product." "React" "REACT" { workspaceManagement = component "workspaceManagement" "This Component is responsible for configuration of a page." ruleConfigUI = component "Rule Management" "This Component is responsible for managing the rules defined in the workspace" moduleConfigUI = component "Module Management" "this UI component is responsible for managing different Modules" flowConfigurator = component "Flow Management" "this UI component is responsible for defining and configuring the workflow" pageConfigUI = component "pageConfigUI" "This Component is responsible to managing a workspace." referenceDataProvider = component "referenceDataProvider" "This module will be responsible for providing the reference data to different configurations" workspaceManagement -> referenceDataProvider "fetches data From" ruleConfigUI -> referenceDataProvider "fetches data From" moduleConfigUI -> referenceDataProvider "fetches data From" flowConfigurator -> referenceDataProvider "fetches data From" } configService = container configurationManagementService "this service will be responsible to manage the configuration of a Product, Module, workspace and execution environment" "NodeJS" "NODE_SERVICE" { configServiceRestPort = component "Rest Controller port" "This is the component exposing the REST endpoints for the managing the configurations" DSLInterpreter = component "DSL Interpreter" "This is the grammar parser for the DSLs" configManager = component "Config Manager" "This component is responsible for managing the configurations saved by the user" audit = component "Audit capability" "This component will be responsible for handling and managing the audit events" configServiceRestPort -> configManager "calls" configManager -> DSLInterpreter "calls" audit -> configManager "observes" } productCofigDB = container productConfigDataBase "Postgres relational database to store the configurations and product, all the masters and configuration data should be stored" "PostgresDB" "RELATIONAL" configStore = container productConfigurationStore "mongo database storing the configurations JSON for the modules." "MongoDB" "NOSQL" configUI -> configService "calls" "REST: HTTP/JSON" "REST" configService -> productCofigDB "writes to/reads from" "Connection Pool" "DATA" configService -> configStore "writes to/reads from" "Connection Pool" "DATA" ### component interactions ruleConfigUI -> configServiceRestPort "calls" "HTTP/JSON" "REST" pageConfigUI -> configServiceRestPort "calls" "HTTP/JSON" "REST" workspaceManagement -> configServiceRestPort "calls" "HTTP/JSON" "REST" moduleConfigUI -> configServiceRestPort "calls" "HTTP/JSON" "REST" flowConfigurator -> configServiceRestPort "calls" "HTTP/JSON" "REST" configManager -> productCofigDB "writes to/reads from" "Connection Pool" "DATA" configManager -> configStore "writes to/reads from" "Connection Pool" "DATA" } uiConfig = softwareSystem "2. UI Configurator" "UI Configurator is used to configure and render the User interface" "system"{ !docs docs/ui-configurator } workflowConfig = softwareSystem "3. Workflow Engine" "Workflow configurator will be used to configure a fresh workflow for a product" "system"{ !docs docs/workflow-Engine } dialect = softwareSystem "4. Dialect" { !docs docs/dialect } ruleConfigurator = softwareSystem "5. Rule Designer" "Rule designer will be used to configure the rules independently for a product" "system"{ !docs docs/rule-designer } moduleConfigurator = softwareSystem "6. Module Configurator" "Module configurator are used to configure the modules for a product like KYC, Amort, etc." "system"{ // !docs docs/module-configurator } implementationUser -> configUI "interacts with" } views { systemLandscape { include productConfig implementationUser autoLayout } systemContext "productConfig" { include * autoLayout } container "productConfig" { include * autoLayout } component "configUI" { include * autoLayout } component "configService" { include * autoLayout } // Dynamic flows for separate CRUD operations on Module Configuration dynamic productConfig "createModuleConfig" "Create Module Configuration" { description "This flow represents the creation of a module configuration, including all validations in a single API call." // Step 1: Validation and Creation configUI -> configService "Sends module configuration data using POST /module-config" // Internal Validations configService -> productCofigDB "Validates tenant-product offering (e.g., LMS assignment)" configService -> productCofigDB "Checks if the module and version is unique for the product offering" configService -> productCofigDB "Validates configuration JSON against schema" configService -> productCofigDB "Validates tenant status and product offering expiry" // Step 2: Persist Data configService -> productCofigDB "Stores module metadata (name, version, tenant details)" configService -> configStore "Stores module configuration JSON into Mongodb" configService -> configUI "Sends the success response" } dynamic productConfig "viewModuleConfig" "Read Module Configuration" { description "This flow represents the retrieval of a module configuration" // Step 1: Validation and Read configUI -> configService "Requests module configuration details using" // Step 2: Fetch Data configService -> productCofigDB "Fetches module metadata (name, version)" configService -> configStore "Fetches module configuration JSON" configService -> configUI "Sends the response with the module configuration" autoLayout } dynamic productConfig "updateModuleConfig" "Update Module Configuration" { description "This flow represents the update of a module configuration with validations" // Step 1: Validation and Update configUI -> configService "Sends updated module configuration data" // Internal Validations configService -> productCofigDB "Validates module existence and tenant-product offering link" configService -> productCofigDB "Checks if the new version is valid" configService -> configStore "Validates updated configuration JSON against schema" configService -> productCofigDB "Validates tenant status and active product offering" // Step 2: Update Data configService -> productCofigDB "Updates module metadata (name, version), also marks old row inactive and add new version" configService -> configStore "Updates module configuration JSON" configService -> configUI "Sends the success response" autoLayout } dynamic productConfig "deleteModuleConfig" "Delete Module Configuration" { description "This flow represents the deletion of a module configuration" // Step 1: Validation and Deletion configUI -> configService "Requests deletion of module configuration" // Internal Validations configService -> productCofigDB "Validates module existence" configService -> productCofigDB "Validates module is not in active use (workflows or execution environments)" // Step 2: Delete Data configService -> productCofigDB "Deletes module metadata (name, version)" configService -> configStore "Deletes module configuration JSON" configService -> configUI "Sends the success response" autoLayout } styles { element "Element" { color #ffffff } element "Person" { background #741eba shape person } element "Software System" { background #8723d9 } element "Container" { background #9a28f8 } element "Component" { background #9a28f8 stroke #ECE5F2 color #ECE5F2 shape component } element "RELDB" { shape cylinder background #9a28f8 } element "REACT" { shape webbrowser icon "data:image/png;base64,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" color #7466DD background #E0D6E8 } element "NODE_SERVICE" { shape hexagon color #7466DD background #E0D6E8 } element RELATIONAL { shape cylinder color #7466DD background #E0D6E8 } element NOSQL { shape cylinder icon "data:image/png;base64,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" color #7466DD background #E0D6E8 } relationship REST { color #000000 dashed false } relationship DATA { color #28189E dashed false } } } }