workspace extends ../common/finance-common-model.dsl { name "Payment system" description "Payment system is responsible for processing payments, chargebacks, refunds, and etc." model { pspSystem = softwareSystem "External payment provider systems" { tags "External" } paymentMethodGateway = softwareSystem "External payment method provider systems" { tags "External" } !extend paymentSystem { !docs docs paymentProviderDb = container "Payment provider database" { description "Stores payment provider related data" technology "MySQL" tags "Google Cloud Platform - Compute Engine" "Database" "MySQL" } paymentRouterDb = container "Payment router database" { description "Stores payment routing data" technology "MySQL" tags "Google Cloud Platform - Compute Engine" "Database" "MySQL" } paymentKV = container "PaymentKV" { description "Payment provider key-value storage" technology "Aerospike" tags "Google Cloud Platform - Compute Engine" "Database" "Aerospike" } } !extend mainKafkaCluster { personalOffersResponseTopic = container "Personal-offers response topic" { tags "Kafka" "Topic" technology "Kafka topic" description "Contains response for user with his personal offers" } } # Payment system paymentSystem -> pspSystem "Make purchase" "HTTPS" # Personal-offers sendPersonalOffersResponseRl = personalOffers -> personalOffersResponseTopic "Send personal offers response" "Kafka" { tags "Kafka" } # PaymentRouter getPaymentMethodCampaigns = paymentRouter -> paymentRouterDb "Get payment method campaigns" "SQL" resolveAudiencesRl = paymentRouter -> audienceSystem "Resolve audiences" "HTTPS" getMethodSavedDataRl = paymentRouter -> paymentProvider "Get method savedData" "HTTPS" getOfferPricePointsRl = paymentRouter -> personalOffers "Get offer price points" "HTTPS" getTicketsRL = paymentRouter -> paymentProvider "Calculate taxes and create tickets" "HTTPS" paymentRouter -> offerManagementSystem "Get missing offers" "HTTPS" paymentRouter -> paymentMethodGateway "Get external payment methods" "HTTPS" consumePersonalOffersResponseRl = personalOffersResponseTopic -> paymentRouter "Receive personal offers response" "Kafka" { tags "Kafka" } # PaymentProvider paymentProvider -> paymentProviderDb "Reads/stored saved payment method data" getDataByTicketRl = paymentProvider -> paymentKV "Get data by ticket" "Aerospike client" "Cache" storeDataByTicketRl = paymentProvider -> paymentKV "Store data by ticket" "Aerospike client" "Cache" paymentProvider -> personalOffers "Validate request" "HTTPS" paymentProvider -> paymentProviderDb "Store purchase data" "SQL" paymentProvider -> finance "Process balances" "Kafka" paymentProvider -> pspSystem "Process purchase" "HTTPS" } views { systemLandscape "SystemLandscape" "Payment system landscape" { include * animation { liveOps offerRecommendationSystem audienceSystem offerManagementSystem financeSystem user paymentSystem mainKafkaCluster financeKafkaCluster } autoLayout } systemcontext paymentSystem "paymentSystemContext" { include * autoLayout } dynamic paymentSystem "get-personal-offers-flow" { title "Get personal offers flow" description "Describes steps to get personal offers" getPersonalizedOffersRl sendPersonalOffersResponseRl getPaymentMethodsRl { { consumePersonalOffersResponseRl } { getOfferPricePointsRl } } } dynamic paymentSystem "get-payment-methods-flow" { title "Get payment methods flow" description "Describes steps to resolve available payment methods for user" getPersonalizedOffersRl sendPersonalOffersResponseRl getPaymentMethodsRl getPaymentMethodCampaigns resolveAudiencesRl paymentRouter -> paymentMethodGateway getMethodSavedDataRl { { consumePersonalOffersResponseRl } { getOfferPricePointsRl } } paymentRouter -> offerManagementSystem getTicketsRL storeDataByTicketRl } dynamic paymentSystem "purchase-request" { user -> paymentProvider getDataByTicketRl paymentProvider -> personalOffers paymentProvider -> pspSystem pspSystem -> paymentProvider paymentProvider -> financeSystem autoLayout description "Make purchase request" } } }