mando-bess

Main REST API service crate for the Mando workspace. Provides HTTP endpoints, flow execution, scheduling, and the application entry point for the Alpiq BESS platform.

Structure

mando-bess/src/
├── lib.rs          # App setup, router, middleware (25.2K)
├── main.rs         # Entry point, telemetry, logging
├── scheduler.rs    # Cron-based job scheduling
├── api_docs.rs     # OpenAPI documentation
├── flow/           # Workflow engines (9 subdirs)
│   ├── trading/
│   ├── manual_schedule/
│   ├── auction/
│   ├── intraday/
│   ├── idc_trading/
│   ├── data_update/
│   └── afrr/
├── route/          # HTTP handlers (7 submodules)
│   ├── audit_logs
│   ├── flow_executions
│   ├── query_data
│   ├── save_data
│   ├── settings
│   ├── flow
│   └── versions
├── database/       # Migrations, schema
└── model/          # BESS-specific domain models

AppServices

Central service container holding all flow implementations:

pub struct AppServices<M, A, S> {
    mando: M,                          // MandoService impl
    flow_env_config: Arc<FlowEnvConfig>,
    flow_trading: FlowTradingServiceV1,
    flow_manual_schedule_v1: ...,
    flow_manual_schedule_v2: ...,
    flow_auction_v3: ...,
    // ... more flow versions
}

HTTP Routes

PathPurpose
/audit_logsAudit trail access
/flow_executionsList/query flow executions
/flow_executions/{asset_id}Asset-specific executions
/query_dataData retrieval
/save_dataData writing
/settingsConfiguration CRUD
/flow/{id}Flow management
/versionsComponent version info

Flow Implementations

Versioned workflow engines for BESS trading strategies:

FlowVersionsPurpose
Tradingv1Market trading decisions
Manual Schedulev1, v2Operator-defined battery schedules
Auctionv3Auction market bidding
IntradayIntraday market operations
IDC TradingIntraday continuous trading
Data UpdateData refresh pipelines
AFRRAutomatic Frequency Restoration Reserve

Each flow version has its own service struct (e.g., FlowTradingServiceV1, FlowAuctionServiceV3) with configuration variants (v1_1, v1_3, v1_4).

Middleware Stack

  • OpenTelemetry — distributed tracing via axum-tracing-opentelemetry
  • Metricsaxum-otel-metrics for HTTP metrics
  • Auth — JWT token validation, Entra ID integration
  • Body limitstower-http request size limits
  • Static files — Askama templates
  • CORS — Cross-origin configuration

Database Initialization

Conditional backend selection at startup:

// PostgreSQL (production)
RepositoryPostgres + AuditRepositoryPostgres + SettingRepositoryPostgres
 
// DuckDB (analytics)
RepositoryDuckDb + SettingRepositoryDuckdb
 
// SQLite (development)
RepositorySqlite + AuditRepositoryMock

Authentication

  • JWT via jsonwebtoken (RS256)
  • Entra ID (Azure AD) — EntraIdClient from mando-lib
  • Volue EMS/ATP — external auth providers

Running

cd mando-bess && cargo run
# Exposed on port 8080

Dependencies

Primary dependency on mando-lib with features app + workflow enabled. Also uses mando-lib-macro for #[derive(ErrorCode)].