├── README.md ├── docker-compose.yaml ├── themes └── practicalli │ └── theme.json ├── workspace.json ├── model ├── practicalli.dsl ├── practicalli-workspace.dsl ├── workspace.dsl └── workspace.json ├── workspace.dsl └── LICENSE /README.md: -------------------------------------------------------------------------------- 1 | # Practicalli Structurizr 2 | 3 | C4 Models for Practicalli and a theme to add Clojure specific elements. 4 | 5 | ## references 6 | 7 | * [Structurizr - Practicalli Engineering playbook](https://practical.li/engineering-playbook/architecture/structurizr/) 8 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | version: "3.9" 3 | 4 | services: 5 | # --- Fraud Service --- # 6 | structurizr: 7 | container_name: system-architecture-structurizr 8 | image: "structurizr/lite:latest" 9 | ports: 10 | - "8080:8080" 11 | volumes: 12 | - "./model:/usr/local/structurizr:rw" 13 | -------------------------------------------------------------------------------- /themes/practicalli/theme.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "Practicalli theme", 3 | "elements" : [ { 4 | "tag" : "Clojure Service", 5 | "background" : "#8FB5FE", 6 | "color" : "#EEECE6", 7 | "stroke" : "#5881D8", 8 | "shape" : "RoundedBox", 9 | "icon" : "https://raw.githubusercontent.com/practicalli/graphic-design/live/logos/clojure-logo-64.png" 10 | } , { 11 | "tag" : "Database", 12 | "background" : "#EEECE6", 13 | "color" : "#3f51d4", 14 | "stroke" : "#3f51d4", 15 | "shape" : "Cylinder", 16 | "icon" : "https://static.structurizr.com/themes/amazon-web-services-2022.04.30/Arch_Amazon-RDS_48.png" 17 | } , { 18 | "tag" : "Web Browser", 19 | "shape" : "WebBrowser" 20 | } , { 21 | "tag" : "AWS SageMaker", 22 | "background" : "#EEECE6", 23 | "stroke" : "#2d8f7a", 24 | "color" : "#2d8f7a", 25 | "icon" : "https://static.structurizr.com/themes/amazon-web-services-2022.04.30/Arch_Amazon-SageMaker_48.png" 26 | } ] 27 | } 28 | 29 | -------------------------------------------------------------------------------- /workspace.json: -------------------------------------------------------------------------------- 1 | { 2 | "id" : 1, 3 | "name" : "Name", 4 | "description" : "Description", 5 | "lastModifiedDate" : "2023-01-10T16:33:07Z", 6 | "properties" : { 7 | "structurizr.dsl" : "d29ya3NwYWNlIHsKCiAgICBtb2RlbCB7CiAgICAgICAgdXNlciA9IHBlcnNvbiAiVXNlciIKICAgICAgICBzb2Z0d2FyZVN5c3RlbSA9IHNvZnR3YXJlU3lzdGVtICJTb2Z0d2FyZSBTeXN0ZW0iCgogICAgICAgIHVzZXIgLT4gc29mdHdhcmVTeXN0ZW0gIlVzZXMiCiAgICB9CgogICAgdmlld3MgewogICAgICAgIHN5c3RlbUNvbnRleHQgc29mdHdhcmVTeXN0ZW0gIkRpYWdyYW0xIiB7CiAgICAgICAgICAgIGluY2x1ZGUgKgogICAgICAgICAgICBhdXRvTGF5b3V0CiAgICAgICAgfQogICAgfQoKfQo=" 8 | }, 9 | "configuration" : { }, 10 | "model" : { 11 | "people" : [ { 12 | "id" : "1", 13 | "tags" : "Element,Person", 14 | "name" : "User", 15 | "relationships" : [ { 16 | "id" : "3", 17 | "tags" : "Relationship", 18 | "sourceId" : "1", 19 | "destinationId" : "2", 20 | "description" : "Uses" 21 | } ], 22 | "location" : "Unspecified" 23 | } ], 24 | "softwareSystems" : [ { 25 | "id" : "2", 26 | "tags" : "Element,Software System", 27 | "name" : "Software System", 28 | "location" : "Unspecified", 29 | "documentation" : { } 30 | } ] 31 | }, 32 | "documentation" : { }, 33 | "views" : { 34 | "systemContextViews" : [ { 35 | "softwareSystemId" : "2", 36 | "key" : "Diagram1", 37 | "order" : 1, 38 | "automaticLayout" : { 39 | "implementation" : "Graphviz", 40 | "rankDirection" : "TopBottom", 41 | "rankSeparation" : 300, 42 | "nodeSeparation" : 300, 43 | "edgeSeparation" : 0, 44 | "vertices" : false 45 | }, 46 | "enterpriseBoundaryVisible" : true, 47 | "elements" : [ { 48 | "id" : "1", 49 | "x" : 0, 50 | "y" : 0 51 | }, { 52 | "id" : "2", 53 | "x" : 0, 54 | "y" : 0 55 | } ], 56 | "relationships" : [ { 57 | "id" : "3" 58 | } ] 59 | } ], 60 | "configuration" : { 61 | "branding" : { }, 62 | "styles" : { }, 63 | "terminology" : { }, 64 | "lastSavedView" : "Diagram1" 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /model/practicalli.dsl: -------------------------------------------------------------------------------- 1 | 2 | 3 | !constant ORGANISATION_NAME "Practicalli" 4 | !constant GROUP_NAME "Fintech" 5 | 6 | workspace { 7 | 8 | model { 9 | practicalli = enterprise "${ORGANISATION_NAME} - ${GROUP_NAME}" { 10 | user = person "User" 11 | 12 | risk = softwareSystem "Risk" { 13 | shared_services = group "Shared Services Risk" { 14 | company_info = container "Company WhoIs" "Company search service" "Clojure API" 15 | company_info_database = container "Company WhoIs database" "" "Relational database schema" "Database" 16 | company_info_search = container "Company Search Aggregator" "Company full-text search index" "Elastic Search" "Elastic" 17 | risk_data_providers = container "Risk Data Providers" "Data Provider Service" "PHP Symphony service" 18 | risk_data_providers_database = container "Risk Data" "" "Relational database schema" "Database" 19 | } 20 | credit_risk = group "Credit Risk" { 21 | score = container "Credit risk scoring" "Scoring organizations Credit Risk" "Clojure Service" 22 | score_data = container "Credit Risk Scoring Service database" "" "Relational database schema" "DatabaseWip" 23 | assessment = container "Credit Assessment" "Credit risk assessment Service" "Clojure" 24 | } 25 | 26 | fraud_risk = group "Fraud Risk" { 27 | detection = container "Fraud Service" "Detect fraudulent transactions via Fraud Scoring Data Science models " "Clojure API" 28 | detection_data = container "Fraud Database" "TODO: Define the kind of data persisted" "Relational database schema" "Database" 29 | ml_model = container "AWS Sagemaker" "Machine learning model service" "" "Amazon Web Services - SageMaker" 30 | feature_store_data = container "Feature store" "Pre-calculated feature values" "Key value database" "Database" 31 | feature_schema_data = container "Feature mapping model/entity" "" "Key value database" "Database" 32 | manual_review = container "Review Transactions" "Manually review transactions for fraud" "" "WebBrowser" 33 | } 34 | } 35 | /* End of Risk Software System */ 36 | 37 | transaction = softwareSystem "Transaction" { 38 | guardian = container "Transaction Guardian" "Transaction monitoring and transaction Screening service" "Clojure" 39 | guardian_data = container "Transaction Guardian Database" "" "Relational database schema" "Database" 40 | limiter = container "Limiter" "Limits Service" "ClojureKafka" 41 | } 42 | 43 | } 44 | 45 | /* Define Relationships between components */ 46 | user -> transaction "Triggers" 47 | 48 | transaction -> risk "Uses" 49 | guardian -> guardian_data "Persists" 50 | guardian -> limiter "Uses" 51 | 52 | detection -> detection_data "Reads and writes to" 53 | detection -> ml_model "score transaction" 54 | ml_model -> feature_store_data "Collect features" 55 | ml_model -> feature_schema_data "Request feature set & model" 56 | 57 | 58 | } 59 | /* End of Enterprise */ 60 | 61 | 62 | production = deploymentEnvironment "Production" { 63 | aws = deploymentNode "Amazon Web Services" "" "" "Amazon Web Services - Cloud" { 64 | region = deploymentNode "US-East-1" "" "" "Amazon Web Services - Region" { 65 | route53 = infrastructureNode "Route 53" "" "" "Amazon Web Services - Route 53" 66 | elb = infrastructureNode "Elastic Load Balancer" "" "" "Amazon Web Services - Elastic Load Balancing" 67 | autoscalingGroup = deploymentNode "Autoscaling group" "" "" "Amazon Web Services - Auto Scaling" { 68 | ec2 = deploymentNode "Amazon EC2" "" "" "Amazon Web Services - EC2" { 69 | /* identity = type softwareSystem.container */ 70 | webApplicationInstance = containerInstance practicalli.risk.detection 71 | elb -> webApplicationInstance "Forwards requests to" "HTTPS" 72 | } 73 | } 74 | rds = deploymentNode "Amazon RDS" "" "" "Amazon Web Services - RDS" { 75 | mysql = deploymentNode "MySQL" "" "" "Amazon Web Services - RDS MySQL instance" { 76 | databaseInstance = containerInstance practicalli.risk.detection_data 77 | } 78 | } 79 | route53 -> elb "Forwards requests to" "HTTPS" 80 | } 81 | } 82 | } /* End Of Production Deployment Environment */ 83 | 84 | /* End of Model */ 85 | views { 86 | /* Overall system */ 87 | systemContext risk "EnterpriseView" "Practicalli Enterprise Application" { 88 | include * 89 | autoLayout 90 | } 91 | /* Entire Risk system */ 92 | container risk riskView "Complete Risk system" { 93 | include * 94 | autoLayout 95 | } 96 | /* View of shared_services group in risk system */ 97 | container risk sharedServicesView "Services shared across the organisation" { 98 | include shared_services 99 | autoLayout 100 | } 101 | /* View of fraud_risk group in risk system */ 102 | container risk fraudRiskView "Fraud Risk Services Only" { 103 | include fraud_risk 104 | autoLayout 105 | } 106 | /* View of credit_risk group in risk system */ 107 | container risk creditRiskView "Credit Risk Services only" { 108 | include credit_risk 109 | autoLayout 110 | } 111 | /* View of fraud & shared_services group without credit */ 112 | container risk fraudSharedView "Fraud and shared services" { 113 | include * 114 | exclude credit_risk 115 | autoLayout 116 | } 117 | container transaction transactionView "Current Transaction system" { 118 | include * 119 | autoLayout 120 | } 121 | 122 | /* Theme for views */ 123 | theme https://static.structurizr.com/themes/amazon-web-services-2022.04.30/theme.json 124 | 125 | branding { 126 | logo https://raw.githubusercontent.com/practicalli/graphic-design/live/logos/practicalli-logo.png 127 | } 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /model/practicalli-workspace.dsl: -------------------------------------------------------------------------------- 1 | /* 2 | Practicalli Architecture 3 | */ 4 | 5 | /* Constant values */ 6 | !constant ORGANISATION_NAME "Practicalli" 7 | !constant GROUP_NAME "Fintech" 8 | 9 | workspace "Workspace name" "Wokspace title"{ 10 | 11 | model { 12 | practicalli = enterprise "${ORGANISATION_NAME} - ${GROUP_NAME}" { 13 | 14 | user = person "User" 15 | 16 | risk = softwareSystem "Risk" { 17 | shared_services = group "Shared Services Risk" { 18 | company_info = container "Company WhoIs" "Company search service" "Clojure API" 19 | company_info_database = container "Company WhoIs database" "" "Relational database schema" "Database" 20 | company_info_search = container "Company Search Aggregator" "Company full-text search index" "Elastic Search" "Elastic" 21 | risk_data_providers = container "Risk Data Providers" "Data Provider Service" "PHP Symphony service" 22 | risk_data_providers_database = container "Risk Data" "" "Relational database schema" "Database" 23 | } 24 | credit = group "Credit Risk" { 25 | score = container "Credit risk scoring" "Scoring organizations Credit Risk" "Clojure Service" 26 | score_data = container "Credit Risk Scoring Service database" "" "Relational database schema" "DatabaseWip" 27 | assessment = container "Credit Assessment" "Credit risk assessment Service" "Clojure" 28 | } 29 | 30 | fraud = group "Fraud Risk" { 31 | detection = container "Fraud Service" "Detect fraudulent transactions via Fraud Scoring Data Science models " "Clojure API" 32 | detection_data = container "Fraud Database" "TODO: Define the kind of data persisted" "Relational database schema" "Database" 33 | ml_model = container "AWS Sagemaker" "Machine learning model service" "" "Amazon Web Services - SageMaker" 34 | feature_store_data = container "Feature store" "Pre-calculated feature values" "Key value database" "Database" 35 | feature_schema_data = container "Feature mapping model/entity" "" "Key value database" "Database" 36 | manual_review = container "Review Transactions" "Manually review transactions for fraud" "" "WebBrowser" 37 | } 38 | } 39 | 40 | transaction = softwareSystem "Transaction" { 41 | guardian = container "Transaction Guardian" "Transaction monitoring and transaction Screening service" "Clojure" 42 | guardian_data = container "Transaction Guardian Database" "" "Relational database schema" "Database" 43 | limiter = container "Limiter" "Limits Service" "ClojureKafka" 44 | } 45 | 46 | /* Define Relationships between components */ 47 | user -> transaction "Triggers" 48 | 49 | transaction -> risk "Uses" 50 | guardian -> guardian_data "Persists" 51 | guardian -> limiter "Uses" 52 | 53 | detection -> detection_data "Reads and writes to" 54 | detection -> ml_model "score transaction" 55 | ml_model -> feature_store_data "Collect features" 56 | ml_model -> feature_schema_data "Request feature set & model" 57 | 58 | } 59 | 60 | /* Deployment / Infrastructure */ 61 | 62 | production = deploymentEnvironment "Production" { 63 | aws = deploymentNode "Amazon Web Services" "" "" "Amazon Web Services - Cloud" { 64 | region = deploymentNode "US-East-1" "" "" "Amazon Web Services - Region" { 65 | route53 = infrastructureNode "Route 53" "" "" "Amazon Web Services - Route 53" 66 | elb = infrastructureNode "Elastic Load Balancer" "" "" "Amazon Web Services - Elastic Load Balancing" 67 | autoscalingGroup = deploymentNode "Autoscaling group" "" "" "Amazon Web Services - Auto Scaling" { 68 | ec2 = deploymentNode "Amazon EC2" "" "" "Amazon Web Services - EC2" { 69 | 70 | webApplicationInstance = containerInstance detection 71 | elb -> webApplicationInstance "Forwards requests to" "HTTPS" 72 | } 73 | } 74 | rds = deploymentNode "Amazon RDS" "" "" "Amazon Web Services - RDS" { 75 | mysql = deploymentNode "MySQL" "" "" "Amazon Web Services - RDS MySQL instance" { 76 | databaseInstance = containerInstance detection_data 77 | } 78 | } 79 | route53 -> elb "Forwards requests to" "HTTPS" 80 | } 81 | } 82 | } 83 | /* End Of Production Deployment Environment */ 84 | 85 | } 86 | views { 87 | /* Overall system */ 88 | systemContext risk "EnterpriseView" "Practicalli Enterprise Application" { 89 | include * 90 | autoLayout 91 | } 92 | /* Entire Risk system */ 93 | container risk riskView "Complete Risk system" { 94 | include * 95 | autoLayout 96 | } 97 | /* View of shared_services group in risk system */ 98 | container risk sharedServicesView "Services shared across the organisation" { 99 | include shared_services 100 | autoLayout 101 | } 102 | /* View of fraud_risk group in risk system */ 103 | container risk fraudRiskView "Fraud Risk Services Only" { 104 | include fraud 105 | autoLayout 106 | } 107 | /* View of credit_risk group in risk system */ 108 | container risk creditRiskView "Credit Risk Services only" { 109 | include credit 110 | autoLayout 111 | } 112 | /* View of fraud & shared_services group without credit */ 113 | container risk fraudSharedView "Fraud and shared services" { 114 | include * 115 | exclude credit 116 | autoLayout 117 | } 118 | container transaction transactionView "Current Transaction system" { 119 | include * 120 | autoLayout 121 | } 122 | 123 | deployment risk "Production" "AmazonWebServicesDeployment" { 124 | include * 125 | autolayout lr 126 | animation { 127 | route53 128 | elb 129 | autoscalingGroup 130 | webApplicationInstance 131 | databaseInstance 132 | } 133 | } 134 | 135 | 136 | /* Theme for views */ 137 | themes default https://static.structurizr.com/themes/amazon-web-services-2022.04.30/theme.json 138 | 139 | branding { 140 | logo https://raw.githubusercontent.com/practicalli/graphic-design/live/logos/practicalli-logo.png 141 | } 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /workspace.dsl: -------------------------------------------------------------------------------- 1 | /* 2 | Practicalli Architecture 3 | */ 4 | 5 | /* Constant values */ 6 | !constant ORGANISATION_NAME "Practicalli" 7 | !constant GROUP_NAME "Fintech" 8 | 9 | workspace "Mock Fintech Startup" "Practicalli Services" { 10 | 11 | model { 12 | practicalli = enterprise "${ORGANISATION_NAME} - ${GROUP_NAME}" { 13 | 14 | user = person "User" 15 | 16 | risk = softwareSystem "Risk" { 17 | shared_services = group "Shared Services Risk" { 18 | company_info = container "Company WhoIs" "Company search service" "Clojure API" "Clojure Service" 19 | company_info_database = container "Company WhoIs database" "" "Relational database schema" "Database" 20 | company_info_search = container "Company Search Aggregator" "Company full-text search index" "Elastic Search Service" "Elastic Search" 21 | risk_data_providers = container "Risk Data Providers" "Data Provider Service" "Clojure API" "Clojure Servicee" 22 | risk_data_providers_database = container "Risk Data" "Historic Risk Reports" "Relational database schema" "Database" 23 | } 24 | credit = group "Credit Risk" { 25 | score = container "Credit risk scoring" "Scoring organizations Credit Risk" "Risk Score" "Clojure Servicee" 26 | score_data = container "Credit Risk Scoring Service database" "" "Relational database schema" "Database" 27 | assessment = container "Credit Assessment" "Credit risk assessment Service" "Clojure Servicee" 28 | } 29 | 30 | fraud = group "Fraud Risk" { 31 | detection = container "Fraud Service" "Detect fraudulent transactions via Fraud Scoring Data Science models" "Http-kit & Reitit" "Clojure Service" 32 | detection_data = container "Fraud Database" "Historic Fraud detection data" "Relational database schema" "Database" 33 | ml_model = container "Fraud Models" "Machine learning model service" "ML Models" "AWS SageMaker" 34 | feature_store_data = container "Feature store" "Pre-calculated feature values" "Key value database" "Database" 35 | feature_schema_data = container "Feature mapping model/entity" "" "Key value database" "Database" 36 | manual_review = container "Review Transactions" "Manually review transactions for fraud" "" "WebBrowser" 37 | } 38 | } 39 | 40 | transaction = softwareSystem "Transaction" { 41 | guardian = container "Transaction Guardian" "Transaction monitoring and transaction Screening service" "Clojure API" "Clojure Service" 42 | guardian_data = container "Transaction Guardian Database" "Historic transaction data" "Relational database schema" "Database" 43 | limiter = container "Limiter" "Limits Service" "Clojure Kafka Stream" "Clojure Service" 44 | } 45 | 46 | /* Define Relationships between components */ 47 | user -> transaction "Triggers" 48 | 49 | transaction -> risk "Uses" 50 | guardian -> guardian_data "Persists" 51 | guardian -> limiter "Uses" 52 | 53 | detection -> detection_data "Reads and writes to" 54 | detection -> ml_model "score transaction" 55 | ml_model -> feature_store_data "Collect features" 56 | ml_model -> feature_schema_data "Request feature set & model" 57 | 58 | } 59 | 60 | /* Deployment / Infrastructure */ 61 | 62 | production = deploymentEnvironment "Production" { 63 | aws = deploymentNode "Amazon Web Services" "" "" "Amazon Web Services - Cloud" { 64 | region = deploymentNode "US-East-1" "" "" "Amazon Web Services - Region" { 65 | route53 = infrastructureNode "Route 53" "" "" "Amazon Web Services - Route 53" 66 | elb = infrastructureNode "Elastic Load Balancer" "" "" "Amazon Web Services - Elastic Load Balancing" 67 | autoscalingGroup = deploymentNode "Autoscaling group" "" "" "Amazon Web Services - Auto Scaling" { 68 | ec2 = deploymentNode "Amazon EC2" "" "" "Amazon Web Services - EC2" { 69 | 70 | webApplicationInstance = containerInstance detection 71 | elb -> webApplicationInstance "Forwards requests to" "HTTPS" 72 | } 73 | } 74 | rds = deploymentNode "Amazon RDS" "" "" "Amazon Web Services - RDS" { 75 | mysql = deploymentNode "MySQL" "" "" "Amazon Web Services - RDS MySQL instance" { 76 | databaseInstance = containerInstance detection_data 77 | } 78 | } 79 | route53 -> elb "Forwards requests to" "HTTPS" 80 | } 81 | } 82 | } 83 | /* End Of Production Deployment Environment */ 84 | 85 | } 86 | views { 87 | /* Overall system */ 88 | systemContext risk "EnterpriseView" "Practicalli Enterprise Application" { 89 | include * 90 | autoLayout 91 | } 92 | /* Entire Risk system */ 93 | container risk riskView "Complete Risk system" { 94 | include * 95 | autoLayout 96 | } 97 | /* View of shared_services group in risk system */ 98 | container risk sharedServicesView "Services shared across the organisation" { 99 | include shared_services 100 | autoLayout 101 | } 102 | /* View of fraud_risk group in risk system */ 103 | container risk fraudRiskView "Fraud Risk Services Only" { 104 | include fraud 105 | autoLayout 106 | } 107 | /* View of credit_risk group in risk system */ 108 | container risk creditRiskView "Credit Risk Services only" { 109 | include credit 110 | autoLayout 111 | } 112 | /* View of fraud & shared_services group without credit */ 113 | container risk fraudSharedView "Fraud and shared services" { 114 | include * 115 | exclude credit 116 | autoLayout 117 | } 118 | container transaction transactionView "Current Transaction system" { 119 | include * 120 | autoLayout 121 | } 122 | 123 | deployment risk "Production" "AmazonWebServicesDeployment" { 124 | include * 125 | autolayout lr 126 | animation { 127 | route53 128 | elb 129 | autoscalingGroup 130 | webApplicationInstance 131 | databaseInstance 132 | } 133 | } 134 | 135 | 136 | /* Theme for views */ 137 | themes default https://static.structurizr.com/themes/amazon-web-services-2022.04.30/theme.json https://raw.githubusercontent.com/practicalli/structurizr/main/themes/practicalli/theme.json 138 | 139 | branding { 140 | logo https://raw.githubusercontent.com/practicalli/graphic-design/live/logos/practicalli-logo.png 141 | } 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /model/workspace.dsl: -------------------------------------------------------------------------------- 1 | /* 2 | Practicalli Architecture 3 | */ 4 | 5 | /* Constant values */ 6 | !constant ORGANISATION_NAME "Practicalli" 7 | !constant GROUP_NAME "Fintech" 8 | 9 | workspace "Mock Fintech Startup" "Practicalli Services" { 10 | 11 | model { 12 | practicalli = enterprise "${ORGANISATION_NAME} - ${GROUP_NAME}" { 13 | 14 | user = person "User" 15 | 16 | risk = softwareSystem "Risk" { 17 | shared_services = group "Shared Services Risk" { 18 | company_info = container "Company WhoIs" "Company search service" "Clojure API" "Clojure Service" 19 | company_info_database = container "Company WhoIs database" "" "Relational database schema" "Database" 20 | company_info_search = container "Company Search Aggregator" "Company full-text search index" "Elastic Search Service" "Elastic Search" 21 | risk_data_providers = container "Risk Data Providers" "Data Provider Service" "Clojure API" "Clojure Servicee" 22 | risk_data_providers_database = container "Risk Data" "Historic Risk Reports" "Relational database schema" "Database" 23 | } 24 | credit = group "Credit Risk" { 25 | score = container "Credit risk scoring" "Scoring organizations Credit Risk" "Risk Score" "Clojure Servicee" 26 | score_data = container "Credit Risk Scoring Service database" "" "Relational database schema" "Database" 27 | assessment = container "Credit Assessment" "Credit risk assessment Service" "Clojure Servicee" 28 | } 29 | 30 | fraud = group "Fraud Risk" { 31 | detection = container "Fraud Service" "Detect fraudulent transactions via Fraud Scoring Data Science models" "Http-kit & Reitit" "Clojure Service" 32 | detection_data = container "Fraud Database" "Historic Fraud detection data" "Relational database schema" "Database" 33 | ml_model = container "Fraud Models" "Machine learning model service" "ML Models" "AWS SageMaker" 34 | feature_store_data = container "Feature store" "Pre-calculated feature values" "Key value database" "Database" 35 | feature_schema_data = container "Feature mapping model/entity" "" "Key value database" "Database" 36 | manual_review = container "Review Transactions" "Manually review transactions for fraud" "" "WebBrowser" 37 | } 38 | } 39 | 40 | transaction = softwareSystem "Transaction" { 41 | guardian = container "Transaction Guardian" "Transaction monitoring and transaction Screening service" "Clojure API" "Clojure Service" 42 | guardian_data = container "Transaction Guardian Database" "Historic transaction data" "Relational database schema" "Database" 43 | limiter = container "Limiter" "Limits Service" "Clojure Kafka Stream" "Clojure Service" 44 | } 45 | 46 | /* Define Relationships between components */ 47 | user -> transaction "Triggers" 48 | 49 | transaction -> risk "Uses" 50 | guardian -> guardian_data "Persists" 51 | guardian -> limiter "Uses" 52 | 53 | detection -> detection_data "Reads and writes to" 54 | detection -> ml_model "score transaction" 55 | ml_model -> feature_store_data "Collect features" 56 | ml_model -> feature_schema_data "Request feature set & model" 57 | 58 | } 59 | 60 | /* Deployment / Infrastructure */ 61 | 62 | production = deploymentEnvironment "Production" { 63 | aws = deploymentNode "Amazon Web Services" "" "" "Amazon Web Services - Cloud" { 64 | region = deploymentNode "US-East-1" "" "" "Amazon Web Services - Region" { 65 | route53 = infrastructureNode "Route 53" "" "" "Amazon Web Services - Route 53" 66 | elb = infrastructureNode "Elastic Load Balancer" "" "" "Amazon Web Services - Elastic Load Balancing" 67 | autoscalingGroup = deploymentNode "Autoscaling group" "" "" "Amazon Web Services - Auto Scaling" { 68 | ec2 = deploymentNode "Amazon EC2" "" "" "Amazon Web Services - EC2" { 69 | 70 | webApplicationInstance = containerInstance detection 71 | elb -> webApplicationInstance "Forwards requests to" "HTTPS" 72 | } 73 | } 74 | rds = deploymentNode "Amazon RDS" "" "" "Amazon Web Services - RDS" { 75 | mysql = deploymentNode "MySQL" "" "" "Amazon Web Services - RDS MySQL instance" { 76 | databaseInstance = containerInstance detection_data 77 | } 78 | } 79 | route53 -> elb "Forwards requests to" "HTTPS" 80 | } 81 | } 82 | } 83 | /* End Of Production Deployment Environment */ 84 | 85 | } 86 | views { 87 | /* Overall system */ 88 | systemContext risk "EnterpriseView" "Practicalli Enterprise Application" { 89 | include * 90 | autoLayout 91 | } 92 | /* Entire Risk system */ 93 | container risk riskView "Complete Risk system" { 94 | include * 95 | autoLayout 96 | } 97 | /* View of shared_services group in risk system */ 98 | container risk sharedServicesView "Services shared across the organisation" { 99 | include shared_services 100 | autoLayout 101 | } 102 | /* View of fraud_risk group in risk system */ 103 | container risk fraudRiskView "Fraud Risk Services Only" { 104 | include fraud 105 | autoLayout 106 | } 107 | /* View of credit_risk group in risk system */ 108 | container risk creditRiskView "Credit Risk Services only" { 109 | include credit 110 | autoLayout 111 | } 112 | /* View of fraud & shared_services group without credit */ 113 | container risk fraudSharedView "Fraud and shared services" { 114 | include * 115 | exclude credit 116 | autoLayout 117 | } 118 | container transaction transactionView "Current Transaction system" { 119 | include * 120 | autoLayout 121 | } 122 | 123 | deployment risk "Production" "AmazonWebServicesDeployment" { 124 | include * 125 | autolayout lr 126 | animation { 127 | route53 128 | elb 129 | autoscalingGroup 130 | webApplicationInstance 131 | databaseInstance 132 | } 133 | } 134 | 135 | 136 | /* Theme for views */ 137 | themes default https://static.structurizr.com/themes/amazon-web-services-2022.04.30/theme.json https://raw.githubusercontent.com/practicalli/structurizr/main/themes/practicalli/theme.json 138 | 139 | branding { 140 | logo https://raw.githubusercontent.com/practicalli/graphic-design/live/logos/practicalli-logo.png 141 | } 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Attribution-ShareAlike 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution-ShareAlike 4.0 International Public 58 | License 59 | 60 | By exercising the Licensed Rights (defined below), You accept and agree 61 | to be bound by the terms and conditions of this Creative Commons 62 | Attribution-ShareAlike 4.0 International Public License ("Public 63 | License"). To the extent this Public License may be interpreted as a 64 | contract, You are granted the Licensed Rights in consideration of Your 65 | acceptance of these terms and conditions, and the Licensor grants You 66 | such rights in consideration of benefits the Licensor receives from 67 | making the Licensed Material available under these terms and 68 | conditions. 69 | 70 | 71 | Section 1 -- Definitions. 72 | 73 | a. Adapted Material means material subject to Copyright and Similar 74 | Rights that is derived from or based upon the Licensed Material 75 | and in which the Licensed Material is translated, altered, 76 | arranged, transformed, or otherwise modified in a manner requiring 77 | permission under the Copyright and Similar Rights held by the 78 | Licensor. For purposes of this Public License, where the Licensed 79 | Material is a musical work, performance, or sound recording, 80 | Adapted Material is always produced where the Licensed Material is 81 | synched in timed relation with a moving image. 82 | 83 | b. Adapter's License means the license You apply to Your Copyright 84 | and Similar Rights in Your contributions to Adapted Material in 85 | accordance with the terms and conditions of this Public License. 86 | 87 | c. BY-SA Compatible License means a license listed at 88 | creativecommons.org/compatiblelicenses, approved by Creative 89 | Commons as essentially the equivalent of this Public License. 90 | 91 | d. Copyright and Similar Rights means copyright and/or similar rights 92 | closely related to copyright including, without limitation, 93 | performance, broadcast, sound recording, and Sui Generis Database 94 | Rights, without regard to how the rights are labeled or 95 | categorized. For purposes of this Public License, the rights 96 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 97 | Rights. 98 | 99 | e. Effective Technological Measures means those measures that, in the 100 | absence of proper authority, may not be circumvented under laws 101 | fulfilling obligations under Article 11 of the WIPO Copyright 102 | Treaty adopted on December 20, 1996, and/or similar international 103 | agreements. 104 | 105 | f. Exceptions and Limitations means fair use, fair dealing, and/or 106 | any other exception or limitation to Copyright and Similar Rights 107 | that applies to Your use of the Licensed Material. 108 | 109 | g. License Elements means the license attributes listed in the name 110 | of a Creative Commons Public License. The License Elements of this 111 | Public License are Attribution and ShareAlike. 112 | 113 | h. Licensed Material means the artistic or literary work, database, 114 | or other material to which the Licensor applied this Public 115 | License. 116 | 117 | i. Licensed Rights means the rights granted to You subject to the 118 | terms and conditions of this Public License, which are limited to 119 | all Copyright and Similar Rights that apply to Your use of the 120 | Licensed Material and that the Licensor has authority to license. 121 | 122 | j. Licensor means the individual(s) or entity(ies) granting rights 123 | under this Public License. 124 | 125 | k. Share means to provide material to the public by any means or 126 | process that requires permission under the Licensed Rights, such 127 | as reproduction, public display, public performance, distribution, 128 | dissemination, communication, or importation, and to make material 129 | available to the public including in ways that members of the 130 | public may access the material from a place and at a time 131 | individually chosen by them. 132 | 133 | l. Sui Generis Database Rights means rights other than copyright 134 | resulting from Directive 96/9/EC of the European Parliament and of 135 | the Council of 11 March 1996 on the legal protection of databases, 136 | as amended and/or succeeded, as well as other essentially 137 | equivalent rights anywhere in the world. 138 | 139 | m. You means the individual or entity exercising the Licensed Rights 140 | under this Public License. Your has a corresponding meaning. 141 | 142 | 143 | Section 2 -- Scope. 144 | 145 | a. License grant. 146 | 147 | 1. Subject to the terms and conditions of this Public License, 148 | the Licensor hereby grants You a worldwide, royalty-free, 149 | non-sublicensable, non-exclusive, irrevocable license to 150 | exercise the Licensed Rights in the Licensed Material to: 151 | 152 | a. reproduce and Share the Licensed Material, in whole or 153 | in part; and 154 | 155 | b. produce, reproduce, and Share Adapted Material. 156 | 157 | 2. Exceptions and Limitations. For the avoidance of doubt, where 158 | Exceptions and Limitations apply to Your use, this Public 159 | License does not apply, and You do not need to comply with 160 | its terms and conditions. 161 | 162 | 3. Term. The term of this Public License is specified in Section 163 | 6(a). 164 | 165 | 4. Media and formats; technical modifications allowed. The 166 | Licensor authorizes You to exercise the Licensed Rights in 167 | all media and formats whether now known or hereafter created, 168 | and to make technical modifications necessary to do so. The 169 | Licensor waives and/or agrees not to assert any right or 170 | authority to forbid You from making technical modifications 171 | necessary to exercise the Licensed Rights, including 172 | technical modifications necessary to circumvent Effective 173 | Technological Measures. For purposes of this Public License, 174 | simply making modifications authorized by this Section 2(a) 175 | (4) never produces Adapted Material. 176 | 177 | 5. Downstream recipients. 178 | 179 | a. Offer from the Licensor -- Licensed Material. Every 180 | recipient of the Licensed Material automatically 181 | receives an offer from the Licensor to exercise the 182 | Licensed Rights under the terms and conditions of this 183 | Public License. 184 | 185 | b. Additional offer from the Licensor -- Adapted Material. 186 | Every recipient of Adapted Material from You 187 | automatically receives an offer from the Licensor to 188 | exercise the Licensed Rights in the Adapted Material 189 | under the conditions of the Adapter's License You apply. 190 | 191 | c. No downstream restrictions. You may not offer or impose 192 | any additional or different terms or conditions on, or 193 | apply any Effective Technological Measures to, the 194 | Licensed Material if doing so restricts exercise of the 195 | Licensed Rights by any recipient of the Licensed 196 | Material. 197 | 198 | 6. No endorsement. Nothing in this Public License constitutes or 199 | may be construed as permission to assert or imply that You 200 | are, or that Your use of the Licensed Material is, connected 201 | with, or sponsored, endorsed, or granted official status by, 202 | the Licensor or others designated to receive attribution as 203 | provided in Section 3(a)(1)(A)(i). 204 | 205 | b. Other rights. 206 | 207 | 1. Moral rights, such as the right of integrity, are not 208 | licensed under this Public License, nor are publicity, 209 | privacy, and/or other similar personality rights; however, to 210 | the extent possible, the Licensor waives and/or agrees not to 211 | assert any such rights held by the Licensor to the limited 212 | extent necessary to allow You to exercise the Licensed 213 | Rights, but not otherwise. 214 | 215 | 2. Patent and trademark rights are not licensed under this 216 | Public License. 217 | 218 | 3. To the extent possible, the Licensor waives any right to 219 | collect royalties from You for the exercise of the Licensed 220 | Rights, whether directly or through a collecting society 221 | under any voluntary or waivable statutory or compulsory 222 | licensing scheme. In all other cases the Licensor expressly 223 | reserves any right to collect such royalties. 224 | 225 | 226 | Section 3 -- License Conditions. 227 | 228 | Your exercise of the Licensed Rights is expressly made subject to the 229 | following conditions. 230 | 231 | a. Attribution. 232 | 233 | 1. If You Share the Licensed Material (including in modified 234 | form), You must: 235 | 236 | a. retain the following if it is supplied by the Licensor 237 | with the Licensed Material: 238 | 239 | i. identification of the creator(s) of the Licensed 240 | Material and any others designated to receive 241 | attribution, in any reasonable manner requested by 242 | the Licensor (including by pseudonym if 243 | designated); 244 | 245 | ii. a copyright notice; 246 | 247 | iii. a notice that refers to this Public License; 248 | 249 | iv. a notice that refers to the disclaimer of 250 | warranties; 251 | 252 | v. a URI or hyperlink to the Licensed Material to the 253 | extent reasonably practicable; 254 | 255 | b. indicate if You modified the Licensed Material and 256 | retain an indication of any previous modifications; and 257 | 258 | c. indicate the Licensed Material is licensed under this 259 | Public License, and include the text of, or the URI or 260 | hyperlink to, this Public License. 261 | 262 | 2. You may satisfy the conditions in Section 3(a)(1) in any 263 | reasonable manner based on the medium, means, and context in 264 | which You Share the Licensed Material. For example, it may be 265 | reasonable to satisfy the conditions by providing a URI or 266 | hyperlink to a resource that includes the required 267 | information. 268 | 269 | 3. If requested by the Licensor, You must remove any of the 270 | information required by Section 3(a)(1)(A) to the extent 271 | reasonably practicable. 272 | 273 | b. ShareAlike. 274 | 275 | In addition to the conditions in Section 3(a), if You Share 276 | Adapted Material You produce, the following conditions also apply. 277 | 278 | 1. The Adapter's License You apply must be a Creative Commons 279 | license with the same License Elements, this version or 280 | later, or a BY-SA Compatible License. 281 | 282 | 2. You must include the text of, or the URI or hyperlink to, the 283 | Adapter's License You apply. You may satisfy this condition 284 | in any reasonable manner based on the medium, means, and 285 | context in which You Share Adapted Material. 286 | 287 | 3. You may not offer or impose any additional or different terms 288 | or conditions on, or apply any Effective Technological 289 | Measures to, Adapted Material that restrict exercise of the 290 | rights granted under the Adapter's License You apply. 291 | 292 | 293 | Section 4 -- Sui Generis Database Rights. 294 | 295 | Where the Licensed Rights include Sui Generis Database Rights that 296 | apply to Your use of the Licensed Material: 297 | 298 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 299 | to extract, reuse, reproduce, and Share all or a substantial 300 | portion of the contents of the database; 301 | 302 | b. if You include all or a substantial portion of the database 303 | contents in a database in which You have Sui Generis Database 304 | Rights, then the database in which You have Sui Generis Database 305 | Rights (but not its individual contents) is Adapted Material, 306 | 307 | including for purposes of Section 3(b); and 308 | c. You must comply with the conditions in Section 3(a) if You Share 309 | all or a substantial portion of the contents of the database. 310 | 311 | For the avoidance of doubt, this Section 4 supplements and does not 312 | replace Your obligations under this Public License where the Licensed 313 | Rights include other Copyright and Similar Rights. 314 | 315 | 316 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 317 | 318 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 319 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 320 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 321 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 322 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 323 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 324 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 325 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 326 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 327 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 328 | 329 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 330 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 331 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 332 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 333 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 334 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 335 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 336 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 337 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 338 | 339 | c. The disclaimer of warranties and limitation of liability provided 340 | above shall be interpreted in a manner that, to the extent 341 | possible, most closely approximates an absolute disclaimer and 342 | waiver of all liability. 343 | 344 | 345 | Section 6 -- Term and Termination. 346 | 347 | a. This Public License applies for the term of the Copyright and 348 | Similar Rights licensed here. However, if You fail to comply with 349 | this Public License, then Your rights under this Public License 350 | terminate automatically. 351 | 352 | b. Where Your right to use the Licensed Material has terminated under 353 | Section 6(a), it reinstates: 354 | 355 | 1. automatically as of the date the violation is cured, provided 356 | it is cured within 30 days of Your discovery of the 357 | violation; or 358 | 359 | 2. upon express reinstatement by the Licensor. 360 | 361 | For the avoidance of doubt, this Section 6(b) does not affect any 362 | right the Licensor may have to seek remedies for Your violations 363 | of this Public License. 364 | 365 | c. For the avoidance of doubt, the Licensor may also offer the 366 | Licensed Material under separate terms or conditions or stop 367 | distributing the Licensed Material at any time; however, doing so 368 | will not terminate this Public License. 369 | 370 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 371 | License. 372 | 373 | 374 | Section 7 -- Other Terms and Conditions. 375 | 376 | a. The Licensor shall not be bound by any additional or different 377 | terms or conditions communicated by You unless expressly agreed. 378 | 379 | b. Any arrangements, understandings, or agreements regarding the 380 | Licensed Material not stated herein are separate from and 381 | independent of the terms and conditions of this Public License. 382 | 383 | 384 | Section 8 -- Interpretation. 385 | 386 | a. For the avoidance of doubt, this Public License does not, and 387 | shall not be interpreted to, reduce, limit, restrict, or impose 388 | conditions on any use of the Licensed Material that could lawfully 389 | be made without permission under this Public License. 390 | 391 | b. To the extent possible, if any provision of this Public License is 392 | deemed unenforceable, it shall be automatically reformed to the 393 | minimum extent necessary to make it enforceable. If the provision 394 | cannot be reformed, it shall be severed from this Public License 395 | without affecting the enforceability of the remaining terms and 396 | conditions. 397 | 398 | c. No term or condition of this Public License will be waived and no 399 | failure to comply consented to unless expressly agreed to by the 400 | Licensor. 401 | 402 | d. Nothing in this Public License constitutes or may be interpreted 403 | as a limitation upon, or waiver of, any privileges and immunities 404 | that apply to the Licensor or You, including from the legal 405 | processes of any jurisdiction or authority. 406 | 407 | 408 | ======================================================================= 409 | 410 | Creative Commons is not a party to its public 411 | licenses. Notwithstanding, Creative Commons may elect to apply one of 412 | its public licenses to material it publishes and in those instances 413 | will be considered the “Licensor.” The text of the Creative Commons 414 | public licenses is dedicated to the public domain under the CC0 Public 415 | Domain Dedication. Except for the limited purpose of indicating that 416 | material is shared under a Creative Commons public license or as 417 | otherwise permitted by the Creative Commons policies published at 418 | creativecommons.org/policies, Creative Commons does not authorize the 419 | use of the trademark "Creative Commons" or any other trademark or logo 420 | of Creative Commons without its prior written consent including, 421 | without limitation, in connection with any unauthorized modifications 422 | to any of its public licenses or any other arrangements, 423 | understandings, or agreements concerning use of licensed material. For 424 | the avoidance of doubt, this paragraph does not form part of the 425 | public licenses. 426 | 427 | Creative Commons may be contacted at creativecommons.org. 428 | -------------------------------------------------------------------------------- /model/workspace.json: -------------------------------------------------------------------------------- 1 | { 2 | "id" : 1, 3 | "name" : "Mock Fintech Startup", 4 | "description" : "Practicalli Services", 5 | "revision" : 0, 6 | "lastModifiedDate" : "2023-01-15T22:51:28Z", 7 | "lastModifiedAgent" : "structurizr-web/2892/diagram", 8 | "properties" : { 9 | "structurizr.dsl" : "LyoKICBQcmFjdGljYWxsaSBBcmNoaXRlY3R1cmUKKi8KCi8qIENvbnN0YW50IHZhbHVlcyAqLwohY29uc3RhbnQgT1JHQU5JU0FUSU9OX05BTUUgIlByYWN0aWNhbGxpIgohY29uc3RhbnQgR1JPVVBfTkFNRSAiRmludGVjaCIKCndvcmtzcGFjZSAiTW9jayBGaW50ZWNoIFN0YXJ0dXAiICJQcmFjdGljYWxsaSBTZXJ2aWNlcyIgIHsKCiAgbW9kZWwgewogICAgcHJhY3RpY2FsbGkgPSBlbnRlcnByaXNlICIke09SR0FOSVNBVElPTl9OQU1FfSAtICR7R1JPVVBfTkFNRX0iIHsKCiAgICAgIHVzZXIgPSBwZXJzb24gIlVzZXIiCgogICAgICByaXNrID0gc29mdHdhcmVTeXN0ZW0gIlJpc2siIHsKICAgICAgICBzaGFyZWRfc2VydmljZXMgPSBncm91cCAiU2hhcmVkIFNlcnZpY2VzIFJpc2siIHsKICAgICAgICAgIGNvbXBhbnlfaW5mbyA9IGNvbnRhaW5lciAiQ29tcGFueSBXaG9JcyIgIkNvbXBhbnkgc2VhcmNoIHNlcnZpY2UiICJDbG9qdXJlIEFQSSIgIkNsb2p1cmUgU2VydmljZSIKICAgICAgICAgIGNvbXBhbnlfaW5mb19kYXRhYmFzZSA9IGNvbnRhaW5lciAiQ29tcGFueSBXaG9JcyBkYXRhYmFzZSIgIiIgIlJlbGF0aW9uYWwgZGF0YWJhc2Ugc2NoZW1hIiAiRGF0YWJhc2UiCiAgICAgICAgICBjb21wYW55X2luZm9fc2VhcmNoID0gY29udGFpbmVyICJDb21wYW55IFNlYXJjaCBBZ2dyZWdhdG9yIiAiQ29tcGFueSBmdWxsLXRleHQgc2VhcmNoIGluZGV4IiAiRWxhc3RpYyBTZWFyY2ggU2VydmljZSIgIkVsYXN0aWMgU2VhcmNoIgogICAgICAgICAgcmlza19kYXRhX3Byb3ZpZGVycyA9IGNvbnRhaW5lciAiUmlzayBEYXRhIFByb3ZpZGVycyIgIkRhdGEgUHJvdmlkZXIgU2VydmljZSIgIkNsb2p1cmUgQVBJIiAiQ2xvanVyZSBTZXJ2aWNlZSIKICAgICAgICAgIHJpc2tfZGF0YV9wcm92aWRlcnNfZGF0YWJhc2UgPSBjb250YWluZXIgIlJpc2sgRGF0YSIgIkhpc3RvcmljIFJpc2sgUmVwb3J0cyIgIlJlbGF0aW9uYWwgZGF0YWJhc2Ugc2NoZW1hIiAiRGF0YWJhc2UiCiAgICAgICAgfQogICAgICAgIGNyZWRpdCA9IGdyb3VwICJDcmVkaXQgUmlzayIgewogICAgICAgICAgc2NvcmUgPSBjb250YWluZXIgIkNyZWRpdCByaXNrIHNjb3JpbmciICJTY29yaW5nIG9yZ2FuaXphdGlvbnMgQ3JlZGl0IFJpc2siICJSaXNrIFNjb3JlIiAiQ2xvanVyZSBTZXJ2aWNlZSIKICAgICAgICAgIHNjb3JlX2RhdGEgPSBjb250YWluZXIgIkNyZWRpdCBSaXNrIFNjb3JpbmcgU2VydmljZSBkYXRhYmFzZSIgIiIgIlJlbGF0aW9uYWwgZGF0YWJhc2Ugc2NoZW1hIiAiRGF0YWJhc2UiCiAgICAgICAgICBhc3Nlc3NtZW50ID0gY29udGFpbmVyICJDcmVkaXQgQXNzZXNzbWVudCIgIkNyZWRpdCByaXNrIGFzc2Vzc21lbnQgU2VydmljZSIgIkNsb2p1cmUgU2VydmljZWUiCiAgICAgICAgfQoKICAgICAgICBmcmF1ZCA9IGdyb3VwICJGcmF1ZCBSaXNrIiB7CiAgICAgICAgICBkZXRlY3Rpb24gPSBjb250YWluZXIgIkZyYXVkIFNlcnZpY2UiICJEZXRlY3QgZnJhdWR1bGVudCB0cmFuc2FjdGlvbnMgdmlhIEZyYXVkIFNjb3JpbmcgRGF0YSBTY2llbmNlIG1vZGVscyIgIkh0dHAta2l0ICYgUmVpdGl0IiAiQ2xvanVyZSBTZXJ2aWNlIgogICAgICAgICAgZGV0ZWN0aW9uX2RhdGEgPSBjb250YWluZXIgIkZyYXVkIERhdGFiYXNlIiAiSGlzdG9yaWMgRnJhdWQgZGV0ZWN0aW9uIGRhdGEiICJSZWxhdGlvbmFsIGRhdGFiYXNlIHNjaGVtYSIgIkRhdGFiYXNlIgogICAgICAgICAgbWxfbW9kZWwgPSBjb250YWluZXIgIkZyYXVkIE1vZGVscyIgIk1hY2hpbmUgbGVhcm5pbmcgbW9kZWwgc2VydmljZSIgIk1MIE1vZGVscyIgIkFXUyBTYWdlTWFrZXIiCiAgICAgICAgICBmZWF0dXJlX3N0b3JlX2RhdGEgPSBjb250YWluZXIgIkZlYXR1cmUgc3RvcmUiICJQcmUtY2FsY3VsYXRlZCBmZWF0dXJlIHZhbHVlcyIgIktleSB2YWx1ZSBkYXRhYmFzZSIgIkRhdGFiYXNlIgogICAgICAgICAgZmVhdHVyZV9zY2hlbWFfZGF0YSA9IGNvbnRhaW5lciAiRmVhdHVyZSBtYXBwaW5nIG1vZGVsL2VudGl0eSIgIiIgIktleSB2YWx1ZSBkYXRhYmFzZSIgIkRhdGFiYXNlIgogICAgICAgICAgbWFudWFsX3JldmlldyA9IGNvbnRhaW5lciAiUmV2aWV3IFRyYW5zYWN0aW9ucyIgIk1hbnVhbGx5IHJldmlldyB0cmFuc2FjdGlvbnMgZm9yIGZyYXVkIiAiIiAiV2ViQnJvd3NlciIKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRyYW5zYWN0aW9uID0gc29mdHdhcmVTeXN0ZW0gIlRyYW5zYWN0aW9uIiB7CiAgICAgICAgZ3VhcmRpYW4gPSBjb250YWluZXIgIlRyYW5zYWN0aW9uIEd1YXJkaWFuIiAiVHJhbnNhY3Rpb24gbW9uaXRvcmluZyBhbmQgdHJhbnNhY3Rpb24gU2NyZWVuaW5nIHNlcnZpY2UiICJDbG9qdXJlIEFQSSIgIkNsb2p1cmUgU2VydmljZSIKICAgICAgICBndWFyZGlhbl9kYXRhID0gY29udGFpbmVyICJUcmFuc2FjdGlvbiBHdWFyZGlhbiBEYXRhYmFzZSIgIkhpc3RvcmljIHRyYW5zYWN0aW9uIGRhdGEiICJSZWxhdGlvbmFsIGRhdGFiYXNlIHNjaGVtYSIgIkRhdGFiYXNlIgogICAgICAgIGxpbWl0ZXIgPSBjb250YWluZXIgIkxpbWl0ZXIiICJMaW1pdHMgU2VydmljZSIgIkNsb2p1cmUgS2Fma2EgU3RyZWFtIiAiQ2xvanVyZSBTZXJ2aWNlIgogICAgICB9CgogICAgLyogRGVmaW5lIFJlbGF0aW9uc2hpcHMgYmV0d2VlbiBjb21wb25lbnRzICovCiAgICB1c2VyIC0+IHRyYW5zYWN0aW9uICJUcmlnZ2VycyIKCiAgICB0cmFuc2FjdGlvbiAtPiByaXNrICJVc2VzIgogICAgZ3VhcmRpYW4gLT4gZ3VhcmRpYW5fZGF0YSAiUGVyc2lzdHMiCiAgICBndWFyZGlhbiAtPiBsaW1pdGVyICJVc2VzIgoKICAgIGRldGVjdGlvbiAtPiBkZXRlY3Rpb25fZGF0YSAiUmVhZHMgYW5kIHdyaXRlcyB0byIKICAgIGRldGVjdGlvbiAtPiBtbF9tb2RlbCAic2NvcmUgdHJhbnNhY3Rpb24iCiAgICBtbF9tb2RlbCAtPiBmZWF0dXJlX3N0b3JlX2RhdGEgIkNvbGxlY3QgZmVhdHVyZXMiCiAgICBtbF9tb2RlbCAtPiBmZWF0dXJlX3NjaGVtYV9kYXRhICJSZXF1ZXN0IGZlYXR1cmUgc2V0ICYgbW9kZWwiCgogICAgfQoKICAvKiBEZXBsb3ltZW50IC8gSW5mcmFzdHJ1Y3R1cmUgKi8KCiAgcHJvZHVjdGlvbiA9IGRlcGxveW1lbnRFbnZpcm9ubWVudCAiUHJvZHVjdGlvbiIgewogICAgYXdzID0gZGVwbG95bWVudE5vZGUgIkFtYXpvbiBXZWIgU2VydmljZXMiICIiICIiICJBbWF6b24gV2ViIFNlcnZpY2VzIC0gQ2xvdWQiIHsKICAgICAgcmVnaW9uID0gZGVwbG95bWVudE5vZGUgIlVTLUVhc3QtMSIgIiIgIiIgIkFtYXpvbiBXZWIgU2VydmljZXMgLSBSZWdpb24iIHsKICAgICAgICByb3V0ZTUzID0gaW5mcmFzdHJ1Y3R1cmVOb2RlICJSb3V0ZSA1MyIgIiIgIiIgIkFtYXpvbiBXZWIgU2VydmljZXMgLSBSb3V0ZSA1MyIKICAgICAgICBlbGIgPSBpbmZyYXN0cnVjdHVyZU5vZGUgIkVsYXN0aWMgTG9hZCBCYWxhbmNlciIgIiIgIiIgIkFtYXpvbiBXZWIgU2VydmljZXMgLSBFbGFzdGljIExvYWQgQmFsYW5jaW5nIgogICAgICAgIGF1dG9zY2FsaW5nR3JvdXAgPSBkZXBsb3ltZW50Tm9kZSAiQXV0b3NjYWxpbmcgZ3JvdXAiICIiICIiICJBbWF6b24gV2ViIFNlcnZpY2VzIC0gQXV0byBTY2FsaW5nIiB7CiAgICAgICAgICBlYzIgPSBkZXBsb3ltZW50Tm9kZSAiQW1hem9uIEVDMiIgIiIgIiIgIkFtYXpvbiBXZWIgU2VydmljZXMgLSBFQzIiIHsKCiAgICAgICAgICAgIHdlYkFwcGxpY2F0aW9uSW5zdGFuY2UgPSBjb250YWluZXJJbnN0YW5jZSBkZXRlY3Rpb24KICAgICAgICAgICAgZWxiIC0+IHdlYkFwcGxpY2F0aW9uSW5zdGFuY2UgIkZvcndhcmRzIHJlcXVlc3RzIHRvIiAiSFRUUFMiCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJkcyA9IGRlcGxveW1lbnROb2RlICJBbWF6b24gUkRTIiAiIiAiIiAiQW1hem9uIFdlYiBTZXJ2aWNlcyAtIFJEUyIgewogICAgICAgICAgbXlzcWwgPSBkZXBsb3ltZW50Tm9kZSAiTXlTUUwiICIiICIiICJBbWF6b24gV2ViIFNlcnZpY2VzIC0gUkRTIE15U1FMIGluc3RhbmNlIiB7CiAgICAgICAgICAgIGRhdGFiYXNlSW5zdGFuY2UgPSBjb250YWluZXJJbnN0YW5jZSBkZXRlY3Rpb25fZGF0YQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByb3V0ZTUzIC0+IGVsYiAiRm9yd2FyZHMgcmVxdWVzdHMgdG8iICJIVFRQUyIKICAgICAgfQogICAgfQogIH0KIC8qIEVuZCBPZiBQcm9kdWN0aW9uIERlcGxveW1lbnQgRW52aXJvbm1lbnQgKi8KCiAgfQogIHZpZXdzIHsKICAgLyogT3ZlcmFsbCBzeXN0ZW0gKi8KICAgIHN5c3RlbUNvbnRleHQgcmlzayAiRW50ZXJwcmlzZVZpZXciICJQcmFjdGljYWxsaSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIiB7CiAgICAgIGluY2x1ZGUgKgogICAgICBhdXRvTGF5b3V0CiAgICB9CiAgIC8qIEVudGlyZSBSaXNrIHN5c3RlbSAqLwogICAgY29udGFpbmVyIHJpc2sgcmlza1ZpZXcgIkNvbXBsZXRlIFJpc2sgc3lzdGVtIiB7CiAgICAgIGluY2x1ZGUgKgogICAgICBhdXRvTGF5b3V0CiAgICB9CiAgICAvKiBWaWV3IG9mIHNoYXJlZF9zZXJ2aWNlcyBncm91cCBpbiByaXNrIHN5c3RlbSAqLwogICAgY29udGFpbmVyIHJpc2sgc2hhcmVkU2VydmljZXNWaWV3ICJTZXJ2aWNlcyBzaGFyZWQgYWNyb3NzIHRoZSBvcmdhbmlzYXRpb24iIHsKICAgICAgaW5jbHVkZSBzaGFyZWRfc2VydmljZXMKICAgICAgYXV0b0xheW91dAogICAgfQogICAgLyogVmlldyBvZiBmcmF1ZF9yaXNrIGdyb3VwIGluIHJpc2sgc3lzdGVtICovCiAgICBjb250YWluZXIgcmlzayBmcmF1ZFJpc2tWaWV3ICJGcmF1ZCBSaXNrIFNlcnZpY2VzIE9ubHkiIHsKICAgICAgaW5jbHVkZSBmcmF1ZAogICAgICBhdXRvTGF5b3V0CiAgICB9CiAgICAvKiBWaWV3IG9mIGNyZWRpdF9yaXNrIGdyb3VwIGluIHJpc2sgc3lzdGVtICovCiAgICBjb250YWluZXIgcmlzayBjcmVkaXRSaXNrVmlldyAiQ3JlZGl0IFJpc2sgU2VydmljZXMgb25seSIgewogICAgICBpbmNsdWRlIGNyZWRpdAogICAgICBhdXRvTGF5b3V0CiAgICB9CiAgICAvKiBWaWV3IG9mIGZyYXVkICYgc2hhcmVkX3NlcnZpY2VzIGdyb3VwIHdpdGhvdXQgY3JlZGl0ICovCiAgICBjb250YWluZXIgcmlzayBmcmF1ZFNoYXJlZFZpZXcgIkZyYXVkIGFuZCBzaGFyZWQgc2VydmljZXMiIHsKICAgICAgaW5jbHVkZSAqCiAgICAgIGV4Y2x1ZGUgY3JlZGl0CiAgICAgIGF1dG9MYXlvdXQKICAgIH0KICAgIGNvbnRhaW5lciB0cmFuc2FjdGlvbiB0cmFuc2FjdGlvblZpZXcgIkN1cnJlbnQgVHJhbnNhY3Rpb24gc3lzdGVtIiB7CiAgICAgIGluY2x1ZGUgKgogICAgICBhdXRvTGF5b3V0CiAgICB9CgogICAgZGVwbG95bWVudCByaXNrICJQcm9kdWN0aW9uIiAiQW1hem9uV2ViU2VydmljZXNEZXBsb3ltZW50IiB7CiAgICAgIGluY2x1ZGUgKgogICAgICBhdXRvbGF5b3V0IGxyCiAgICAgIGFuaW1hdGlvbiB7CiAgICAgICAgcm91dGU1MwogICAgICAgIGVsYgogICAgICAgIGF1dG9zY2FsaW5nR3JvdXAKICAgICAgICB3ZWJBcHBsaWNhdGlvbkluc3RhbmNlCiAgICAgICAgZGF0YWJhc2VJbnN0YW5jZQogICAgICB9CiAgICB9CgoKICAgIC8qIFRoZW1lIGZvciB2aWV3cyAqLwogICAgdGhlbWVzIGRlZmF1bHQgaHR0cHM6Ly9zdGF0aWMuc3RydWN0dXJpenIuY29tL3RoZW1lcy9hbWF6b24td2ViLXNlcnZpY2VzLTIwMjIuMDQuMzAvdGhlbWUuanNvbiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHJhY3RpY2FsbGkvc3RydWN0dXJpenIvbWFpbi90aGVtZXMvcHJhY3RpY2FsbGkvdGhlbWUuanNvbgoKICAgIGJyYW5kaW5nIHsKICAgICAgbG9nbyBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHJhY3RpY2FsbGkvZ3JhcGhpYy1kZXNpZ24vbGl2ZS9sb2dvcy9wcmFjdGljYWxsaS1sb2dvLnBuZwogICAgfQogIH0KfQo=" 10 | }, 11 | "configuration" : { }, 12 | "model" : { 13 | "enterprise" : { 14 | "name" : "Practicalli - Fintech" 15 | }, 16 | "people" : [ { 17 | "id" : "1", 18 | "tags" : "Element,Person", 19 | "name" : "User", 20 | "relationships" : [ { 21 | "id" : "21", 22 | "tags" : "Relationship", 23 | "sourceId" : "1", 24 | "destinationId" : "17", 25 | "description" : "Triggers" 26 | } ], 27 | "location" : "Internal" 28 | } ], 29 | "softwareSystems" : [ { 30 | "id" : "17", 31 | "tags" : "Element,Software System", 32 | "name" : "Transaction", 33 | "relationships" : [ { 34 | "id" : "22", 35 | "tags" : "Relationship", 36 | "sourceId" : "17", 37 | "destinationId" : "2", 38 | "description" : "Uses" 39 | } ], 40 | "location" : "Internal", 41 | "containers" : [ { 42 | "id" : "18", 43 | "tags" : "Element,Container,Clojure Service", 44 | "name" : "Transaction Guardian", 45 | "description" : "Transaction monitoring and transaction Screening service", 46 | "relationships" : [ { 47 | "id" : "24", 48 | "tags" : "Relationship", 49 | "sourceId" : "18", 50 | "destinationId" : "20", 51 | "description" : "Uses" 52 | }, { 53 | "id" : "23", 54 | "tags" : "Relationship", 55 | "sourceId" : "18", 56 | "destinationId" : "19", 57 | "description" : "Persists" 58 | } ], 59 | "technology" : "Clojure API", 60 | "documentation" : { } 61 | }, { 62 | "id" : "20", 63 | "tags" : "Element,Container,Clojure Service", 64 | "name" : "Limiter", 65 | "description" : "Limits Service", 66 | "technology" : "Clojure Kafka Stream", 67 | "documentation" : { } 68 | }, { 69 | "id" : "19", 70 | "tags" : "Element,Container,Database", 71 | "name" : "Transaction Guardian Database", 72 | "description" : "Historic transaction data", 73 | "technology" : "Relational database schema", 74 | "documentation" : { } 75 | } ], 76 | "documentation" : { } 77 | }, { 78 | "id" : "2", 79 | "tags" : "Element,Software System", 80 | "name" : "Risk", 81 | "location" : "Internal", 82 | "containers" : [ { 83 | "id" : "10", 84 | "tags" : "Element,Container", 85 | "name" : "Credit Assessment", 86 | "description" : "Credit risk assessment Service", 87 | "group" : "Credit Risk", 88 | "technology" : "Clojure Servicee", 89 | "documentation" : { } 90 | }, { 91 | "id" : "15", 92 | "tags" : "Element,Container,Database", 93 | "name" : "Feature mapping model/entity", 94 | "group" : "Fraud Risk", 95 | "technology" : "Key value database", 96 | "documentation" : { } 97 | }, { 98 | "id" : "3", 99 | "tags" : "Element,Container,Clojure Service", 100 | "name" : "Company WhoIs", 101 | "description" : "Company search service", 102 | "group" : "Shared Services Risk", 103 | "technology" : "Clojure API", 104 | "documentation" : { } 105 | }, { 106 | "id" : "8", 107 | "tags" : "Element,Container,Clojure Servicee", 108 | "name" : "Credit risk scoring", 109 | "description" : "Scoring organizations Credit Risk", 110 | "group" : "Credit Risk", 111 | "technology" : "Risk Score", 112 | "documentation" : { } 113 | }, { 114 | "id" : "14", 115 | "tags" : "Element,Container,Database", 116 | "name" : "Feature store", 117 | "description" : "Pre-calculated feature values", 118 | "group" : "Fraud Risk", 119 | "technology" : "Key value database", 120 | "documentation" : { } 121 | }, { 122 | "id" : "4", 123 | "tags" : "Element,Container,Database", 124 | "name" : "Company WhoIs database", 125 | "group" : "Shared Services Risk", 126 | "technology" : "Relational database schema", 127 | "documentation" : { } 128 | }, { 129 | "id" : "12", 130 | "tags" : "Element,Container,Database", 131 | "name" : "Fraud Database", 132 | "description" : "Historic Fraud detection data", 133 | "group" : "Fraud Risk", 134 | "technology" : "Relational database schema", 135 | "documentation" : { } 136 | }, { 137 | "id" : "16", 138 | "tags" : "Element,Container,WebBrowser", 139 | "name" : "Review Transactions", 140 | "description" : "Manually review transactions for fraud", 141 | "group" : "Fraud Risk", 142 | "documentation" : { } 143 | }, { 144 | "id" : "13", 145 | "tags" : "Element,Container,AWS SageMaker", 146 | "name" : "Fraud Models", 147 | "description" : "Machine learning model service", 148 | "relationships" : [ { 149 | "id" : "28", 150 | "tags" : "Relationship", 151 | "sourceId" : "13", 152 | "destinationId" : "15", 153 | "description" : "Request feature set & model" 154 | }, { 155 | "id" : "27", 156 | "tags" : "Relationship", 157 | "sourceId" : "13", 158 | "destinationId" : "14", 159 | "description" : "Collect features" 160 | } ], 161 | "group" : "Fraud Risk", 162 | "technology" : "ML Models", 163 | "documentation" : { } 164 | }, { 165 | "id" : "6", 166 | "tags" : "Element,Container,Clojure Servicee", 167 | "name" : "Risk Data Providers", 168 | "description" : "Data Provider Service", 169 | "group" : "Shared Services Risk", 170 | "technology" : "Clojure API", 171 | "documentation" : { } 172 | }, { 173 | "id" : "9", 174 | "tags" : "Element,Container,Database", 175 | "name" : "Credit Risk Scoring Service database", 176 | "group" : "Credit Risk", 177 | "technology" : "Relational database schema", 178 | "documentation" : { } 179 | }, { 180 | "id" : "7", 181 | "tags" : "Element,Container,Database", 182 | "name" : "Risk Data", 183 | "description" : "Historic Risk Reports", 184 | "group" : "Shared Services Risk", 185 | "technology" : "Relational database schema", 186 | "documentation" : { } 187 | }, { 188 | "id" : "5", 189 | "tags" : "Element,Container,Elastic Search", 190 | "name" : "Company Search Aggregator", 191 | "description" : "Company full-text search index", 192 | "group" : "Shared Services Risk", 193 | "technology" : "Elastic Search Service", 194 | "documentation" : { } 195 | }, { 196 | "id" : "11", 197 | "tags" : "Element,Container,Clojure Service", 198 | "name" : "Fraud Service", 199 | "description" : "Detect fraudulent transactions via Fraud Scoring Data Science models", 200 | "relationships" : [ { 201 | "id" : "25", 202 | "tags" : "Relationship", 203 | "sourceId" : "11", 204 | "destinationId" : "12", 205 | "description" : "Reads and writes to" 206 | }, { 207 | "id" : "26", 208 | "tags" : "Relationship", 209 | "sourceId" : "11", 210 | "destinationId" : "13", 211 | "description" : "score transaction" 212 | } ], 213 | "group" : "Fraud Risk", 214 | "technology" : "Http-kit & Reitit", 215 | "documentation" : { } 216 | } ], 217 | "documentation" : { } 218 | } ], 219 | "deploymentNodes" : [ { 220 | "id" : "29", 221 | "tags" : "Element,Deployment Node,Amazon Web Services - Cloud", 222 | "name" : "Amazon Web Services", 223 | "environment" : "Production", 224 | "instances" : "1", 225 | "children" : [ { 226 | "id" : "30", 227 | "tags" : "Element,Deployment Node,Amazon Web Services - Region", 228 | "name" : "US-East-1", 229 | "environment" : "Production", 230 | "instances" : "1", 231 | "children" : [ { 232 | "id" : "33", 233 | "tags" : "Element,Deployment Node,Amazon Web Services - Auto Scaling", 234 | "name" : "Autoscaling group", 235 | "environment" : "Production", 236 | "instances" : "1", 237 | "children" : [ { 238 | "id" : "34", 239 | "tags" : "Element,Deployment Node,Amazon Web Services - EC2", 240 | "name" : "Amazon EC2", 241 | "environment" : "Production", 242 | "instances" : "1", 243 | "containerInstances" : [ { 244 | "id" : "35", 245 | "tags" : "Container Instance", 246 | "relationships" : [ { 247 | "id" : "40", 248 | "sourceId" : "35", 249 | "destinationId" : "39", 250 | "description" : "Reads and writes to", 251 | "linkedRelationshipId" : "25" 252 | } ], 253 | "environment" : "Production", 254 | "deploymentGroups" : [ "Default" ], 255 | "instanceId" : 1, 256 | "containerId" : "11" 257 | } ] 258 | } ] 259 | }, { 260 | "id" : "37", 261 | "tags" : "Element,Deployment Node,Amazon Web Services - RDS", 262 | "name" : "Amazon RDS", 263 | "environment" : "Production", 264 | "instances" : "1", 265 | "children" : [ { 266 | "id" : "38", 267 | "tags" : "Element,Deployment Node,Amazon Web Services - RDS MySQL instance", 268 | "name" : "MySQL", 269 | "environment" : "Production", 270 | "instances" : "1", 271 | "containerInstances" : [ { 272 | "id" : "39", 273 | "tags" : "Container Instance", 274 | "environment" : "Production", 275 | "deploymentGroups" : [ "Default" ], 276 | "instanceId" : 1, 277 | "containerId" : "12" 278 | } ] 279 | } ] 280 | } ], 281 | "infrastructureNodes" : [ { 282 | "id" : "32", 283 | "tags" : "Element,Infrastructure Node,Amazon Web Services - Elastic Load Balancing", 284 | "name" : "Elastic Load Balancer", 285 | "relationships" : [ { 286 | "id" : "36", 287 | "tags" : "Relationship", 288 | "sourceId" : "32", 289 | "destinationId" : "35", 290 | "description" : "Forwards requests to", 291 | "technology" : "HTTPS" 292 | } ], 293 | "environment" : "Production" 294 | }, { 295 | "id" : "31", 296 | "tags" : "Element,Infrastructure Node,Amazon Web Services - Route 53", 297 | "name" : "Route 53", 298 | "relationships" : [ { 299 | "id" : "41", 300 | "tags" : "Relationship", 301 | "sourceId" : "31", 302 | "destinationId" : "32", 303 | "description" : "Forwards requests to", 304 | "technology" : "HTTPS" 305 | } ], 306 | "environment" : "Production" 307 | } ] 308 | } ] 309 | } ] 310 | }, 311 | "documentation" : { }, 312 | "views" : { 313 | "systemContextViews" : [ { 314 | "softwareSystemId" : "2", 315 | "description" : "Practicalli Enterprise Application", 316 | "key" : "EnterpriseView", 317 | "order" : 1, 318 | "paperSize" : "A6_Portrait", 319 | "dimensions" : { 320 | "width" : 1108, 321 | "height" : 1558 322 | }, 323 | "automaticLayout" : { 324 | "implementation" : "Graphviz", 325 | "rankDirection" : "TopBottom", 326 | "rankSeparation" : 300, 327 | "nodeSeparation" : 300, 328 | "edgeSeparation" : 0, 329 | "vertices" : false 330 | }, 331 | "enterpriseBoundaryVisible" : true, 332 | "relationships" : [ { 333 | "id" : "22" 334 | } ], 335 | "elements" : [ { 336 | "id" : "2", 337 | "x" : 329, 338 | "y" : 929 339 | }, { 340 | "id" : "17", 341 | "x" : 329, 342 | "y" : 329 343 | } ] 344 | } ], 345 | "containerViews" : [ { 346 | "softwareSystemId" : "2", 347 | "description" : "Credit Risk Services only", 348 | "key" : "creditRiskView", 349 | "order" : 5, 350 | "paperSize" : "A4_Landscape", 351 | "dimensions" : { 352 | "width" : 2816, 353 | "height" : 1166 354 | }, 355 | "automaticLayout" : { 356 | "implementation" : "Graphviz", 357 | "rankDirection" : "TopBottom", 358 | "rankSeparation" : 300, 359 | "nodeSeparation" : 300, 360 | "edgeSeparation" : 0, 361 | "vertices" : false 362 | }, 363 | "externalSoftwareSystemBoundariesVisible" : true, 364 | "elements" : [ { 365 | "id" : "8", 366 | "x" : 1933, 367 | "y" : 433 368 | }, { 369 | "id" : "9", 370 | "x" : 1183, 371 | "y" : 433 372 | }, { 373 | "id" : "10", 374 | "x" : 433, 375 | "y" : 433 376 | } ] 377 | }, { 378 | "softwareSystemId" : "2", 379 | "description" : "Fraud Risk Services Only", 380 | "key" : "fraudRiskView", 381 | "order" : 4, 382 | "paperSize" : "A4_Portrait", 383 | "dimensions" : { 384 | "width" : 2066, 385 | "height" : 2366 386 | }, 387 | "automaticLayout" : { 388 | "implementation" : "Graphviz", 389 | "rankDirection" : "TopBottom", 390 | "rankSeparation" : 300, 391 | "nodeSeparation" : 300, 392 | "edgeSeparation" : 0, 393 | "vertices" : false 394 | }, 395 | "externalSoftwareSystemBoundariesVisible" : true, 396 | "relationships" : [ { 397 | "id" : "28" 398 | }, { 399 | "id" : "27" 400 | }, { 401 | "id" : "26" 402 | }, { 403 | "id" : "25" 404 | } ], 405 | "elements" : [ { 406 | "id" : "11", 407 | "x" : 1183, 408 | "y" : 433 409 | }, { 410 | "id" : "12", 411 | "x" : 433, 412 | "y" : 1033 413 | }, { 414 | "id" : "13", 415 | "x" : 1183, 416 | "y" : 1033 417 | }, { 418 | "id" : "14", 419 | "x" : 433, 420 | "y" : 1633 421 | }, { 422 | "id" : "15", 423 | "x" : 1183, 424 | "y" : 1633 425 | }, { 426 | "id" : "16", 427 | "x" : 433, 428 | "y" : 433 429 | } ] 430 | }, { 431 | "softwareSystemId" : "2", 432 | "description" : "Fraud and shared services", 433 | "key" : "fraudSharedView", 434 | "order" : 6, 435 | "paperSize" : "A2_Landscape", 436 | "dimensions" : { 437 | "width" : 5829, 438 | "height" : 2366 439 | }, 440 | "automaticLayout" : { 441 | "implementation" : "Graphviz", 442 | "rankDirection" : "TopBottom", 443 | "rankSeparation" : 300, 444 | "nodeSeparation" : 300, 445 | "edgeSeparation" : 0, 446 | "vertices" : false 447 | }, 448 | "externalSoftwareSystemBoundariesVisible" : true, 449 | "relationships" : [ { 450 | "id" : "28" 451 | }, { 452 | "id" : "27" 453 | }, { 454 | "id" : "26" 455 | }, { 456 | "id" : "25" 457 | } ], 458 | "elements" : [ { 459 | "id" : "11", 460 | "x" : 4945, 461 | "y" : 369 462 | }, { 463 | "id" : "12", 464 | "x" : 4195, 465 | "y" : 969 466 | }, { 467 | "id" : "13", 468 | "x" : 4945, 469 | "y" : 969 470 | }, { 471 | "id" : "3", 472 | "x" : 3433, 473 | "y" : 369 474 | }, { 475 | "id" : "14", 476 | "x" : 4195, 477 | "y" : 1569 478 | }, { 479 | "id" : "4", 480 | "x" : 2683, 481 | "y" : 369 482 | }, { 483 | "id" : "15", 484 | "x" : 4945, 485 | "y" : 1569 486 | }, { 487 | "id" : "5", 488 | "x" : 1933, 489 | "y" : 369 490 | }, { 491 | "id" : "16", 492 | "x" : 4195, 493 | "y" : 369 494 | }, { 495 | "id" : "6", 496 | "x" : 1183, 497 | "y" : 369 498 | }, { 499 | "id" : "7", 500 | "x" : 433, 501 | "y" : 369 502 | } ] 503 | }, { 504 | "softwareSystemId" : "2", 505 | "description" : "Complete Risk system", 506 | "key" : "riskView", 507 | "order" : 2, 508 | "paperSize" : "A1_Landscape", 509 | "dimensions" : { 510 | "width" : 8091, 511 | "height" : 2366 512 | }, 513 | "automaticLayout" : { 514 | "implementation" : "Graphviz", 515 | "rankDirection" : "TopBottom", 516 | "rankSeparation" : 300, 517 | "nodeSeparation" : 300, 518 | "edgeSeparation" : 0, 519 | "vertices" : false 520 | }, 521 | "externalSoftwareSystemBoundariesVisible" : true, 522 | "relationships" : [ { 523 | "id" : "28" 524 | }, { 525 | "id" : "27" 526 | }, { 527 | "id" : "26" 528 | }, { 529 | "id" : "25" 530 | } ], 531 | "elements" : [ { 532 | "id" : "11", 533 | "x" : 7208, 534 | "y" : 433 535 | }, { 536 | "id" : "12", 537 | "x" : 6458, 538 | "y" : 1033 539 | }, { 540 | "id" : "13", 541 | "x" : 7208, 542 | "y" : 1033 543 | }, { 544 | "id" : "14", 545 | "x" : 6458, 546 | "y" : 1633 547 | }, { 548 | "id" : "15", 549 | "x" : 7208, 550 | "y" : 1633 551 | }, { 552 | "id" : "16", 553 | "x" : 6458, 554 | "y" : 433 555 | }, { 556 | "id" : "3", 557 | "x" : 5695, 558 | "y" : 433 559 | }, { 560 | "id" : "4", 561 | "x" : 4945, 562 | "y" : 433 563 | }, { 564 | "id" : "5", 565 | "x" : 4195, 566 | "y" : 433 567 | }, { 568 | "id" : "6", 569 | "x" : 3445, 570 | "y" : 433 571 | }, { 572 | "id" : "7", 573 | "x" : 2695, 574 | "y" : 433 575 | }, { 576 | "id" : "8", 577 | "x" : 1933, 578 | "y" : 433 579 | }, { 580 | "id" : "9", 581 | "x" : 1183, 582 | "y" : 433 583 | }, { 584 | "id" : "10", 585 | "x" : 433, 586 | "y" : 433 587 | } ] 588 | }, { 589 | "softwareSystemId" : "2", 590 | "description" : "Services shared across the organisation", 591 | "key" : "sharedServicesView", 592 | "order" : 3, 593 | "paperSize" : "A3_Landscape", 594 | "dimensions" : { 595 | "width" : 4316, 596 | "height" : 1166 597 | }, 598 | "automaticLayout" : { 599 | "implementation" : "Graphviz", 600 | "rankDirection" : "TopBottom", 601 | "rankSeparation" : 300, 602 | "nodeSeparation" : 300, 603 | "edgeSeparation" : 0, 604 | "vertices" : false 605 | }, 606 | "externalSoftwareSystemBoundariesVisible" : true, 607 | "elements" : [ { 608 | "id" : "3", 609 | "x" : 3433, 610 | "y" : 433 611 | }, { 612 | "id" : "4", 613 | "x" : 2683, 614 | "y" : 433 615 | }, { 616 | "id" : "5", 617 | "x" : 1933, 618 | "y" : 433 619 | }, { 620 | "id" : "6", 621 | "x" : 1183, 622 | "y" : 433 623 | }, { 624 | "id" : "7", 625 | "x" : 433, 626 | "y" : 433 627 | } ] 628 | }, { 629 | "softwareSystemId" : "17", 630 | "description" : "Current Transaction system", 631 | "key" : "transactionView", 632 | "order" : 7, 633 | "paperSize" : "A5_Landscape", 634 | "dimensions" : { 635 | "width" : 1858, 636 | "height" : 1558 637 | }, 638 | "automaticLayout" : { 639 | "implementation" : "Graphviz", 640 | "rankDirection" : "TopBottom", 641 | "rankSeparation" : 300, 642 | "nodeSeparation" : 300, 643 | "edgeSeparation" : 0, 644 | "vertices" : false 645 | }, 646 | "externalSoftwareSystemBoundariesVisible" : true, 647 | "relationships" : [ { 648 | "id" : "24" 649 | }, { 650 | "id" : "23" 651 | } ], 652 | "elements" : [ { 653 | "id" : "18", 654 | "x" : 704, 655 | "y" : 329 656 | }, { 657 | "id" : "19", 658 | "x" : 329, 659 | "y" : 929 660 | }, { 661 | "id" : "20", 662 | "x" : 1079, 663 | "y" : 929 664 | } ] 665 | } ], 666 | "deploymentViews" : [ { 667 | "softwareSystemId" : "2", 668 | "key" : "AmazonWebServicesDeployment", 669 | "order" : 8, 670 | "paperSize" : "A3_Landscape", 671 | "dimensions" : { 672 | "width" : 3925, 673 | "height" : 1816 674 | }, 675 | "automaticLayout" : { 676 | "implementation" : "Graphviz", 677 | "rankDirection" : "LeftRight", 678 | "rankSeparation" : 300, 679 | "nodeSeparation" : 300, 680 | "edgeSeparation" : 0, 681 | "vertices" : false 682 | }, 683 | "environment" : "Production", 684 | "animations" : [ { 685 | "order" : 1, 686 | "elements" : [ "29", "30", "31" ] 687 | }, { 688 | "order" : 2, 689 | "elements" : [ "32" ], 690 | "relationships" : [ "41" ] 691 | }, { 692 | "order" : 3, 693 | "elements" : [ "33", "34", "35" ], 694 | "relationships" : [ "36" ] 695 | }, { 696 | "order" : 4, 697 | "elements" : [ "37", "38", "39" ], 698 | "relationships" : [ "40" ] 699 | } ], 700 | "relationships" : [ { 701 | "id" : "36" 702 | }, { 703 | "id" : "40" 704 | }, { 705 | "id" : "41" 706 | } ], 707 | "elements" : [ { 708 | "id" : "33", 709 | "x" : 175, 710 | "y" : 175 711 | }, { 712 | "id" : "34", 713 | "x" : 175, 714 | "y" : 175 715 | }, { 716 | "id" : "35", 717 | "x" : 1933, 718 | "y" : 875 719 | }, { 720 | "id" : "37", 721 | "x" : 175, 722 | "y" : 175 723 | }, { 724 | "id" : "38", 725 | "x" : 175, 726 | "y" : 175 727 | }, { 728 | "id" : "39", 729 | "x" : 2833, 730 | "y" : 875 731 | }, { 732 | "id" : "29", 733 | "x" : 175, 734 | "y" : 175 735 | }, { 736 | "id" : "30", 737 | "x" : 175, 738 | "y" : 175 739 | }, { 740 | "id" : "31", 741 | "x" : 433, 742 | "y" : 875 743 | }, { 744 | "id" : "32", 745 | "x" : 1183, 746 | "y" : 875 747 | } ] 748 | } ], 749 | "configuration" : { 750 | "branding" : { 751 | "logo" : "https://raw.githubusercontent.com/practicalli/graphic-design/live/logos/practicalli-logo.png" 752 | }, 753 | "styles" : { }, 754 | "themes" : [ "https://static.structurizr.com/themes/default/theme.json", "https://static.structurizr.com/themes/amazon-web-services-2022.04.30/theme.json", "https://raw.githubusercontent.com/practicalli/structurizr/main/themes/practicalli/theme.json" ], 755 | "terminology" : { }, 756 | "lastSavedView" : "fraudSharedView" 757 | } 758 | } 759 | } --------------------------------------------------------------------------------