A comprehensive transactions API built with Quarkus, featuring reactive programming, clean architecture, and multiple interfaces (REST API & MCP).
This system follows Clean Architecture principles with clear separation of concerns:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Interface Layer โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โ REST API โ โ MCP Server โ โ
โ โ Controllers โ โ Tools โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Application Layer โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ Transaction โ โ Position โ โ Portfolio โ โ
โ โ Use Cases โ โ Use Cases โ โ Use Cases โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Domain Layer โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ Transaction โ โ Position โ โ Currency โ โ
โ โ Model โ โ Model โ โ Enums โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Infrastructure Layer โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ PostgreSQL โ โ Panache โ โ JSON โ โ
โ โ Database โ โ Repositories โ โ Mappers โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- โ Transaction Management: Create, read, update, delete transactions
- โ Position Tracking: Automatic position calculation from transactions
- โ Market Data: Real-time price updates and P&L calculations
- โ Portfolio Summary: Comprehensive portfolio metrics and analytics
- โ Multi-Currency Support: USD, EUR, GBP with proper handling
- โ Non-blocking I/O: Built with Quarkus reactive stack
- โ Async Operations: All database operations are reactive
- โ Performance: High throughput with efficient resource usage
- โ Scalability: Designed for cloud-native deployments
- โ REST API: Complete HTTP API for web/mobile applications
- โ MCP Server: Model Context Protocol for AI integrations
- โ Clean Separation: Both interfaces use same business logic
- โ PostgreSQL: Production-ready database with custom types
- โ Schema Management: Comprehensive database schema with triggers
- โ Automatic Calculations: Position recalculation via database triggers
- โ Data Integrity: Proper constraints and validation
| Layer | Technology |
|---|---|
| Framework | Quarkus (Reactive) |
| Language | Java 21 |
| Database | PostgreSQL 14+ |
| ORM | Hibernate Reactive with Panache |
| API | JAX-RS (REST) + MCP Protocol |
| Build | Gradle |
| Testing | JUnit 5 + TestContainers |
src/main/java/com/portfolio/
โโโ application/usecase/ # Business Use Cases
โ โโโ transaction/ # Transaction operations
โ โโโ position/ # Position operations
โ โโโ portfolio/ # Portfolio operations
โโโ domain/ # Domain Models & Logic
โ โโโ model/ # Core entities
โ โโโ port/ # Repository interfaces
โ โโโ valueobject/ # Value objects
โโโ infrastructure/ # External Interfaces
โโโ persistence/ # Database implementation
โ โโโ entity/ # JPA entities
โ โโโ repository/ # Panache repositories
โ โโโ adapter/ # Repository adapters
โโโ rest/ # REST API
โ โโโ dto/ # Data transfer objects
โ โโโ mapper/ # Domain โ DTO mapping
โโโ mcp/ # MCP Server
โโโ dto/ # MCP protocol DTOs
โโโ tools/ # MCP tool registry
โโโ config/ # MCP configuration
- Java 21+
- PostgreSQL 14+
- Docker (optional, for database)
# Option A: Using Docker
docker-compose up -d
# Option B: Local PostgreSQL
createdb portfolio_db
psql portfolio_db < src/main/resources/db/migration/schema.sql# application.properties
quarkus.datasource.reactive.url=postgresql://localhost:5432/portfolio_db
quarkus.datasource.username=portfolio_user
quarkus.datasource.password=your_password# Development mode (with live reload)
./gradlew quarkusDev
# Production mode
./gradlew build
java -jar build/quarkus-app/quarkus-run.jar# Test REST API
./scripts/quick-test.sh
# Test MCP Server
./scripts/test-mcp.shPOST /api/transactions # Create transaction
GET /api/transactions # List all transactions
GET /api/transactions/{id} # Get transaction by ID
PUT /api/transactions/{id} # Update transaction
DELETE /api/transactions/{id} # Delete transaction
GET /api/transactions/ticker/{ticker} # Get by ticker
GET /api/transactions/search # Search with filtersGET /api/positions # List all positions
GET /api/positions/active # List active positions
GET /api/positions/{id} # Get position by ID
GET /api/positions/ticker/{ticker} # Get position by ticker
PUT /api/positions/ticker/{ticker}/price # Update market price
POST /api/positions/ticker/{ticker}/recalculate # Recalculate positionGET /api/portfolio/summary # Complete portfolio summary
GET /api/portfolio/summary/active # Active portfolio summarycreate_transaction- Create a new transactionget_transaction- Get transaction by IDupdate_transaction- Update existing transactiondelete_transaction- Delete transactionget_transactions_by_ticker- Get transactions for tickersearch_transactions- Search with filters
get_all_positions- Get all positionsget_active_positions- Get active positionsget_position_by_ticker- Get position by tickerupdate_market_price- Update market pricerecalculate_position- Recalculate position
get_portfolio_summary- Complete portfolio summaryget_active_portfolio_summary- Active portfolio summary
# Comprehensive API testing
./scripts/test-api.sh
# Quick functionality test
./scripts/quick-test.sh
# Populate sample data
./scripts/sample-data.sh# Test MCP server
./scripts/test-mcp.sh
# Interactive MCP client
python3 ./start_mcp_server.py --mode interactive
# Automated MCP testing
python3 ./start_mcp_server.py --mode test# Run unit tests
./gradlew test
# Run with test coverage
./gradlew test jacocoTestReport
# Integration testing
./gradlew integrationTest# Create a transaction
curl -X POST http://localhost:8080/api/transactions \
-H "Content-Type: application/json" \
-d '{
"ticker": "AAPL",
"transactionType": "BUY",
"quantity": 10,
"price": 150.00,
"currency": "USD",
"transactionDate": "2024-01-15"
}'
# Get portfolio summary
curl http://localhost:8080/api/portfolio/summary/active
# Update market price
curl -X PUT http://localhost:8080/api/positions/ticker/AAPL/price \
-H "Content-Type: application/json" \
-d '{"price": 175.50}'# Using the Python MCP client
async with PortfolioMcpClient() as client:
# Create transaction
result = await client.call_tool('create_transaction', {
"ticker": "AAPL",
"transactionType": "BUY",
"quantity": 10,
"price": 150.00,
"currency": "USD",
"transactionDate": "2024-01-15"
})
# Get portfolio summary
summary = await client.call_tool('get_portfolio_summary', {})# PostgreSQL Configuration
quarkus.datasource.db-kind=postgresql
quarkus.datasource.reactive.url=postgresql://localhost:5432/portfolio_db
quarkus.datasource.username=portfolio_user
quarkus.datasource.password=secure_password
# Hibernate Configuration
quarkus.hibernate-orm.database.generation=validate
quarkus.hibernate-orm.sql-load-script=no-file# HTTP Server
quarkus.http.port=8080
quarkus.http.host=0.0.0.0
# Development
quarkus.live-reload.instrumentation=true
quarkus.dev.console.enable=true# Build Docker image
./gradlew build -Dquarkus.package.type=native-sources
docker build -f src/main/docker/Dockerfile.native -t portfolio-management .
# Run with docker-compose
docker-compose up -d- Domain Layer: Add new entities/value objects
- Application Layer: Create use cases
- Infrastructure Layer: Implement adapters
- Interface Layer: Add REST endpoints and/or MCP tools
- Follow Java naming conventions
- Use reactive patterns (Uni/Multi)
- Maintain clean architecture boundaries
- Write comprehensive tests
- API Documentation: Available at
/q/swagger-uiwhen running - Health Checks: Available at
/q/health - Metrics: Available at
/q/metrics - MCP Tools: Available at
/mcp/tools
- โ Input Validation: Bean validation on all DTOs
- โ SQL Injection Protection: Parameterized queries
- โ CORS Configuration: Configurable cross-origin policies
- โ Error Handling: Consistent error responses
- Authentication & Authorization
- Event Sourcing for audit trails
- Caching Layer with Redis
- Microservices Split for event sourcing transactions service -> portfolio service (build position async)
- Build a BFF Split MCP and REST API into different microservices
Built with โค๏ธ using Quarkus and Clean Architecture principles
ยฉ 2025 Pablo Cazorla. All rights reserved. This code is proprietary and confidential.