gitdataai/libs/room/src/helpers.rs

58 lines
2.4 KiB
Rust

use crate::service::RoomService;
use models::agents::model as ai_model;
use models::rooms::room_message;
use models::users::user as user_model;
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
use uuid::Uuid;
impl RoomService {
pub async fn resolve_display_name(
&self,
msg: room_message::Model,
_room_id: Uuid,
) -> super::RoomMessageResponse {
let sender_type = msg.sender_type.to_string();
let display_name = match sender_type.as_str() {
"ai" => {
if let Some(mid) = msg.model_id {
ai_model::Entity::find_by_id(mid)
.one(&self.db)
.await
.inspect_err(|e| tracing::warn!(error = %e, model_id = %mid, "resolve_display_name: AI model lookup failed"))
.ok()
.flatten()
.map(|m| m.name)
.or_else(|| Some(format!("AI({})", &mid.to_string()[..8])))
} else {
None
}
}
_ => {
if let Some(sender_id) = msg.sender_id {
let user = user_model::Entity::find()
.filter(user_model::Column::Uid.eq(sender_id))
.one(&self.db)
.await
.inspect_err(|e| tracing::warn!(error = %e, user_id = %sender_id, "resolve_display_name: user lookup failed"))
.ok()
.flatten();
user.map(|u| u.display_name.unwrap_or_else(|| u.username))
} else {
None
}
}
};
let chunked = super::RoomMessageResponse::detect_chunked(&msg.thinking_content);
super::RoomMessageResponse {
id: msg.id, seq: msg.seq, room: msg.room, sender_type,
sender_id: msg.sender_id, display_name, thread: msg.thread,
content: msg.content, content_type: msg.content_type.to_string(),
thinking_content: msg.thinking_content, thinking_is_chunked: chunked,
edited_at: msg.edited_at, send_at: msg.send_at, revoked: msg.revoked,
revoked_by: msg.revoked_by, in_reply_to: msg.in_reply_to,
highlighted_content: None, attachment_ids: Vec::new(), reactions: Vec::new(),
}
}
}