Skip to content

pacama95/transactions-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

21 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Transactions API

A comprehensive transactions API built with Quarkus, featuring reactive programming, clean architecture, and multiple interfaces (REST API & MCP).

๐Ÿ—๏ธ Architecture Overview

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    โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿš€ Features

๐Ÿ’ผ Portfolio Management

  • โœ… 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

๐Ÿ”„ Reactive Architecture

  • โœ… 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

๐ŸŒ Multiple Interfaces

  • โœ… 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

๐Ÿ—„๏ธ Data Management

  • โœ… 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

๐Ÿ› ๏ธ Tech Stack

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

๐Ÿ“ฆ Project Structure

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

๐Ÿš€ Quick Start

Prerequisites

  • Java 21+
  • PostgreSQL 14+
  • Docker (optional, for database)

1. Database Setup

# 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

2. Application Configuration

# application.properties
quarkus.datasource.reactive.url=postgresql://localhost:5432/portfolio_db
quarkus.datasource.username=portfolio_user
quarkus.datasource.password=your_password

3. Run the Application

# Development mode (with live reload)
./gradlew quarkusDev

# Production mode
./gradlew build
java -jar build/quarkus-app/quarkus-run.jar

4. Verify Installation

# Test REST API
./scripts/quick-test.sh

# Test MCP Server
./scripts/test-mcp.sh

๐Ÿ“ก API Documentation

๐ŸŒ REST API Endpoints

Transactions (/api/transactions)

POST   /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 filters

Positions (/api/positions)

GET    /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 position

Portfolio (/api/portfolio)

GET    /api/portfolio/summary         # Complete portfolio summary
GET    /api/portfolio/summary/active  # Active portfolio summary

๐Ÿค– MCP Server Tools

Transaction Tools

  • create_transaction - Create a new transaction
  • get_transaction - Get transaction by ID
  • update_transaction - Update existing transaction
  • delete_transaction - Delete transaction
  • get_transactions_by_ticker - Get transactions for ticker
  • search_transactions - Search with filters

Position Tools

  • get_all_positions - Get all positions
  • get_active_positions - Get active positions
  • get_position_by_ticker - Get position by ticker
  • update_market_price - Update market price
  • recalculate_position - Recalculate position

Portfolio Tools

  • get_portfolio_summary - Complete portfolio summary
  • get_active_portfolio_summary - Active portfolio summary

๐Ÿงช Testing

API Testing

# Comprehensive API testing
./scripts/test-api.sh

# Quick functionality test
./scripts/quick-test.sh

# Populate sample data
./scripts/sample-data.sh

MCP Testing

# 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

Development Testing

# Run unit tests
./gradlew test

# Run with test coverage
./gradlew test jacocoTestReport

# Integration testing
./gradlew integrationTest

๐Ÿ“Š Example Usage

REST API Examples

# 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}'

MCP Examples

# 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', {})

๐Ÿ”ง Configuration

Database Configuration

# 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

Server Configuration

# HTTP Server
quarkus.http.port=8080
quarkus.http.host=0.0.0.0

# Development
quarkus.live-reload.instrumentation=true
quarkus.dev.console.enable=true

๐Ÿš€ Deployment

Docker Deployment

# 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

๐Ÿค Development

Adding New Features

  1. Domain Layer: Add new entities/value objects
  2. Application Layer: Create use cases
  3. Infrastructure Layer: Implement adapters
  4. Interface Layer: Add REST endpoints and/or MCP tools

Code Style

  • Follow Java naming conventions
  • Use reactive patterns (Uni/Multi)
  • Maintain clean architecture boundaries
  • Write comprehensive tests

๐Ÿ“š Documentation

  • API Documentation: Available at /q/swagger-ui when running
  • Health Checks: Available at /q/health
  • Metrics: Available at /q/metrics
  • MCP Tools: Available at /mcp/tools

๐Ÿ›ก๏ธ Security Features

  • โœ… Input Validation: Bean validation on all DTOs
  • โœ… SQL Injection Protection: Parameterized queries
  • โœ… CORS Configuration: Configurable cross-origin policies
  • โœ… Error Handling: Consistent error responses

๐Ÿ”ฎ Roadmap

  • 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

License

ยฉ 2025 Pablo Cazorla. All rights reserved. This code is proprietary and confidential.

About

Transactions API - Part of Portfolio Management APP

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages