//! Application Bootstrap
//!
//! Register global middleware and services that need runtime configuration.
use kit::{bind, global_middleware, singleton, App, DB};
use crate::middleware;
use std::sync::Arc;
pub async fn register() {
// ═══════════════════════════════════════════════════════
// Database
// ═══════════════════════════════════════════════════════
DB::init().await.expect("Failed to connect to database");
// ═══════════════════════════════════════════════════════
// Global Middleware (runs on every request, in order)
// ═══════════════════════════════════════════════════════
global_middleware!(middleware::LoggingMiddleware);
global_middleware!(middleware::CorsMiddleware);
// ═══════════════════════════════════════════════════════
// Cache
// ═══════════════════════════════════════════════════════
let redis_url = std::env::var("REDIS_URL")
.unwrap_or_else(|_| "redis://localhost:6379".to_string());
bind!(dyn CacheStore, RedisCache::new(&redis_url));
// ═══════════════════════════════════════════════════════
// Email
// ═══════════════════════════════════════════════════════
let smtp_host = std::env::var("SMTP_HOST").unwrap_or_default();
let smtp_port = std::env::var("SMTP_PORT")
.unwrap_or_else(|_| "587".to_string())
.parse()
.unwrap_or(587);
singleton!(EmailService::new(&smtp_host, smtp_port));
// ═══════════════════════════════════════════════════════
// External Services
// ═══════════════════════════════════════════════════════
if let Ok(stripe_key) = std::env::var("STRIPE_SECRET_KEY") {
singleton!(StripeClient::new(&stripe_key));
}
}