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;