//! Bookmark event handlers on `MessageService`. use std::sync::Arc; use uuid::Uuid; use crate::ImksError; use crate::socket::socket::Socket; use super::message::MessageService; impl MessageService { /// Handle `bookmark:add` — toggle (add/update) a bookmark. pub async fn add_bookmark( &self, socket: Arc, data: &serde_json::Value, ) -> crate::ImksResult<()> { let user_id = self.user_id(&socket)?; let arr = data .as_array() .and_then(|a| a.first()) .ok_or_else(|| ImksError::InvalidInput("Expected [payload] array".into()))?; let message_id: Uuid = Self::parse_field(arr, "message_id")?; let channel_id: Uuid = Self::parse_field(arr, "channel_id")?; let note: Option = Self::parse_optional(arr, "note")?; self.repo .add_bookmark(message_id, channel_id, user_id, note.as_deref()) .await?; Ok(()) } /// Handle `bookmark:remove` — remove a bookmark. pub async fn remove_bookmark( &self, socket: Arc, data: &serde_json::Value, ) -> crate::ImksResult<()> { let user_id = self.user_id(&socket)?; let arr = data .as_array() .and_then(|a| a.first()) .ok_or_else(|| ImksError::InvalidInput("Expected [payload] array".into()))?; let message_id: Uuid = Self::parse_field(arr, "message_id")?; self.repo.remove_bookmark(message_id, user_id).await?; Ok(()) } /// Handle `bookmark:list` — list a user's bookmarks. pub async fn list_bookmarks( &self, socket: Arc, data: &serde_json::Value, ) -> crate::ImksResult<()> { let user_id = self.user_id(&socket)?; let arr = data .as_array() .and_then(|a| a.first()) .ok_or_else(|| ImksError::InvalidInput("Expected [payload] array".into()))?; let before: Option = Self::parse_optional(arr, "before")?; let limit: Option = Self::parse_optional(arr, "limit")?; let page = self.repo.list_bookmarks(user_id, before, limit).await?; let _ = socket.emit( "bookmark:loaded", serde_json::to_value(&page).unwrap_or_default(), ); Ok(()) } }