Generated: 2026-01-06
Source: Deep GitHub repository analysis via code scanning
The Planet Portal (pp-*) ecosystem is a .NET-based microservices architecture built primarily with:
Last scanned: 2026-01-09 | Total repos: 42
| Repository | Language | Status | Tech Stack | Description |
|---|---|---|---|---|
| pp-ui | TypeScript | ✅ Active | React 19, Vite, TailwindCSS, Apollo GraphQL, Auth0 | Main merchant portal dashboard/UI |
| pp-payments-api | C# | ✅ Active | .NET 8, MongoDB, Redis, Hangfire, Kafka | Payment processing API - transactions, refunds, captures |
| pp-reports-api | C# | ✅ Active | .NET 8, MongoDB | Report generation and export API |
| pp-outbox | C# | ✅ Active | .NET 8 | Outbox pattern implementation for reliable messaging |
| pp-specifications | Liquid | ✅ Active | OpenAPI/Liquid templates | API specifications for Planet Portal services |
| pp-ui-components | TypeScript | ✅ Active | React, TypeScript | Shared UI component library |
| pp-ui-types | TypeScript | ✅ Active | TypeScript | Shared TypeScript types |
| pp-ui-utils | TypeScript | ✅ Active | TypeScript | Shared utilities |
| pp-ui-users | TypeScript | ✅ Active | React, TypeScript | User management micro-frontend |
| pp-ui-storybook | TypeScript | ✅ Active | Storybook, React | Component documentation/storybook |
| pp-charts | Smarty | ✅ Active | Helm | Helm charts for all PP services |
| pp-workflows | Python | ✅ Active | GitHub Actions | Reusable GitHub workflows |
| pp-reusable-workflows | YAML | ✅ Active | GitHub Actions | Frontend reusable workflows |
| pp-snowflake-int | Smarty | ✅ Active | Kafka-Connect, ArgoCD | Snowflake integration connectors |
| argocd-pp | Shell | ✅ Active | ArgoCD, Helm | GitOps deployment values |
| Repository | Language | Status | Tech Stack | Description |
|---|---|---|---|---|
| planet-merchant-activation | TypeScript | ✅ Active | TypeScript | Service that will activate merchants after onboarding |
| gateway-service-activation | C# | ✅ Active | .NET | SVA projects for activating merchants on integra/3CDB |
| gateway-service-activation-frontend | TypeScript | ✅ Active | Angular | SVA angular user interface for activating merchants within 3cdb |
| merchantactivation-infra | HCL | ⚠️ Stale | Terraform | Merchant activation infrastructure |
| merchant-activation-rabbitmq | - | ✅ Active | Ansible | RabbitMQ cluster configuration for merchant activation |
| Repository | Language | Status | Tech Stack | Description |
|---|---|---|---|---|
| integra-portal-web | C# | ✅ Active | .NET, ASP.NET | Integra Portal web application |
| Planet.Windows.LogonForm | C# | ✅ Active | WPF, .NET | Windows logon form for Integra Portal |
| Repository | Language | Status | Tech Stack | Description |
|---|---|---|---|---|
| mas-webapps | JavaScript | ✅ Active | Java 17, Spring 6, JSP, MSSQL | MAS Web Portal for merchants/partners |
| Repository | Language | Status | Tech Stack | Description |
|---|---|---|---|---|
| PaymentsPortal | Java | ✅ Active | Java 17, Spring 6, Tomcat | 3C Payments Portal |
| csp-web-portal | C# | ⚠️ Stale | .NET, C# | CSP Web Application Portal |
| csp-database-portalusers | TSQL | ⚠️ Stale | SQL Server | CSP Portal users database |
| csp-database-datawarehouse | TSQL | ⚠️ Stale | SQL Server | CSP reporting datawarehouse |
| Repository | Language | Status | Description |
|---|---|---|---|
| portal-ui | TypeScript | 🗄️ Archived | Legacy unified portal UI (replaced by pp-ui) |
| portal-api | Java | 🗄️ Archived | Legacy portal backend (replaced by pp-payments-api) |
| merchant-portal-web | JavaScript | 🗄️ Archived | Legacy merchant portal web |
| merchant-portal-backend | Java | 🗄️ Archived | Legacy merchant portal backend |
| merchant-portal-ui | - | 🗄️ Archived | Legacy merchant portal UI |
| merchant-auth-api | Java | 🗄️ Archived | Legacy merchant auth (replaced by Auth0) |
| Repository | Language | Status | Tech Stack | Description |
|---|---|---|---|---|
| PaymentsPortal-Automation-Tests | Java | ✅ Active | Java, Selenium | PaymentsPortal E2E tests |
| te-testautomation-portal-backend | Java | ⚠️ Stale | Java | TE Portal backend tests |
| te-testautomation-portal-frontend | - | ⚠️ Stale | - | TE Portal frontend tests |
| te-testautomation-portal-backend-plugin | Java | ⚠️ Stale | Java | TE Portal backend plugin |
| portal-test | Java | ⚠️ Stale | Java | Legacy portal tests |
| Repository | Language | Status | Description |
|---|---|---|---|
| portal-toolbox | Dockerfile | ⛔ Stale | Utility container for 3C portal (2022) |
| EnterpriseCustomerManagement.WebPortal- | TypeScript | ⛔ Stale | ECM Web Portal (2022) |
Last scanned: 2026-01-09
The service acts as an aggregator/orchestrator connecting to 7+ downstream systems:
┌─────────────────────────────────────────────────────────────────┐
│ pp-payments-api │
│ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ Gateway Clients ││
│ │ ││
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ ││
│ │ │ Datatrans │ │ Integra │ │ DigitalGateway(DGW) │ ││
│ │ │ Gateway │ │ Gateway │ │ Gateway │ ││
│ │ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ ││
│ │ │ │ │ ││
│ │ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────────┴──────────┐ ││
│ │ │ Web2Pay │ │ IntegraPort │ │ IAM Gateway │ ││
│ │ │ (Legacy) │ │ al API │ │ │ ││
│ │ └─────────────┘ └─────────────┘ └─────────────────────┘ ││
│ │ ││
│ │ ┌─────────────────────────────────────────────────────────┐││
│ │ │ Auth0 Clients (2 instances): │││
│ │ │ - Primary Auth0 (general M2M) │││
│ │ │ - MerchantActivation Auth0 │││
│ │ └─────────────────────────────────────────────────────────┘││
│ └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘
| Gateway | Client Class | Purpose | Auth Method |
|---|---|---|---|
| Datatrans | DatatransGatewayClient | E-commerce payments, tokenization, 3DS, Pay-by-Link | Basic Auth (API Key Base64) |
| Integra | IntegraGatewayClient | Card-present payments via Integra FE | Auth0 Bearer Token |
| IntegraPortal | IntegraPortalApiGatewayClient | Merchant management in Integra | Auth0 Bearer Token |
| DigitalGateway | DigitalGatewayGatewayClient | APM processing | API Key + Authorization Token |
| Web2Pay | Web2PayGatewayClient | Legacy e-commerce (being deprecated) | ApplicationId + Password |
| IAM | IamGatewayClient | Identity and access management | Auth0 Bearer Token |
Uses IGatewayClientFactory to resolve the correct client based on payment type:
// Payment action interfaces IPaymentActionClient // Captures, refunds, reversals ITokenizationClient // Card tokenization INewPaymentClient // Initialize new payments IRefundUnreferencedClient // Unreferenced refunds IInitializePaymentLinkClient // Pay-by-Link initialization
| Store | Purpose | Configuration |
|---|---|---|
| MongoDB | Primary data store - transactions, merchants, payment links, terminals | CosmosDB API, read preference configurable |
| Redis | Distributed caching | Standard connection |
| Hangfire (MongoDB) | Background job storage | CosmosDB storage with migration support |
├── TransactionLedgerCollection → TransactionDocument, TransactionDetailsDocument, TransactionOverviewDocument
├── MerchantCollection → MerchantDocument, MerchantsOverviewDocument, MerchantDetailsDocument
├── PaymentActionsCollection → PaymentActionDocument
├── PaymentLinksCollection → PaymentLinkDocument, PaymentLinkOverviewDocument, PaymentLinkDetailsDocument, PaymentLinkCheckoutDocument
├── PaymentMethodsCollection → PaymentMethodDocument
├── TerminalCollection → TerminalDocument, TerminalOverviewDocument, TerminalDetailsDocument
└── TerminalActionsCollection → TerminalActionDocument
| Service | Purpose |
|---|---|
PaymentActionsChangeStreamService | MongoDB change stream listener for payment actions |
TransactionUpdateChangeStreamService | MongoDB change stream listener for transaction updates |
ExpirePaymentLinksJobService | Scheduled job to expire payment links |
PaymentActionScheduler | Hangfire job scheduler for payment actions |
TerminalActionScheduler | Hangfire job scheduler for terminal actions |
Kafka Topics Consumer Handlers
───────────── ─────────────────
┌─────────────────────┐
│ Transaction Events │ ──────► RequestCreatedHandler
│ │ ──────► AcquirerRequestedHandler
│ │ ──────► BinLookedUpHandler
│ │ ──────► SchemeRespondedHandler
└─────────────────────┘
┌─────────────────────┐
│ Merchant Events │ ──────► MerchantPaymentMethodChangedHandler
└─────────────────────┘
MessageLoggingMiddleware - Request/response loggingWithDLQDeserializationExceptionMiddleware - Dead letter queue for deserialization errorsWithDLQExceptionMiddleware - Dead letter queue for processing errorsExceptionMiddleware - General exception handlingMessageConsumptionFilteringMiddleware - Message filteringUses TransactionUpdateProcessor for reliable message delivery via outbox pattern.
External Systems:
├── datatrans-payment-gateway → E-commerce payment processing
├── pgid-integrafe → Card-present gateway (Integra FE)
├── integra-portal-web → Integra portal API
├── pgid-dgw-core → Digital Gateway (APM)
├── Web2Pay → Legacy e-commerce (deprecated)
└── Auth0 → Identity provider
Internal Consumers:
├── pp-transaction-consumer → Transaction event processing
├── pp-reports-api → Report generation
├── Data Platform (Snowflake) → Analytics & BI
└── Planet Portal UI → Real-time updates via SignalR/WebSockets
┌──────────────────────────────────────────────────────────────────────────────┐
│ Payment Request Flow │
│ │
│ Merchant pp-webapp pp-payments-api Gateway pp-transaction- │
│ Portal (DFS/ consumer │
│ Integra) │
│ │ │ │ │ │ │
│ │ ─────────► │ ─────────► │ │ │ │
│ │ Request │ GraphQL/ │ │ │ │
│ │ │ REST │ ────────────► │ │ │
│ │ │ │ Process │ │ │
│ │ │ │ Payment │ ─────────► │ │
│ │ │ │ │ Response │ │
│ │ │ │ ◄──────────── │ │ │
│ │ │ │ │ │ │
│ │ │ │ ──────────────────────────►│ │
│ │ │ │ Kafka Event (Transaction │ │
│ │ │ │ Status Update) │ │
│ │ │ │ │ │ ───────────► │
│ │ │ │ │ │ Update DB │
│ │ │ │ │ │ Notify │
│ │ ◄───────── │ ◄────────── │ │ │ │
│ │ Result │ Response │ │ │ │
└──────────────────────────────────────────────────────────────────────────────┘
Both pp-payments-api and pp-transaction-consumer follow Clean Architecture:
├── Domain → Business entities, interfaces
├── Application → Use cases, validators, interfaces
├── Infrastructure → Data access, external services, gateways
└── Web/Consumer → Entry points, controllers, handlers
All HTTP clients use:
IHttpClientFactory with named clientsLoggingHttpMessageHandler for request/response loggingAuthTokenHandler for Auth0 bearer token injectionhealthCheckBuilder.AddCheck<DatatransGatewayHealthCheck>( name: "Datatrans", failureStatus: HealthStatus.Degraded, tags: [HealthCheckConstants.OnReadinessTag]);
┌────────────────────────────────────────────────────────────────────────────┐
│ Auth0 M2M Token Flow │
│ │
│ pp-payments-api Auth0 Target Gateway │
│ │ │ │ │
│ │ ── Get M2M Token ──────────► │ │ │
│ │ ◄─── Access Token ────────── │ │ │
│ │ │ │ │
│ │ (Cache token in IMemoryCache) │ │ │
│ │ │ │ │
│ │ ───── Request + Bearer Token ─────────────────────────► │ │
│ │ ◄──────────── Response ──────────────────────────────── │ │
└────────────────────────────────────────────────────────────────────────────┘
| Finding | Impact | Recommendation |
|---|---|---|
| Web2Pay marked as legacy | Technical debt | Continue migration to Datatrans |
| Multiple Auth0 client instances | Complexity | Consider consolidating or documenting separation |
| MongoDB change streams in hosted services | Real-time processing | Ensure proper error handling and reconnection |
| Hangfire on CosmosDB | Cost consideration | Monitor RU consumption |
E-commerce Path (Target: DFS/Datatrans)
DatatransGatewayClient is fully implementedCard-Present Path (Target: Integra)
IntegraGatewayClient handles payment actionsIntegraPortalApiGatewayClient handles merchant managementAPM Path (Target: DGW)
DigitalGatewayGatewayClient implementedIGatewayClientFactoryFrom code analysis, these repositories interact with Planet Portal:
| Repository | Relationship | Notes |
|---|---|---|
datatrans-payment-gateway | Upstream | E-commerce gateway (Java/Spring) |
pgid-integrafe | Upstream | Card-present gateway |
pgid-dgw-core | Upstream | Digital Gateway for APMs |
pgid-gsoi | Related | Service Operator Interface |
uppadmin-backend | Related | UPP Admin backend (Java/Spring) |
pci-proxy | Related | PCI-compliant proxy service |
mas-core | Related | MAS Clearing & Settlement |
alerting-tool | Related | Merchant alerting service |
From appsettings analysis:
Local - Local developmentIntegration - Integration testingUat - User acceptance testingQA - Quality assuranceStaging - Pre-productionProduction (implied){ "Mongo": { "ConnectionString": "...", "DatabaseName": "...", "ReadPreference": "primary|secondaryPreferred", "TransactionLedgerCollection": "...", "MerchantCollection": "...", "PaymentActionsCollection": "...", "PaymentLinksCollection": "...", "PaymentMethodsCollection": "...", "TerminalCollection": "...", "TerminalActionsCollection": "..." }, "Redis": { "ConnectionString": "..." }, "Hangfire": { "DatabaseName": "...", "MinimumAvailableServers": 1, "CheckConnection": true, "BypassMigrations": false, "QueuePollInterval": "...", "SupportsCappedCollection": false, "JobExpirationTimeoutInDays": 7, "CancellationCheckInterval": "...", "WorkerCountPerProcessor": 2 }, "PaymentGateways": { "Datatrans": { "BaseUri": "...", "ApiKeyBase64": "...", "Timeout": "..." }, "Integra": { "BaseUri": "...", "Timeout": "...", "SkipCertificateValidation": false }, "IntegraPortalApi": { "BaseUri": "..." }, "DigitalGateway": { "BaseUri": "...", "ApiKey": "...", "AuthorizationToken": "...", "Timeout": "..." }, "Web2Pay": { "BaseUri": "...", "ApplicationId": "...", "Password": "...", "Timeout": "..." } }, "Auth": { "Auth0": { "Domain": "...", "Timeout": "..." }, "MerchantActivationAuth0": { "Domain": "...", "Timeout": "..." } }, "Kafka": { "BootstrapServers": "...", "ConsumerGroup": "...", "Topics": { ... } } }
<PackageReference Include="Hangfire.Core" /> <PackageReference Include="Hangfire.Mongo" /> <PackageReference Include="MongoDB.Driver" /> <PackageReference Include="StackExchange.Redis" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
<PackageReference Include="KafkaFlow" /> <PackageReference Include="KafkaFlow.Microsoft.DependencyInjection" /> <PackageReference Include="MongoDB.Driver" />
From WeArePlanet.* namespace analysis:
| Package | Purpose |
|---|---|
WeArePlanet.Datatrans.Api | Datatrans API client library |
WeArePlanet.DigitalGateway.Api | DGW API client library |
WeArePlanet.Integra.Portal.Api | Integra Portal client library |
WeArePlanet.Web2Pay.Api | Web2Pay client library |
WeArePlanet.Payments.Commons | Shared utilities, health checks, settings |
WeArePlanet.Portal.Contracts.* | Shared contract models |