lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

social.rs (6121B)


      1 //! Social graph, messaging, access, and job event models.
      2 
      3 use crate::farm::FarmRef;
      4 
      5 #[cfg(not(feature = "std"))]
      6 use alloc::{string::String, vec::Vec};
      7 
      8 #[cfg_attr(
      9     any(feature = "serde", test),
     10     derive(serde::Serialize, serde::Deserialize)
     11 )]
     12 #[cfg_attr(all(test, feature = "std"), derive(dto_bindgen::Dto))]
     13 #[cfg_attr(
     14     any(feature = "serde", test),
     15     serde(rename_all = "snake_case", tag = "kind")
     16 )]
     17 #[derive(Clone, Debug, PartialEq, Eq)]
     18 pub enum SocialTarget {
     19     Event {
     20         id: String,
     21         author: Option<String>,
     22         event_kind: Option<u32>,
     23         relays: Option<Vec<String>>,
     24     },
     25     Address {
     26         address: String,
     27         author: Option<String>,
     28         event_kind: Option<u32>,
     29         relays: Option<Vec<String>>,
     30     },
     31     External {
     32         id: String,
     33         external_kind: String,
     34         hint: Option<String>,
     35     },
     36 }
     37 
     38 #[cfg_attr(
     39     any(feature = "serde", test),
     40     derive(serde::Serialize, serde::Deserialize)
     41 )]
     42 #[cfg_attr(all(test, feature = "std"), derive(dto_bindgen::Dto))]
     43 #[derive(Clone, Debug, Default)]
     44 pub struct SocialFarmAnchor {
     45     pub farm: FarmRef,
     46     pub relays: Option<Vec<String>>,
     47 }
     48 
     49 #[cfg_attr(
     50     any(feature = "serde", test),
     51     derive(serde::Serialize, serde::Deserialize)
     52 )]
     53 #[cfg_attr(all(test, feature = "std"), derive(dto_bindgen::Dto))]
     54 #[derive(Clone, Debug, Default, PartialEq, Eq)]
     55 pub struct SocialLocation {
     56     pub name: Option<String>,
     57     pub geohash: Option<String>,
     58 }
     59 
     60 #[cfg_attr(
     61     any(feature = "serde", test),
     62     derive(serde::Serialize, serde::Deserialize)
     63 )]
     64 #[cfg_attr(all(test, feature = "std"), derive(dto_bindgen::Dto))]
     65 #[derive(Clone, Debug, Default, PartialEq, Eq)]
     66 pub struct SocialMediaDimensions {
     67     pub width: u32,
     68     pub height: u32,
     69 }
     70 
     71 #[cfg_attr(
     72     any(feature = "serde", test),
     73     derive(serde::Serialize, serde::Deserialize)
     74 )]
     75 #[cfg_attr(all(test, feature = "std"), derive(dto_bindgen::Dto))]
     76 #[derive(Clone, Debug, Default, PartialEq, Eq)]
     77 pub struct SocialMediaThumbnail {
     78     pub url: String,
     79     pub dimensions: Option<SocialMediaDimensions>,
     80 }
     81 
     82 #[cfg_attr(
     83     any(feature = "serde", test),
     84     derive(serde::Serialize, serde::Deserialize)
     85 )]
     86 #[cfg_attr(all(test, feature = "std"), derive(dto_bindgen::Dto))]
     87 #[derive(Clone, Debug, Default, PartialEq, Eq)]
     88 pub struct SocialMediaMetadata {
     89     pub url: Option<String>,
     90     pub mime_type: Option<String>,
     91     pub sha256: Option<String>,
     92     pub original_sha256: Option<String>,
     93     #[cfg_attr(all(test, feature = "std"), dto(int = "json_string"))]
     94     pub size: Option<u64>,
     95     pub dimensions: Option<SocialMediaDimensions>,
     96     pub blurhash: Option<String>,
     97     pub thumbnails: Option<Vec<SocialMediaThumbnail>>,
     98     pub image: Option<String>,
     99     pub summary: Option<String>,
    100     pub alt: Option<String>,
    101     pub fallback: Option<String>,
    102     pub magnet: Option<String>,
    103     pub content_hashes: Option<Vec<String>>,
    104     pub services: Option<Vec<String>>,
    105     pub imeta: Option<Vec<Vec<String>>>,
    106 }
    107 
    108 #[cfg_attr(
    109     any(feature = "serde", test),
    110     derive(serde::Serialize, serde::Deserialize)
    111 )]
    112 #[cfg_attr(any(feature = "serde", test), serde(rename_all = "snake_case"))]
    113 #[derive(Clone, Debug, PartialEq, Eq)]
    114 pub enum ReportType {
    115     Nudity,
    116     Malware,
    117     Profanity,
    118     Illegal,
    119     Spam,
    120     Impersonation,
    121     Other,
    122 }
    123 
    124 #[cfg_attr(
    125     any(feature = "serde", test),
    126     derive(serde::Serialize, serde::Deserialize)
    127 )]
    128 #[derive(Clone, Debug, Default, PartialEq, Eq)]
    129 pub struct ReportFileTarget {
    130     pub sha256: Option<String>,
    131     pub url: Option<String>,
    132     pub magnet: Option<String>,
    133 }
    134 
    135 #[cfg_attr(
    136     any(feature = "serde", test),
    137     derive(serde::Serialize, serde::Deserialize)
    138 )]
    139 #[derive(Clone, Debug, PartialEq, Eq)]
    140 pub struct ReportTarget {
    141     pub reported_pubkey: String,
    142     pub event: Option<SocialTarget>,
    143     pub file: Option<ReportFileTarget>,
    144 }
    145 
    146 #[cfg(test)]
    147 #[cfg_attr(coverage_nightly, coverage(off))]
    148 mod tests {
    149     use super::*;
    150 
    151     #[test]
    152     fn supports_nip22_target_shapes() {
    153         let event = SocialTarget::Event {
    154             id: "a".repeat(64),
    155             author: Some(crate::test_valid_hex_64('b')),
    156             event_kind: Some(30023),
    157             relays: Some(vec!["wss://relay.example".to_string()]),
    158         };
    159         let address = SocialTarget::Address {
    160             address: "30023:pubkey:d-tag".to_string(),
    161             author: None,
    162             event_kind: Some(30023),
    163             relays: None,
    164         };
    165         let external = SocialTarget::External {
    166             id: "https://example.test/object".to_string(),
    167             external_kind: "web".to_string(),
    168             hint: None,
    169         };
    170 
    171         assert!(matches!(event, SocialTarget::Event { .. }));
    172         assert!(matches!(address, SocialTarget::Address { .. }));
    173         assert!(matches!(external, SocialTarget::External { .. }));
    174     }
    175 
    176     #[test]
    177     fn defaults_media_and_farm_anchor_primitives() {
    178         let media = SocialMediaMetadata::default();
    179         assert!(media.url.is_none());
    180         assert!(media.content_hashes.is_none());
    181         assert!(media.services.is_none());
    182 
    183         let anchor = SocialFarmAnchor::default();
    184         assert!(anchor.farm.pubkey.is_empty());
    185         assert!(anchor.farm.d_tag.is_empty());
    186         assert!(anchor.relays.is_none());
    187     }
    188 
    189     #[test]
    190     fn exposes_report_enums() {
    191         assert_eq!(ReportType::Spam, ReportType::Spam);
    192     }
    193 }
    194 #[path = "app_data.rs"]
    195 pub mod app_data;
    196 #[path = "follow.rs"]
    197 pub mod follow;
    198 #[path = "geochat.rs"]
    199 pub mod geochat;
    200 #[path = "gift_wrap.rs"]
    201 pub mod gift_wrap;
    202 #[path = "group.rs"]
    203 pub mod group;
    204 #[path = "http_auth.rs"]
    205 pub mod http_auth;
    206 #[path = "job.rs"]
    207 pub mod job;
    208 #[path = "job_feedback.rs"]
    209 pub mod job_feedback;
    210 #[path = "job_request.rs"]
    211 pub mod job_request;
    212 #[path = "job_result.rs"]
    213 pub mod job_result;
    214 #[path = "list.rs"]
    215 pub mod list;
    216 #[path = "list_set.rs"]
    217 pub mod list_set;
    218 #[path = "message.rs"]
    219 pub mod message;
    220 #[path = "message_file.rs"]
    221 pub mod message_file;
    222 #[path = "relay_auth.rs"]
    223 pub mod relay_auth;
    224 #[path = "relay_document.rs"]
    225 pub mod relay_document;
    226 #[path = "seal.rs"]
    227 pub mod seal;