refactor(config,db,email): apply rustfmt formatting
This commit is contained in:
parent
724858a721
commit
02a1020f75
@ -33,7 +33,10 @@ impl AppConfig {
|
|||||||
GLOBAL_CONFIG.get().unwrap().clone()
|
GLOBAL_CONFIG.get().unwrap().clone()
|
||||||
} else {
|
} else {
|
||||||
let _ = GLOBAL_CONFIG.set(this);
|
let _ = GLOBAL_CONFIG.set(this);
|
||||||
GLOBAL_CONFIG.get().expect("global config should be set after load").clone()
|
GLOBAL_CONFIG
|
||||||
|
.get()
|
||||||
|
.expect("global config should be set after load")
|
||||||
|
.clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,9 +4,9 @@ impl AppConfig {
|
|||||||
/// Returns a single Redis URL (first from APP_REDIS_URLS or APP_REDIS_URL).
|
/// Returns a single Redis URL (first from APP_REDIS_URLS or APP_REDIS_URL).
|
||||||
pub fn redis_url(&self) -> anyhow::Result<String> {
|
pub fn redis_url(&self) -> anyhow::Result<String> {
|
||||||
let urls = self.redis_urls()?;
|
let urls = self.redis_urls()?;
|
||||||
urls.into_iter().next().ok_or_else(|| {
|
urls.into_iter()
|
||||||
anyhow::anyhow!("APP_REDIS_URLS or APP_REDIS_URL is empty")
|
.next()
|
||||||
})
|
.ok_or_else(|| anyhow::anyhow!("APP_REDIS_URLS or APP_REDIS_URL is empty"))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn redis_urls(&self) -> anyhow::Result<Vec<String>> {
|
pub fn redis_urls(&self) -> anyhow::Result<Vec<String>> {
|
||||||
|
|||||||
@ -60,23 +60,20 @@ impl AppCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get active chat stream state for a conversation. Returns (message_id, started_at_ts).
|
/// Get active chat stream state for a conversation. Returns (message_id, started_at_ts).
|
||||||
pub async fn get_chat_stream_active(
|
pub async fn get_chat_stream_active(&self, conversation_id: Uuid) -> Option<(Uuid, i64)> {
|
||||||
&self,
|
|
||||||
conversation_id: Uuid,
|
|
||||||
) -> Option<(Uuid, i64)> {
|
|
||||||
if let Ok(mut conn) = self.conn().await {
|
if let Ok(mut conn) = self.conn().await {
|
||||||
let key = format!("{}{}", CHAT_STREAM_KEY_PREFIX, conversation_id);
|
let key = format!("{}{}", CHAT_STREAM_KEY_PREFIX, conversation_id);
|
||||||
if let Ok(value) =
|
if let Ok(value) = redis::cmd("GET")
|
||||||
redis::cmd("GET").arg(&key).query_async::<String>(&mut conn).await
|
.arg(&key)
|
||||||
|
.query_async::<String>(&mut conn)
|
||||||
|
.await
|
||||||
{
|
{
|
||||||
if let Ok(parsed) = serde_json::from_str::<serde_json::Value>(&value) {
|
if let Ok(parsed) = serde_json::from_str::<serde_json::Value>(&value) {
|
||||||
let msg_id = parsed
|
let msg_id = parsed
|
||||||
.get("message_id")
|
.get("message_id")
|
||||||
.and_then(|v| v.as_str())
|
.and_then(|v| v.as_str())
|
||||||
.and_then(|s| Uuid::parse_str(s).ok());
|
.and_then(|s| Uuid::parse_str(s).ok());
|
||||||
let started_at = parsed
|
let started_at = parsed.get("started_at").and_then(|v| v.as_i64());
|
||||||
.get("started_at")
|
|
||||||
.and_then(|v| v.as_i64());
|
|
||||||
if let (Some(mid), Some(ts)) = (msg_id, started_at) {
|
if let (Some(mid), Some(ts)) = (msg_id, started_at) {
|
||||||
return Some((mid, ts));
|
return Some((mid, ts));
|
||||||
}
|
}
|
||||||
@ -93,4 +90,45 @@ impl AppCache {
|
|||||||
let _: Result<(), _> = redis::cmd("DEL").arg(&key).query_async(&mut conn).await;
|
let _: Result<(), _> = redis::cmd("DEL").arg(&key).query_async(&mut conn).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ─── Chat Stream Cancellation ─────────────────────────────────────────
|
||||||
|
|
||||||
|
/// Mark a chat stream as cancelled by the user.
|
||||||
|
/// TTL 60 seconds — prevents stale entries.
|
||||||
|
pub async fn set_chat_stream_cancelled(&self, conversation_id: Uuid) -> bool {
|
||||||
|
if let Ok(mut conn) = self.conn().await {
|
||||||
|
let key = format!("{}cancel:{}", CHAT_STREAM_KEY_PREFIX, conversation_id);
|
||||||
|
let _: Result<(), _> = redis::cmd("SETEX")
|
||||||
|
.arg(&key)
|
||||||
|
.arg(60_i64)
|
||||||
|
.arg("1")
|
||||||
|
.query_async(&mut conn)
|
||||||
|
.await;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check if a chat stream has been cancelled.
|
||||||
|
pub async fn is_chat_stream_cancelled(&self, conversation_id: Uuid) -> bool {
|
||||||
|
if let Ok(mut conn) = self.conn().await {
|
||||||
|
let key = format!("{}cancel:{}", CHAT_STREAM_KEY_PREFIX, conversation_id);
|
||||||
|
if let Ok(value) = redis::cmd("GET")
|
||||||
|
.arg(&key)
|
||||||
|
.query_async::<Option<String>>(&mut conn)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
return value.is_some();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clear the cancel flag for a chat stream.
|
||||||
|
pub async fn clear_chat_stream_cancelled(&self, conversation_id: Uuid) {
|
||||||
|
if let Ok(mut conn) = self.conn().await {
|
||||||
|
let key = format!("{}cancel:{}", CHAT_STREAM_KEY_PREFIX, conversation_id);
|
||||||
|
let _: Result<(), _> = redis::cmd("DEL").arg(&key).query_async(&mut conn).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
use config::AppConfig;
|
use config::AppConfig;
|
||||||
|
use lettre::Transport;
|
||||||
use lettre::message::Mailbox;
|
use lettre::message::Mailbox;
|
||||||
use lettre::transport::smtp::{PoolConfig, SmtpTransport};
|
use lettre::transport::smtp::{PoolConfig, SmtpTransport};
|
||||||
use lettre::Transport;
|
|
||||||
use metrics::counter;
|
use metrics::counter;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user