profile.rs (2516B)
1 use anyhow::Result; 2 use radroots_events::{ 3 profile::{ 4 radroots_profile_type_from_tag_value, RadrootsProfile, RadrootsProfileEventIndex, 5 RadrootsProfileEventMetadata, 6 }, 7 RadrootsNostrEvent, 8 }; 9 use thiserror::Error; 10 11 use crate::relay::event::RelayIndexerEvent; 12 13 #[derive(Debug, Error)] 14 pub enum RadrootsProfileEventIndexError { 15 #[error("Failed to parse metadata content JSON: {0}")] 16 ParseError(#[from] serde_json::Error), 17 #[error("Missing or empty 'name' field in profile data")] 18 MissingNameField, 19 #[error("Missing or invalid 'published_at' tag")] 20 MissingPublishedAt, 21 } 22 23 pub fn create_radroots_profile_event_metadata( 24 id: String, 25 author: String, 26 published_at: u32, 27 kind: u32, 28 content: &str, 29 ) -> Result<RadrootsProfileEventMetadata, RadrootsProfileEventIndexError> { 30 let profile: RadrootsProfile = serde_json::from_str(&content)?; 31 if profile.name.trim().is_empty() { 32 return Err(RadrootsProfileEventIndexError::MissingNameField); 33 } 34 35 Ok(RadrootsProfileEventMetadata { 36 id, 37 author, 38 published_at, 39 kind, 40 profile_type: None, 41 profile, 42 }) 43 } 44 45 pub trait ToRadrootsProfileEventIndex { 46 fn to_radroots_profile_event( 47 &self, 48 ) -> Result<RadrootsProfileEventIndex, RadrootsProfileEventIndexError>; 49 } 50 51 impl ToRadrootsProfileEventIndex for RelayIndexerEvent { 52 fn to_radroots_profile_event( 53 &self, 54 ) -> Result<RadrootsProfileEventIndex, RadrootsProfileEventIndexError> { 55 let kind_u32 = self.kind.as_u64() as u32; 56 let id = self.id.clone(); 57 let author = self.author.clone(); 58 59 let mut metadata = create_radroots_profile_event_metadata( 60 id.clone(), 61 author.clone(), 62 self.created_at, 63 kind_u32, 64 &self.content, 65 )?; 66 metadata.profile_type = self 67 .tags 68 .iter() 69 .filter(|tag| tag.get(0).map(|k| k == "t").unwrap_or(false)) 70 .filter_map(|tag| tag.get(1)) 71 .find_map(|value| radroots_profile_type_from_tag_value(value)); 72 73 Ok(RadrootsProfileEventIndex { 74 event: RadrootsNostrEvent { 75 id, 76 author, 77 created_at: self.created_at, 78 kind: kind_u32, 79 content: self.content.clone(), 80 tags: self.tags.clone(), 81 sig: self.sig.clone(), 82 }, 83 metadata, 84 }) 85 } 86 }