workspace "Revv" { !identifiers hierarchical model { Selleruser = person "Seller" adminuser = person "Admin" auctionhouse = person "Auction House" revv = softwareSystem "Revv" { !adrs doc/adr apimc = container "API Management API" { auctionhouse -> this Selleruser -> this } inventoryimages = container "Inventory Images" { technology "Azure Blob Storage" tags "Microsoft Azure - Azure Blob Storage" } web = container "Web App" { group "Seller Features" { useradmin = component "User Admin" { technology "HTML, CSS, JavaScript, TypeScript" Selleruser -> this adminuser -> this } inventory = component "Inventory" { technology "HTML, CSS, JavaScript, TypeScript" Selleruser -> this adminuser -> this this -> inventoryImages : "Views images with url to blob" } reporting = component "Reporting" { technology "HTML, CSS, JavaScript, TypeScript" Selleruser -> this adminuser -> this } realtime = component "Real Time" { technology "SignalR, TypeScript, C#" } } group "Admin Features" { accountmanager = component "Account Manager" { technology "HTML, CSS, JavaScript, TypeScript" adminuser -> this } auction = component "Auction Admin" { technology "HTML, CSS, JavaScript, TypeScript" adminuser -> this } } } api = container "Revv API" { component "API" { technology "C#, .NET 8" web.useradmin -> this web.inventory -> this web.reporting -> this web.accountmanager -> this web.auction -> this Selleruser -> this "API Access" apimc -> this "API Management Access" } } adminapi = container "Revv Admin API" { component "API" { technology "C#, .NET 8" } web -> this } userdatabase = container "User Collection" { technology "Mongo DB" tags "db" } userservice = container "User Service" { userserviceapi = component "Web API" { technology "C#, .NET 8" adminapi -> this "Manages Users" this -> userdatabase "CRUD" } } oauthdatabase = container "Auth Collection" { technology "Azure SQL Server" tags "db" } oauth = container "OAUTH Server" { id8 = component "Identity Server" { technology "IdentityServer 8, C#" api -> this "token validation" web -> this "authentication" Selleruser -> this "JWT tokens for APIs" this -> userservice.userserviceapi "Access Users" this -> oauthdatabase "Reads / Writes" } } inventorychangedqueue = container "Inventory Changed Topic" { technology "Queue" tags "Microsoft Azure - Service Bus, queue" } inventorydb = container "Inventory Collection" { technology "Mongo DB" tags "db" } inventory = container "Inventory Service" { api = component "Web API" { technology "C#, .NET 8" revv.api -> this "Manages Inventory" } imagesizer = component "Image Management" { technology "C#, .NET 8, SkiaSharp" this -> inventoryimages "Reads / Write Images" api -> this "CRUD and Resizem, Get Uris to Blob Image" } reader = component "Change Feed Reader" { technology "Mongo Change Feed, Web Job" inventorydb -> this "Processes changes" api -> this "Background Worker" this -> inventorychangedqueue "Writes" } statechangedreader = component "State Changed Reader" { technology "C#, .NET 8" this -> inventorydb "Updates State" api -> this "Background Worker" } invmanagement = component "Inventory Management" { technology "C#, .NET 8" this -> inventorydb "CRUD" api -> this "Logic for Inventory" } } auctionincommingqueue = container "Auction Incomming From Auction House Topic" { technology "Queue" tags "Microsoft Azure - Service Bus, queue" } auctionoutgoingqueue = container "Auction Outgoing To Auction House Topic" { technology "Queue" tags "Microsoft Azure - Service Bus, queue" } auctionintegrationdb = container "Auction Integration Collection" { technology "Mongo DB" tags "db" } auctionintegrationapi = container "Auction Integration API" { api = component "API" { technology "C#, .NET 8" auctionhouse -> this "API Access" this -> auctionincommingqueue "Writes For Processing" this -> auctionoutgoingqueue "Writes For Sending" adminapi -> this "Manages Auction House Connections" apimc -> this "API Management Access" } !docs md auctionimcommingreader = component "Incomming Reader" { technology "C#, .NET 8" this -> auctionincommingqueue "Reads" api -> this "Background Worker" this -> inventory.api "Updates Inventory Auction Results" } transaltor = component "Translator" { technology "C#, .NET 8" this -> auctionintegrationdb "Reads Mappings, URLS, etc..." } sender = component "Outgoing Sender" { technology "C#, .NET 8" this -> auctionhouse "Calls APIs at Auction House" } component "Outgoing Reader" { technology "C#, .NET 8" api -> this "Background Worker" this -> transaltor "Perform Translations" this -> sender "Process Sending Data" this -> auctionoutgoingqueue "Reads" } } Sellerconfigdb = container "Seller Config Collection" { technology "Mongo DB" tags "db" } Sellerconfig = container "Account Management Service" { api = component "Web API" { technology "C#, .NET 8" this -> Sellerconfigdb "Read / Writes" adminapi -> this "Manages Sellers" inventory -> this "Looks up DB Connections per Seller" } } outqueue = container "Real Time Topic" { technology "Queue" tags "Microsoft Azure - Service Bus, queue" this -> revv.web.realtime "Sends To" } notificationdb = container "Notification Collection" { technology "Mongo DB" tags "db" } notificationdeliverydb = container "Notification Delivery Collection" { technology "Mongo DB" tags "db" } smtp = container "SMTP Relay" { technology "SMTP" tags "SMTP" } notificationdeliverytopic = container "Notification Deliver Topic" { technology "Queue" tags "Microsoft Azure - Service Bus, queue" } notificationdelivery = container "Notification Deliver System" { api = component "Host API" { technology "C#, .NET 8" revv.api -> this "Manages Notification Deliveries" this -> notificationdeliverydb "Manages Notification Endpoints and Tokens" } emailsender = component "Email Sender" { this -> smtp "Sends Emails" } webhooksender = component "Webhook Sender" { this -> notificationdeliverydb "Reads endpoints / security token" this -> Selleruser "Sends Notifications" } realtimesender = component "Real Time Sender" { this -> outqueue "Sends" } deliveryreader = component "Deliver Reader" { this -> notificationdeliverytopic "Read Items" api -> this "Background Worker" this -> emailsender "Sends Emails" this -> webhooksender "Sends Webhook Data" this -> realtimesender "Sends Real Time Data" } } notification = container "Notification Service" { api = component "Web API" { technology "C#, .NET 8" revv.api -> this "Manages Notification Templates" this -> notificationdb "CRUD" } templating = component "Template Engine" { technology "C#, .NET 8" this -> notificationdb "Reads Templates" } deliverywriter = component "Delivery Writer" { technology "C#, .NET 8" this -> notificationdeliverytopic "Writes" } invchangedreader = component "Inventory Changed Reader" { technology "C#, .NET 8" inventorychangedqueue -> this "Reads" this -> templating "Processes" this -> deliverywriter "Writes" api -> this "Background Worker" } } auctionchangedqueue = container "Auction Changed Topic" { technology "Queue" tags "Microsoft Azure - Service Bus, queue" } auctiondb = container "Auction Collection" { technology "Mongo DB" tags "db" } auction = container "Auction Service" { api = component "Web API" { technology "C#, .NET 8" revv.api -> this "Manages Auctions" this -> auctiondb "CRUD" } reader = component "Change Feed Reader" { technology "Mongo Change Feed, Web Job" auctiondb -> this "Processes changes" api -> this "Background Worker" this -> auctionchangedqueue "Writes" } } decisionmaker = container "Decision Maker" { host = component "API Host" { technology "C#, .NET 8" } logic = component "Decision Logic Controller" { technology "C#, .NET 8" } inventoryupdater = component "Inventory Updater" { technology "C#, .NET 8" this -> inventory.api "Updates Inventory" } auctionchangedreader = component "Auction Changed Reader" { technology "C#, .NET 8" this -> revv.auctionchangedqueue "Reads" this -> inventoryupdater "Updates Assigned Auction" this -> logic "Decides on Auction" host -> this "Background Worker" } invchangedreader = component "Inventory Changed Reader" { technology "C#, .NET 8" this -> revv.inventorychangedqueue "Reads" this -> inventoryupdater "Updates Assigned Auction" this -> logic "Decides on Auction" host -> this "Background Worker" } } statechangedqueue = container "State Changed Topic" { technology "Queue" tags "Microsoft Azure - Service Bus, queue" inventory.statechangedreader -> this "Reads" } statemanagementdb = container "State Collection" { technology "Mongo DB" } statemanagement = container "State Management" { api = component "Web API" { technology "C#, .NET 8" this -> statemanagementdb "CRUD" } reader = component "Change Feed Reader" { technology "Mongo Change Feed, Web Job" this -> statemanagementdb "Processes changes" api -> this "Background Worker" this -> statechangedqueue "Writes" } invchangedreader = component "Inventory Changed Reader" { technology "C#, .NET 8" this -> revv.inventorychangedqueue "Reads" this -> statemanagementdb "Updates State" api -> this "Background Worker" } auctionchangedreader = component "Auction Changed Reader" { technology "C#, .NET 8" this -> revv.auctionchangedqueue "Reads" this -> statemanagementdb "Updates State" api -> this "Background Worker" } } } dev = deploymentEnvironment "Dev" { group "Public Access" { blob = deploymentNode "Blob Storage" { tags "Microsoft Azure - Azure Blob Storage" containerInstance revv.inventoryimages { tags "blob" } } apim = deploymentNode "API Management" { tags "Microsoft Azure - API Management" apimc = containerInstance revv.apimc { tags "API Management" } } pub = deploymentNode "App Service Plan Public" { tags "Microsoft Azure - App Service Plans" deploymentNode oauth "" "App Service" { tags "Microsoft Azure - App Services" containerInstance revv.oauth } deploymentNode revv.web { tags "Microsoft Azure - App Services" containerInstance revv.web } } } sb = deploymentNode "Service Bus" { tags "Microsoft Azure - Azure Service Bus" containerInstance revv.outqueue { tags "queue" } containerInstance revv.notificationdeliverytopic { tags "queue" } containerInstance revv.inventorychangedqueue { tags "queue" } containerInstance revv.auctionchangedqueue { tags "queue" } containerInstance revv.statechangedqueue { tags "queue" } containerInstance revv.auctionincommingqueue { tags "queue" } containerInstance revv.auctionoutgoingqueue { tags "queue" } } i1 = deploymentNode "App Service Plan" { deploymentNode revv.auctionintegrationapi { tags "Microsoft Azure - App Services" containerInstance revv.auctionintegrationapi { } } deploymentNode notificationdelivery { tags "Microsoft Azure - App Services" containerInstance revv.notificationdelivery { } } deploymentNode api { tags "Microsoft Azure - App Services" containerInstance revv.api { } } deploymentNode adminapi "" "App Service" { tags "Microsoft Azure - App Services" containerInstance revv.adminapi { } } deploymentNode userservice "" "App Service" { tags "Microsoft Azure - App Services" containerInstance revv.userservice { } } deploymentNode inventory "" "App Service" { tags "Microsoft Azure - App Services" containerInstance revv.inventory { } } deploymentNode Sellerconfig "" "App Service" { tags "Microsoft Azure - App Services" containerInstance revv.Sellerconfig { } } deploymentNode notification "" "App Service" { tags "Microsoft Azure - App Services" containerInstance revv.notification { } } deploymentNode auction "" "App Service" "" { tags "Microsoft Azure - App Services" containerInstance revv.auction { } } deploymentNode decisionmaker "" "App Service" { tags "Microsoft Azure - App Services" containerInstance revv.decisionmaker { } } deploymentNode statemanagement "" "App Service" { tags "Microsoft Azure - App Services" containerInstance revv.statemanagement { } } } mongo = deploymentNode "Mongo DB" { tags "db" containerInstance revv.notificationdeliverydb "" "Mongo Collection" { tags "Mongo DB Collection, db" } containerInstance revv.inventorydb "" "Mongo Collection" { tags "Mongo DB Collection, db" } containerInstance revv.userdatabase "" "Mongo Collection" { tags "Mongo DB Collection, db" } containerInstance revv.notificationdb "" "Mongo Collection" { tags "Mongo DB Collection, db" } containerInstance revv.auctiondb "" "Mongo Collection" { tags "Mongo DB Collection, db" } containerInstance revv.statemanagementdb "" "Mongo Collection" { tags "Mongo DB Collection, db" } containerInstance revv.Sellerconfigdb "" "Mongo Collection" { tags "Mongo DB Collection, db" } containerInstance revv.auctionintegrationdb "" "Mongo Collection" { tags "Mongo DB Collection, db" } } } } configuration { scope softwareSystem } views { systemLandscape all { include * autoLayout } systemContext revv { include * autoLayout } component revv.notificationdelivery { include * autoLayout } container revv { include * autoLayout } component revv.web { include * autoLayout } component revv.api { include * autoLayout } component revv.auctionintegrationapi { include * autoLayout } component revv.inventory { include * autoLayout } component revv.notification { include * autoLayout } component revv.statemanagement { include * autoLayout } component revv.auction { include * autoLayout } component revv.decisionmaker { include * autoLayout } component revv.oauth { include * autoLayout } deployment * dev devdeployment "Dev Deployment" { include * } theme https://static.structurizr.com/themes/microsoft-azure-2023.01.24/theme.json styles { element "Person" { fontSize 22 shape Person } element "Software System" { shape RoundedBox } element "Container" { shape RoundedBox background #1168bd color #ffffff } element "Component" { shape RoundedBox } element "db" { shape Cylinder } element "queue" { shape Pipe } } } }