A modern web application showcasing business credit card products for Three Rivers Bank, built with React frontend and Spring Boot backend, integrating with BIAN API v13.0.0 standards.
This project demonstrates a full-stack credit card comparison and information platform designed for small businesses. The application provides an intuitive interface for browsing, comparing, and learning about various business credit card offerings from Three Rivers Bank.
- Framework: React 18+ with Vite
- Routing: React Router v6
- State Management: React Query (TanStack Query)
- UI Library: Material-UI (MUI)
- Styling: Custom Three Rivers Bank theme (Navy/Teal)
- Framework: Spring Boot 3.x
- Language: Java 17+
- Database: H2 In-Memory Database
- API Integration: BIAN Credit Card API v13.0.0 (Swagger Hub Mock)
- Resilience: Resilience4j Circuit Breaker
The application uses standard Spring Boot and Vite environment variable mappings:
-
Backend (Spring Boot)
bian.api.base-url→ overridden via env varBIAN_API_BASE_URLspring.h2.console.enabled→ overridden via env varSPRING_H2_CONSOLE_ENABLED
-
Frontend (Vite React)
- Build-time API base URL:
VITE_API_BASE_URL - Optional runtime override:
window.APP_CONFIG.API_BASE_URL
- Build-time API base URL:
Make sure to use these exact names in Azure Container Apps, Docker, and local .env files; variables like
BIAN_API_URL, H2_CONSOLE_ENABLED, or REACT_APP_API_URL will not be picked up by this application.
- API Client: Spring Cloud OpenFeign
- Caching: Spring Cache Abstraction
- Containerization: Docker
- Registry: Azure Container Registry
- Deployment: Azure Container Apps
- CI/CD: GitHub Actions
- 5 Business Credit Cards:
- Business Cash Rewards (2% cashback, $0 annual fee)
- Business Travel Rewards (3X points, $95 annual fee)
- Business Platinum (0% intro APR 15 months, $0 annual fee)
- Business Premium (1.5% unlimited cashback, $150 annual fee)
- Business Flex (Tiered 3%-1% rewards, $0 annual fee)
- Side-by-side comparison table
- Advanced filtering (annual fee, APR, rewards type, card type)
- Sorting capabilities
- Responsive design for all devices
- Hero section with card imagery
- Quick facts card (APR, fees, rewards)
- Detailed features accordion
- Benefits showcase
- Fee schedules
- Interest rate information
- Expense management tools
- Employee card controls
- QuickBooks integration
- Receipt capture mobile app
- Travel insurance & purchase protection
agentic-devops-demo/
├── backend/ # Spring Boot application
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/com/threeriversbank/
│ │ │ │ ├── controller/ # REST controllers
│ │ │ │ ├── service/ # Business logic
│ │ │ │ ├── repository/ # JPA repositories
│ │ │ │ ├── model/
│ │ │ │ │ ├── entity/ # JPA entities
│ │ │ │ │ └── dto/ # Data transfer objects
│ │ │ │ ├── client/ # BIAN API Feign client
│ │ │ │ └── config/ # Configuration classes
│ │ │ └── resources/
│ │ │ ├── application.yml # App configuration
│ │ │ └── data.sql # H2 seed data
│ │ └── test/ # JUnit tests
│ └── pom.xml # Maven dependencies
│
├── frontend/ # React application
│ ├── src/
│ │ ├── components/ # Reusable components
│ │ │ ├── cards/ # Card-related components
│ │ │ ├── common/ # Shared UI components
│ │ │ └── layout/ # Layout components
│ │ ├── pages/ # Page components
│ │ │ ├── HomePage.jsx
│ │ │ ├── CardComparisonPage.jsx
│ │ │ └── CardDetailsPage.jsx
│ │ ├── services/ # API service layer
│ │ ├── hooks/ # Custom React hooks
│ │ ├── theme.js # MUI theme configuration
│ │ └── App.jsx # Root component
│ ├── package.json # npm dependencies
│ └── vite.config.js # Vite configuration
│
├── tests/
│ ├── e2e/ # Playwright E2E tests
│ │ ├── card-comparison.spec.ts
│ │ ├── card-details.spec.ts
│ │ ├── filters-and-sorting.spec.ts
│ │ ├── responsive-design.spec.ts
│ │ └── database-integration.spec.ts
│ ├── fixtures/ # Test data fixtures
│ │ └── credit-cards.json
│ └── screenshots/ # Visual regression baselines
│ └── baseline/
│
├── .github/
│ ├── workflows/
│ │ └── build-deploy.yml # CI/CD pipeline
│ └── prompts/
│ └── plan-threeRiversBankCreditCardWebsite.prompt.md
│
├── docker/
│ ├── backend.Dockerfile
│ └── frontend.Dockerfile
│
└── README.md
GET /api/cards- List all credit cards with filtering/sortingGET /api/cards/{id}- Get detailed card informationGET /api/cards/{id}/fees- Get card fee scheduleGET /api/cards/{id}/interest- Get interest rate detailsGET /api/cards/{id}/transactions- Get sample transactions (BIAN)
GET /actuator/health- Health check endpointGET /swagger-ui.html- OpenAPI/Swagger documentationGET /h2-console- H2 database console (dev only)
- CreditCard: Core card information (name, type, APR, fees, rewards)
- CardFeature: Individual card features and benefits
- FeeSchedule: Detailed fee structure per card
- InterestRate: Interest rate configurations and history
Integrates with BIAN Credit Card API v13.0.0 via Swagger Hub mock server:
- Base URL:
https://virtserver.swaggerhub.com/B154/BIAN/CreditCard/13.0.0 - Endpoints Used:
/CreditCard/{id}/Retrieve/CreditCard/{id}/CardTransaction/{txid}/Retrieve/CreditCard/{id}/Billing/{billingid}/Retrieve
- Circuit breaker pattern (Resilience4j)
- Retry logic: 3 attempts, 5s timeout
- Fallback to H2 data on BIAN API failure
- Response caching: 5min (transactions), 1hr (billing)
- Backend: Java 17+, Maven 3.8+
- Frontend: Node.js 18+, npm 9+
- Testing: Playwright (installed via npm)
- Azure Deployment: Azure CLI (
az), Azure Developer CLI (azd), Terraform 1.1+
cd backend
mvn clean install
mvn spring-boot:runBackend runs on http://localhost:8080
cd frontend
npm install
npm run devFrontend runs on http://localhost:5173
Access H2 database console at http://localhost:8080/h2-console
- JDBC URL:
jdbc:h2:mem:creditcards - Username:
sa - Password: (empty)
cd backend
mvn testTests include:
CreditCardServiceTest.java- Service layer with H2 queriesCreditCardControllerTest.java- REST API with MockMvcCreditCardRepositoryTest.java- JPA repository validationBianApiClientTest.java- BIAN API integration with WireMock
cd tests
npm install
npx playwright install
npx playwright testE2E tests cover:
- Card comparison functionality
- Card detail pages
- Filters and sorting
- Responsive design (3 viewports)
- Database integration
- Visual regression
- Accessibility (WCAG 2.1 AA)
Test Configuration:
- Browsers: Chromium, WebKit
- Viewports: Desktop (1920x1080), Tablet (768x1024), Mobile (375x667)
- Parallel execution enabled
# Backend
docker build -f docker/backend.Dockerfile -t threeriversbank/backend:latest ./backend
# Frontend
docker build -f docker/frontend.Dockerfile -t threeriversbank/frontend:latest ./frontend# Backend
docker run -p 8080:8080 threeriversbank/backend:latest
# Frontend
docker run -p 80:80 threeriversbank/frontend:latestThis project uses Azure Developer CLI (azd) with Terraform for deploying to Azure Container Apps. CI/CD is handled by two separate GitHub Actions workflows.
- Resource Group: Contains all Azure resources
- Container Registry: Stores application Docker images
- Container App Environment: Managed serverless container platform
- Log Analytics Workspace: Centralized logging and monitoring
- Container Apps: Backend (Spring Boot) and Frontend (React/Nginx)
- Backend: 0.5 vCPU, 1GB RAM, auto-scale 1-3 replicas
- Frontend: 0.25 vCPU, 0.5GB RAM, auto-scale 1-3 replicas
- Ingress: HTTPS-only with automatic SSL certificates
- Health Checks: Backend
/actuator/health, Frontend root path
# Login to Azure
az login
azd auth login
# Deploy everything to Azure (state backend is bootstrapped automatically)
azd upNote: The
preprovisionhook inazure.yamlautomatically runssetup-tfstate.shbefore each provision, creating the Terraform state storage account and configuring the azd environment. No manual setup is needed.
The pipeline is split into two workflows:
- CI (
.github/workflows/ci.yml): Builds backend/frontend, runs unit and E2E tests on every push and PR. - CD (
.github/workflows/cd.yml): Deploys to Azure withazd upautomatically after a successful CI run onmainoriacbranches. Can also be triggered manually viaworkflow_dispatch.
When configuring Azure Container Apps or other deployment targets, ensure the following environment variables are set so they correctly override the app configuration:
- Backend:
BIAN_API_BASE_URL(forbian.api.base-url),SPRING_H2_CONSOLE_ENABLED(forspring.h2.console.enabled) - Frontend:
VITE_API_BASE_URL(and optionalwindow.APP_CONFIG.API_BASE_URLat runtime)
This project uses federated credentials (OIDC) for secure, secretless authentication between GitHub Actions and Azure.
# Create the app registration
az ad app create --display-name "agentic-devops-demo-cicd"
# Note the appId and id (objectId) from the output
# Example:
# appId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# objectId: yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyaz ad sp create --id <appId># Contributor role for resource management
az role assignment create \
--assignee <appId> \
--role "Contributor" \
--scope "/subscriptions/<subscription-id>"The Terraform remote state backend uses an Azure Storage account with Azure AD auth.
Run setup-tfstate.sh once locally to create the storage resources, then assign the
Storage Blob Data Contributor role to the CI service principal:
# Create the state storage account (idempotent)
source ./setup-tfstate.sh
# Assign Storage Blob Data Contributor to the CI service principal
SP_OBJECT_ID=$(az ad sp show --id <appId> --query id -o tsv)
az role assignment create \
--assignee-object-id "$SP_OBJECT_ID" \
--assignee-principal-type ServicePrincipal \
--role "Storage Blob Data Contributor" \
--scope "$(az storage account show --name "sttf$(echo '<subscription-id>' | tr -d '-' | cut -c1-12)" --resource-group rg-tfstate --query id -o tsv)"Note: The CI service principal has Contributor role which cannot self-assign RBAC roles. This one-time step must be done by a user with Owner or User Access Administrator permissions.
Create a credential for each branch that the CD workflow deploys from:
# For main branch
az ad app federated-credential create --id <objectId> --parameters '{
"name": "github-main",
"issuer": "https://token.actions.githubusercontent.com",
"subject": "repo:<owner>/<repo>:ref:refs/heads/main",
"audiences": ["api://AzureADTokenExchange"]
}'
# For iac branch (or any other deploy branch)
az ad app federated-credential create --id <objectId> --parameters '{
"name": "github-iac",
"issuer": "https://token.actions.githubusercontent.com",
"subject": "repo:<owner>/<repo>:ref:refs/heads/iac",
"audiences": ["api://AzureADTokenExchange"]
}'Set these as repository variables (not secrets — OIDC doesn't need secrets):
gh variable set AZURE_CLIENT_ID --body "<appId>"
gh variable set AZURE_TENANT_ID --body "<tenantId>"
gh variable set AZURE_SUBSCRIPTION_ID --body "<subscriptionId>"
gh variable set AZURE_LOCATION --body "eastus2"Note: No
AZURE_CLIENT_SECRETis needed with OIDC. The GitHub Actions workflow exchanges a short-lived token with Azure using the federated credential.
BIAN_API_URL: BIAN API base URLH2_CONSOLE_ENABLED: Enable/disable H2 console (false in prod)LOGGING_LEVEL: Application logging level (INFO)SPRING_PROFILES_ACTIVE: Spring profile (production)VITE_API_BASE_URL: Backend API URL for frontend (injected at runtime)
# Run full application stack
docker-compose up --build
# Backend: http://localhost:8080
# Frontend: http://localhost:3000# View deployed applications
azd show
# View application logs
azd logs --service backend
azd logs --service frontend
# Update application configuration
azd env set LOGGING_LEVEL DEBUG
azd deploy
# Scale applications (Azure CLI)
az containerapp update --name <backend-app> --resource-group <rg> --min-replicas 2 --max-replicas 10
# Clean up all resources
azd down --purgeFor detailed deployment instructions, see Azure Deployment Guide.
Three Rivers Bank Theme:
- Primary Color: Navy Blue (#003366)
- Secondary Color: Teal (#008080)
- Logo: Three Rivers Bank corporate logo
- Typography: Roboto (Material-UI default)
Contact Information:
- Phone: 1-800-THREE-RB
- Email: business@threeriversbank.com
- Headquarters: Pittsburgh, PA
This repository includes a complete Azure SRE Agent demo setup for showcasing AI-driven site reliability engineering:
| Component | File | Purpose |
|---|---|---|
| Setup Guide | SRE-AGENT-SETUP.md |
Step-by-step guide to configure Azure SRE Agent monitoring |
| Chaos Script | chaos-engineering.sh |
az CLI script to inject infrastructure-level faults into Azure Container Apps |
| Chaos Workflow | .github/workflows/chaos-engineering.md |
Agentic workflow that introduces code-level breaking changes via PR |
| Auto-assign | .github/workflows/auto-assign-copilot.yml |
Auto-assigns Copilot Coding Agent to SRE-detected issues |
| Issue Template | .github/ISSUE_TEMPLATE/sre-agent-incident.yml |
Structured template for SRE Agent incident reports |
Option A: Chaos Script (az CLI) → Modifies Live Azure Config ─┐
Option B: Agentic Workflow → Creates PR with Bad Code Commit ─┤
↓
SRE Agent Detects & Diagnoses → Creates GitHub Issue with RCA
→ Copilot Coding Agent Creates Fix PR
See SRE-AGENT-SETUP.md for the full walkthrough.
This project is for demonstration purposes.
This is a demonstration project. For questions or feedback, please contact the repository owner.
Built with ❤️ for Three Rivers Bank