workspace "Unified Exports" "Unified Architecture" { model { user = person "User" "A UNI-Cloud user who wants to export survey data to a file or external destination." # ── External systems ────────────────────────────────────────────────── frontend = softwaresystem "Frontend" "UNI-Cloud web application. Hosts the export UI and the live PDF preview canvas." "External" surveyservice = softwaresystem "Survey Service" "Provides survey features, layers, project data." "External" unistorage = softwaresystem "UNI-Storage" "Object storage for rendered export artifacts." "External" telekom = softwaresystem "Telekom" "" "External" group "Export Service" { exportservice = softwaresystem "Export Service" "Converts system data in multiple file formats, and delivers them to configured destinations." { api = container "API" "HTTP entry point and composition root. Registers all format modules and infrastructure into DI. Routes commands via Wolverine." "ASP.NET Core / FastEndpoints / Wolverine" "Api" core = container "Core" "Contains state management, shared entities, business logic and domain events." "C# / Wolverine" "Core" pdf = container "PDF Module" "PDF and GeoPDF rendering. Template-driven: BoorProfiel,CrossSection and Map&Details." "C#" "FormatModule" csv = container "CSV Module" "CSV, TXT, and Organise CSV. CSV and TXT share configurable delimiter and column selection. Organise CSV uses a fixed schema." "C#" "FormatModule" cad = container "CAD Module" "DXF and DWG rendering. Optional NLCS++ coding convention applied as a modifier on the output layer structure." "C# / netDxf" "FormatModule" geojson = container "GeoJSON Module" "GeoJSON feature collection rendering. Used by Telekom destination and for map preview." "C#" "FormatModule" landxml = container "LandXML Module" "LandXML surfaces, alignments and points for survey software interchange." "C# / NetTopologySuite" "FormatModule" # User user -> frontend "Starts wizard, fills steps, submits export" "HTTPS" frontend -> api "Manages wizard state, requests preview, polls status" "REST / HTTPS" # API composition root api -> core "Dispatches commands and queries" "Wolverine" "Primary" api -> pdf "Registers PDF + GeoPDF formats, step processors, mappers" api -> csv "Registers CSV, TXT, Organise CSV formats, step processors, mappers" api -> cad "Registers DXF, DWG formats, step processors" api -> geojson "Registers GeoJSON format" api -> landxml "Registers LandXML format" # Format modules → Core (implement interfaces) pdf -> core "Implements IExportFormat, IStepProcessor, IStepMapper" csv -> core "Implements IExportFormat, IStepProcessor, IStepMapper" cad -> core "Implements IExportFormat, IStepProcessor, IStepMapper" geojson -> core "Implements IExportFormat" landxml -> core "Implements IExportFormat" # Core → external systems core -> surveyservice "Fetches features and elevation data via IExportDataProvider" "MQTT / RabbitMQ" core -> unistorage "Stores rendered artifacts via IArtifactStore" "HTTPS / S3" core -> telekom "Delivers GeoJSON exports via TelekomDestination" "REST / HTTPS" } } } views { systemContext exportservice "SystemContext" { include * autoLayout lr title "Export Service — System Context" } container exportservice "Containers" { include * autoLayout lr title "Export Service — Containers" } styles { element "Person" { shape Person background #1168BD color #FFFFFF } element "External" { background #6B6B6B color #FFFFFF } element "Software System" { background #1168BD color #FFFFFF } element "Container" { background #438DD5 color #FFFFFF } element "Api" { background #2471A3 color #FFFFFF shape RoundedBox } element "Core" { background #1A5276 color #FFFFFF shape RoundedBox } element "FormatModule" { background #1E8449 color #FFFFFF shape Component } relationship "Primary" { color #E74C3C thickness 3 } } theme default } configuration { scope softwaresystem } }