Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions backend/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions backend/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@ soroban-sdk = "21.0"
# OpenAPI documentation
utoipa = { version = "4.0", features = ["axum_extras"] }
utoipa-swagger-ui = { version = "6.0", features = ["axum"] }
# Streaming and WebSocket
tokio-tungstenite = "0.21"
futures = "0.3"
# DSL/Rule Engine
pest = "2.7"
pest_derive = "2.7"
# Tower utilities
tower-layer = "0.3"
tower-service = "0.3"
# HTTP client for webhooks
# Streaming and event processing
reqwest = { version = "0.11", features = ["json"] }

Expand Down
41 changes: 41 additions & 0 deletions backend/migrations/20260625000000_add_saga_tables.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
-- Saga state management tables
CREATE TABLE IF NOT EXISTS saga_states (
id UUID PRIMARY KEY,
name VARCHAR(255) NOT NULL,
status VARCHAR(50) NOT NULL,
steps JSONB NOT NULL,
current_step_index INTEGER NOT NULL DEFAULT 0,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
metadata JSONB DEFAULT '{}',

INDEX idx_saga_status (status),
INDEX idx_saga_updated (updated_at)
);

-- Rule engine tables
CREATE TABLE IF NOT EXISTS rule_sets (
id VARCHAR(255) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
rules JSONB NOT NULL,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),

INDEX idx_ruleset_name (name)
);

-- Event processing metrics
CREATE TABLE IF NOT EXISTS event_processing_metrics (
id BIGSERIAL PRIMARY KEY,
event_id VARCHAR(255) NOT NULL,
processing_time_ms INTEGER NOT NULL,
processed_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
worker_id VARCHAR(255),
success BOOLEAN NOT NULL,
error_message TEXT,

INDEX idx_metrics_event (event_id),
INDEX idx_metrics_processed (processed_at),
INDEX idx_metrics_worker (worker_id)
);
10 changes: 5 additions & 5 deletions backend/src/docs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use utoipa_swagger_ui::SwaggerUi;
use crate::handlers::{
api_keys::{ApiKeyCreatedResponse, ApiKeyResponse, CreateApiKeyRequest},
auth::{AuthResponse, LoginRequest, RegisterRequest},
compliance::{ComplianceCheckRequest, ComplianceReportResponse},
// compliance::{ComplianceCheckRequest, ComplianceReportResponse}, // Temporarily disabled
event::{CreateEventRequest, EventResponse, ListEventsQuery, PaginatedEventsResponse},
financial::{CreateInvoiceRequest, CreateTransactionRequest, FinancingRequestBody},
product::{
Expand Down Expand Up @@ -73,10 +73,10 @@ use crate::handlers::{
crate::handlers::financial::list_transactions,
crate::handlers::financial::create_invoice,
crate::handlers::financial::request_financing,
// Compliance endpoints
crate::handlers::compliance::check_compliance,
crate::handlers::compliance::get_compliance_report,
crate::handlers::compliance::generate_audit_report,
// Compliance endpoints (temporarily disabled)
// crate::handlers::compliance::check_compliance,
// crate::handlers::compliance::get_compliance_report,
// crate::handlers::compliance::generate_audit_report,
// API Key endpoints
crate::handlers::api_keys::create_key,
crate::handlers::api_keys::list_keys,
Expand Down
36 changes: 36 additions & 0 deletions backend/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,12 @@ pub enum AppError {

#[error("Cryptography error")]
Cryptography(String),

#[error("Streaming error")]
StreamingError(String),

#[error("Validation error")]
ValidationError(String),
}

/// Standardized error response structure
Expand Down Expand Up @@ -420,6 +426,36 @@ impl IntoResponse for AppError {
None,
)
}

// Streaming Errors
AppError::StreamingError(ref msg) => {
tracing::error!(
correlation_id = %correlation_id,
error = %msg,
"Streaming error"
);
(
StatusCode::BAD_GATEWAY,
ErrorCode::ExternalServiceError,
"Streaming service error occurred. Please try again later.".to_string(),
Some(msg.clone()),
)
}

// Validation Errors
AppError::ValidationError(ref msg) => {
tracing::debug!(
correlation_id = %correlation_id,
validation_error = %msg,
"Validation error"
);
(
StatusCode::BAD_REQUEST,
ErrorCode::ValidationFailed,
format!("Validation error: {}", sanitize_message(msg)),
None,
)
}
};

let mut response = ErrorResponse::new(status, code, message);
Expand Down
12 changes: 6 additions & 6 deletions backend/src/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ pub mod api_keys;
pub mod auth;
pub mod carbon;
pub mod collaboration;
pub mod compliance;
pub mod digital_twin;
// pub mod compliance; // Temporarily disabled
// pub mod digital_twin; // Temporarily disabled
pub mod event;
pub mod financial;
pub mod health;
Expand All @@ -15,9 +15,9 @@ pub mod user;
pub mod monitoring;
pub mod recall;
pub mod batch;
pub mod iot;
pub mod quality;
pub mod regulatory;
pub mod supplier;
// pub mod iot; // Temporarily disabled
// pub mod quality; // Temporarily disabled
// pub mod regulatory; // Temporarily disabled
// pub mod supplier; // Temporarily disabled
pub mod predictive_routing;
pub mod physics_model;
Loading
Loading