Implement the complete message center with: - Database migrations for message_templates, messages, message_subscriptions tables - erp-message crate with entities, DTOs, services, handlers - Message CRUD, send, read/unread tracking, soft delete - Template management with variable interpolation - Subscription preferences with DND support - Frontend: messages page, notification panel, unread count badge - Server integration with module registration and routing Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
65 lines
1.5 KiB
Rust
65 lines
1.5 KiB
Rust
use serde::Deserialize;
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
pub struct AppConfig {
|
|
pub server: ServerConfig,
|
|
pub database: DatabaseConfig,
|
|
pub redis: RedisConfig,
|
|
pub jwt: JwtConfig,
|
|
pub auth: AuthConfig,
|
|
pub log: LogConfig,
|
|
pub cors: CorsConfig,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
pub struct ServerConfig {
|
|
pub host: String,
|
|
pub port: u16,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
pub struct DatabaseConfig {
|
|
pub url: String,
|
|
pub max_connections: u32,
|
|
pub min_connections: u32,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
pub struct RedisConfig {
|
|
pub url: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
pub struct JwtConfig {
|
|
pub secret: String,
|
|
pub access_token_ttl: String,
|
|
pub refresh_token_ttl: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
pub struct LogConfig {
|
|
pub level: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
pub struct AuthConfig {
|
|
pub super_admin_password: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
pub struct CorsConfig {
|
|
/// Comma-separated list of allowed origins.
|
|
/// Use "*" to allow all origins (development only).
|
|
pub allowed_origins: String,
|
|
}
|
|
|
|
impl AppConfig {
|
|
pub fn load() -> anyhow::Result<Self> {
|
|
let config = config::Config::builder()
|
|
.add_source(config::File::with_name("config/default"))
|
|
.add_source(config::Environment::with_prefix("ERP").separator("__"))
|
|
.build()?;
|
|
Ok(config.try_deserialize()?)
|
|
}
|
|
}
|