workspace "Complaint Investigation" "Data access service in Platform to be used by internal clients (not an interoperability service for external partners) that aggregates data from various domains" { /* Load the Architectural Decision Records of the project. These can be one or multiple files (each decision should have an independent record). File naming convention -title_word_1-title_word_n.md (number should be 0001 .. 0100 .. 0954 ..). NOTE: file format is Markdown */ !adrs adrs /* Load the documentation associated with the project / solution. Basically the documentation_sad should contain all the chapters, in order, that composes the full SAD with reference to the diagrams as well. File naming convention -title_word_1-title_word_n.adoc (number should be 0001 .. 0100 .. 0954 ..). NOTE: file format is AsciiDoc */ !docs documentation_sad model { // TODO: after moving to Roche ecosystem these can be referenced from the landscape project !! /* model properties - recommended setting the group separator so nested groups can be defined */ properties { "structurizr.groupSeparator" "/" } /* Here we describe a few typical 'external' actors for the solution / system. These are persons and they can be useful for the solution or not, depending on the purpose (service used by other solutions / apps / backends) Other types of users can be defined, these are the typical ones only */ Pwd = person "PwD" "Patient with diabetes is the end user of the solution / system; is always considered an 'external' user" { tags "RocheExt" } hcp = person "HCP" "The health care professional is the medical practitioner treating the patient; is always considered an 'external' user" { tags "RocheExt" } /* 3rd party companies that have partnered with Roche to extend their offering and benefit from it's expertise */ partner = softwareSystem "Partner" "Partner software system" /* Software systems that are part of the Roche ecosystem but external to the specific ART or built by external entities (ex: "off the shelf" software) */ ext_sw = softwareSystem "Data Client" "Software system that retrieves data from Platform for displaying, correlating with internal data or further processing the data (ex: Morpheus desktop app)" { tags "RocheExt" } mobile_app = softwareSystem "Mobile App" "Mobile application used by Patient with diabetes to monitor his/her condition" { tags "RocheMob" } group "Roche Diabetes Care" { /* Here we describe a few typical 'internal' actors for the solution / system. These are persons and they can be useful for the solution or not, depending on the purpose (service used by other solutions / apps / backends) Other types of users can be defined, these are the typical ones only */ dss = person "DSS" "Digital support service user is a special Roche internal user that has access to production environment and can perform various maintenance and corrective tasks" dops = person "DevOps" "The DevOps user is an internal Roche user responsible for the operation and maintenance of the infrastructure" /* Here are described some generic software systems in the Roche ecosystem These are not exhaustive, just a few general ones used by all the solutions The solution specifics and it's dependencies have to be added below The systems below as well as the solution specific ones must follow the naming conventions of the Roche Architectural Standard as defined here https://confluence.rochedc.accentureanalytics.com/pages/viewpage.action?pageId=148046784 */ group "Infrastructure" { app_config = softwareSystem "Infra.AppConfig" "AWS managed service to store and retrieve parameter sets" { tags "Internal" } observability = softwareSystem "Infra.Observability" "Software system to view logs, traces and metrics in a unified manner (DataDog)" { tags "Internal" } } group "RDCP" { ppm = softwareSystem "RDCP.PlatformPatientManagement" "The solution responsible for storing patient demographic data (incl. IDs associated with the patient)" { tags "Internal" } } apiGW = softwareSystem "RDCP.APIGateway" "The solution responsible for exposing the APIs of the Platform to external partners" { tags "RocheGateway" } /* Here we describe actors specific for the solution */ investigator = person "Complaint Investigator" "Internal Roche support team member responsible for investigating customer complaints" group "Platform" { complaint_investigation = softwareSystem "Platform.ComplaintInvestigationService" "Data access service in Platform to be used by internal clients (not an interoperability service for external partners) that aggregates data from various domains" { complaint_investigation_interface = container "ComplaintInvestigation.API.Pod" "Service API interface" "Java" { tags "java" } redis = container "ComplaintInvestigation.ElasticCache" "In-memory data storage / distributed cache" "Redis" { tags "es" } complaint_investigation_dsr = container "Platform.ComplaintInvestigation.DataSearch&Retrieval.Pod" "Retrieve from Platform data domains and store's into cache" "Java" { tags "java" } fhir_sqs = container "ComplaintInvestigation.FHIR.SQS" "Receive and queue messages of new or updated data" "AWS.SQS" { tags "sqs" } appsett_sqs = container "ComplaintInvestigation.AppSettings.SQS" "Receive and queue messages of new or updated data" "AWS.SQS" { tags "sqs" } notif_sns = container "ComplaintInvestigation.Notifications.SNS" "Send data batches to subscribed clients" "AWS.SNS" { tags "sns" } acc_del_sqs = container "ComplaintInvestigation.AccountDeletion.SQS" "Receive and queue messages of account deletion requests" "AWS.SQS" { tags "sqs" } url https://rdcdigital.atlassian.net/wiki/spaces/RD/pages/11682069/Solution+Architecture+Complaint+Investigation+Service+-+Common+Services properties { git_repo https://git.rochedevops.accentureanalytics.com/cs/cs-morpheus-service-cia.git arch_shared_gdrive https://drive.google.com/drive/u/1/folders/10k5lzxNVN9dEOxlfdYhEzLRlaxRMWoW3 team "Common Services" data_domain "Not a data holder" } } fhir = softwareSystem "Platform.FHIRStack" "Platform solution / data domain to store Diagnostics & Medication data" { properties { info "FHIRstack returns data in JSON format" json_def_url "my_url" team "FHIR Stack" data_domain "Diagnostics & Medication" } tags "data-domain" "Internal" } appsettings = softwareSystem "Platform.ApplicationSettings" "Platform solution to store application settings for Roche mobile applications (ex: Confidence)" { properties { info "Application settings are stored in JSON format" json_def_url "my_url" team "Common Services" data_domain "Application Settings" } tags "data-domain" "Internal" } acc_del_sns = element "Platform.AccountDeletion.SNS" "AWS SNS topic used to send messages of account deletion requests" "AWS.SNS" { tags "sns" } ciamcm = softwareSystem "Platform.CIAMCM" "Platform solution to manage customer identity and concent" { tags "Internal" } } } /* Relationships between the components */ dss -> ext_sw "Uses" "View" { tags "" } investigator -> ext_sw "Uses" "View" { tags "" } ext_sw -> apiGW "Get data from" "JSON/HTTP" { tags "" } apiGW -> complaint_investigation_interface "Get data from" "JSON/HTTP" { tags "" } Pwd -> mobile_app "Install or use the" "install / update / pair with phd" { tags "" } mobile_app -> complaint_investigation_interface "Send data when install/update/pair to" "JSON/HTTP" { tags "" } complaint_investigation_interface -> ppm "Identify PwD using" "JSON/HTTP" { tags "" } complaint_investigation_interface -> complaint_investigation_dsr complaint_investigation_interface -> app_config "Get configuration from" "" { tags "tcp" } complaint_investigation_interface -> observability "Send logs to" "" { tags "tcp" } complaint_investigation_dsr -> redis "Store data in" "" { tags "tcp" } redis -> complaint_investigation_interface "Get data from" "" { tags "tcp" } complaint_investigation_dsr -> fhir "Get medical data from" "JSON/HTTP" { tags "" } complaint_investigation_dsr -> appsettings "Get application settings from" "JSON/HTTP" { tags "" } complaint_investigation_dsr -> app_config "Get configuration from" "JSON/HTTP" { tags "tcp" } complaint_investigation_dsr -> observability "Send logs to" "JSON/HTTP" { tags "tcp" } complaint_investigation_dsr -> ciamcm "Get consent data from" "JSON/HTTP" { tags "" } // notifications fhir -> fhir_sqs "Notify of new data to" "JSON/Notification" { tags "sns" } appsettings -> appsett_sqs "Notify of new data to" "JSON/Notification" { tags "sns" } acc_del_sns -> acc_del_sqs "Push messages to" "JSON/Notification" { tags "sns" } ciamcm -> acc_del_sqs "Notify of consent changes to" "JSON/Notification" { tags "sns" } fhir_sqs -> complaint_investigation_dsr "New message enqued on" "JSON/Notification" { tags "sqs" } appsett_sqs -> complaint_investigation_dsr "New message enqued on" "JSON/Notification" { tags "sqs" } acc_del_sqs -> complaint_investigation_dsr "New message enqued on" "JSON/Notification" { tags "sqs" } complaint_investigation_dsr -> notif_sns "Publish batched data to" "JSON/Notification" { tags "sns" } notif_sns -> ext_sw "Deliver published data to" "JSON/Notification" { tags "sns" } } views { /* Static configuration, styling and properties for views */ properties { "plantuml.url" "https://kroki.io/plantuml" "plantuml.format" "png" "structurizr.softwareSystemBoundaries" "true" "structurizr.enterpriseBoundary" "true" "structurizr.tooltips" "true" } branding { logo documentation_sad/images/static/logo_roche.png } theme https://structurizr.moebiusol.eu/workspace/1/theme styles { element "Internal" { background grey color #ffffff } element "RocheGateway" { shape RoundedBox width 1900 background #6C6477 } element "CGM Patch" { shape Circle color #0038a8 } element "MicroPump" { shape RoundedBox color #c2b280 } element "RocheHCC" { shape Ellipse background #8fbc8f stroke #ff0000 } element "RocheWeb" { shape WebBrowser } element "RocheExt" { background #6C6477 } element "Group" { background #d3d3d3 color #4C4C4C stroke #4C4C4C strokeWidth 10 icon library/icons/rdc_logo.png } element "interface" { background #BD6711 color #ffffff } element "python" { icon library/icons/python.png } element "nodejs" { icon library/icons/nodejs.png } element "java" { icon library/icons/java.png } element "ios_android" { icon library/icons/ios_android.jpg } element "sqs" { shape Cylinder icon library/icons/aws_sqs.png } element "sns" { shape Pipe icon library/icons/aws_sns.png } element "kinesis_stream" { shape Pipe icon library/icons/aws_kinesis_stream.png } element "lambda" { shape RoundedBox icon library/icons/aws_lambda.png } element "rds" { shape Cylinder icon library/icons/aws_rds.png } element "s3" { shape Cylinder icon library/icons/aws_s3.png } element "es" { shape Cylinder icon library/icons/aws_es.png } element "unclear" { background red color green } element "not-used" { background #d3d3d3 color #4C4C4C stroke #4C4C4C strokeWidth 10 opacity 40 } relationship "Relationship" { style solid routing Orthogonal position 65 } relationship "sns" { color blue } relationship "sqs" { color red } relationship "tcp" { color green } relationship "kinesis" { color #8a2be2 } relationship "push" { style dashed color green } relationship "unclear" { color orange thickness 5 } relationship "not-used" { opacity 60 } } /* END - Static configuration and properties for views */ /* Structurizr diagrams */ systemcontext "Complaint_Investigation" { include * dss investigator ext_sw } container "Complaint_Investigation" { include * } /* externaly rendered diagrams */ image * "01-all_flows_sequence" { plantuml complaint_investigation.puml title "Complaint Investigation Service - Combined Flows (Full Capabilities)" } image * "02-get_data_sequence" { plantuml complaint_investigation_sequence.puml title "Complaint Investigation Service - Get PwD data on-demand" } image * "03-notify_subscribers_sequence" { plantuml complaint_investigation_notification.puml title "Complaint Investigation Service - Send batched data to subscribers" } } }