Skip to content

pacama95/portfolio_assistant_api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

12 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Portfolio Assistant API

A comprehensive portfolio assistant 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

This is the backend for my portfolio assistant

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors