Billing UI - Project Overview
Solution Structure
| Project |
Type |
Framework |
Description |
| TELS.Billing.Web |
Web Application (Lambda) |
.NET 8.0 |
ASP.NET Core backend serving React SPA via AWS Lambda |
| TELS.Billing.Web.Tests |
MSTest (.NET 8.0) |
.NET 8.0 |
Backend unit/integration tests (Moq) |
Frontend
| Technology |
Version |
Description |
| React |
17.0.0 |
UI framework |
| TypeScript |
4.2.3 |
Type-safe JavaScript |
| Redux |
— |
State management with redux-thunk |
| React Router |
5.0.1 |
SPA routing |
| DUEL Design System |
6.3.0+ |
Direct Supply component library |
| Webpack |
4.35.3 |
Module bundler |
| Karma + Jasmine + Enzyme |
— |
Frontend testing |
Architecture
Purpose
Billing UI is a React Single-Page Application hosted on AWS Lambda via Application Load Balancer. It provides the TELS Billing web interface for managing custom PO number configuration and billing facility settings. Served at https://{domain}/Billing/{chainBusinessUnitId}/*.
Layering Pattern
+-----------------------------------------------------+
| React SPA (TypeScript + DUEL Design System) |
| Redux state management, React Router |
| Custom PO numbers, billing configuration |
+-----------------------------------------------------+
| ASP.NET Core 8.0 (Lambda runtime) |
| JWT cookie auth, CSRF protection, CSP headers |
| Proxies API calls to backend services |
+-----------------------------------------------------+
| AWS Lambda + ALB |
| Path-based routing: /Billing/* |
| Priority 1017 listener rule |
+-----------------------------------------------------+
Authentication & Security
- JWT Tokens: Refresh token in secure HTTP-only cookie (
__Host-id prefix), access token in memory
- CSRF Protection: Source/target origin validation
- Content Security Policy: Strict CSP with reporting
- Security Headers: Via
Joonasw.AspNetCore.SecurityHeaders
- Token Refresh: Client refreshes every minute
- Stateless: No server-side session state
Key Technology Stack
| Category |
Technology |
| Runtime |
.NET 8.0 on AWS Lambda |
| Frontend |
React 17, TypeScript 4.2, Redux, DUEL Design System |
| Lambda |
Amazon.Lambda.AspNetCoreServer 4.1.0 |
| Auth |
System.IdentityModel.Tokens.Jwt 6.14.1, KMS-encrypted secrets |
| Security |
Joonasw.AspNetCore.SecurityHeaders 3.0.0 |
| Monitoring |
NewRelic.OpenTracing.AmazonLambda.Tracer 1.0.0 |
| Build |
Node 14, Yarn, Webpack 4, ts-loader, Babel |
| Testing |
MSTest + Moq (backend), Karma + Jasmine + Enzyme (frontend) |
External Integrations
| Integration |
Mechanism |
Description |
| Auth Service |
HTTP API |
JWT refresh/access token endpoint |
| Customers Service |
HTTP API (DSE.TELS.Customers) |
Business unit hierarchy, owners, contacts, chains |
| Billing Service |
HTTP API |
Custom PO numbers, billing configuration |
| DSSI Clearinghouse |
Generated REST client v3 |
Integration lookup |
| DSSI Provider Service |
Generated REST client v2 |
Provider information |
| ECommerce Customer API |
Generated REST client v5 |
Authorization codes |
| AWS KMS |
AWSSDK.KeyManagementService |
JWT secret encryption |
Deployment
Lambda Configuration
| Setting |
Value |
| Handler |
TELS.Billing.Web::TELS.Billing.Web.LambdaEntryPoint::FunctionHandlerAsync |
| Runtime |
.NET 8.0 |
| Memory |
512 MB |
| Timeout |
60 seconds |
| Reserved Concurrency |
20 |
ALB Integration
- Target group: Lambda type
- Priority: 1017 listener rule
- Path routing:
/Billing/*
- Host routing: Environment-specific DNS
- Multi-value headers enabled
Environments
| Environment |
URL |
| DEV |
https://devsmart.tels.net/Billing |
| QA |
https://qasmart.tels.net/Billing |
| PROD |
https://smart.tels.net/Billing |
CI/CD Pipeline
Stages: build → test → ephemeral_plan → ephemeral_deploy → ephemeral_destroy → sandbox_plan → sandbox_deploy → testing_plan → testing_deploy → production_plan → production_deploy
| Stage |
Details |
| Build |
dotnet test, yarn install, yarn test-ci, yarn build, dotnet lambda package |
| Test |
Backend (MSTest) + Frontend (Karma/Jasmine) |
| Deploy |
Terraform plan → apply per environment |
| Environments |
Ephemeral (manual, any branch), Sandbox (manual), Testing/Prod (manual, master only) |
Infrastructure
- Platform: AWS Lambda (ALB-triggered)
- Secrets: AWS KMS for JWT secret encryption
- Monitoring: New Relic + CloudWatch (3-day retention)
- Security: Checkmarx scanning via combined-scan-linux.yml
- IaC: Terraform 1.0.10+
Notes
- Stateless design: No server-side session state — JWT tokens in memory on client, refresh token in secure cookie.
- Lambda-based: Pay-per-request model with 20 reserved concurrent executions.
- DUEL Design System: Uses Direct Supply's internal component library for consistent UI.
- No direct database access: All data accessed via REST APIs to backend services.
- Master branch: Uses
master as default branch.