tangle_indexer


git clone https://radroots.dev/git/tangle_indexer.git
Log | Files | Refs | Submodules | LICENSE

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 }