@@ -179,29 +179,50 @@ pub struct ListSubscribersResponse {
179
179
// MARK: - Get Subscriber
180
180
181
181
#[ derive( Debug , uniffi:: Enum ) ]
182
- pub enum GetSubscriberQuery {
182
+ pub enum GetSubscriberParams {
183
183
// Return subscribers that receive notifications via WordPress.com for new posts.
184
184
WpCom ( UserId ) ,
185
185
186
186
// Return subscribers that receive notifications via email for new posts.
187
187
Email ( SubscriptionId ) ,
188
188
}
189
189
190
- impl AppendUrlQueryPairs for GetSubscriberQuery {
190
+ impl AppendUrlQueryPairs for GetSubscriberParams {
191
191
fn append_query_pairs ( & self , query_pairs_mut : & mut QueryPairs ) {
192
192
match self {
193
- GetSubscriberQuery :: WpCom ( user_id) => {
193
+ GetSubscriberParams :: WpCom ( user_id) => {
194
194
query_pairs_mut. append_pair ( "user_id" , & user_id. to_string ( ) ) ;
195
195
query_pairs_mut. append_pair ( "type" , "wpcom" ) ;
196
196
}
197
- GetSubscriberQuery :: Email ( email) => {
197
+ GetSubscriberParams :: Email ( email) => {
198
198
query_pairs_mut. append_pair ( "subscription_id" , & email. to_string ( ) ) ;
199
199
query_pairs_mut. append_pair ( "type" , "email" ) ;
200
200
}
201
201
}
202
202
}
203
203
}
204
204
205
+ // MARK: - Individual Subscriber Stats
206
+
207
+ #[ derive( Debug , PartialEq , Eq , uniffi:: Record ) ]
208
+ pub struct IndividualSubscriberStatsParams {
209
+ pub subscription_id : SubscriptionId ,
210
+ }
211
+
212
+ impl AppendUrlQueryPairs for IndividualSubscriberStatsParams {
213
+ fn append_query_pairs ( & self , query_pairs_mut : & mut QueryPairs ) {
214
+ query_pairs_mut. append_query_value_pair ( "subscription_id" , & self . subscription_id ) ;
215
+ }
216
+ }
217
+
218
+ #[ derive( Debug , Serialize , Deserialize , uniffi:: Record ) ]
219
+ pub struct IndividualSubscriberStats {
220
+ emails_sent : u64 ,
221
+ unique_opens : u64 ,
222
+ unique_clicks : u64 ,
223
+ blog_registration_date : String ,
224
+ }
225
+
205
226
// MARK: - Add Subscribers
206
227
207
228
#[ derive( Debug , Serialize , Deserialize , Default , uniffi:: Record ) ]
@@ -445,7 +466,7 @@ mod tests {
445
466
. expect ( "Failed to parse url" ) ;
446
467
447
468
let mut query_pairs = url. query_pairs_mut ( ) ;
448
- GetSubscriberQuery :: WpCom ( UserId ( 123 ) ) . append_query_pairs ( & mut query_pairs) ;
469
+ GetSubscriberParams :: WpCom ( UserId ( 123 ) ) . append_query_pairs ( & mut query_pairs) ;
449
470
assert_eq ! (
450
471
query_pairs. finish( ) . as_str( ) ,
451
472
"https://public-api.wordpress.com/wpcom/v2/sites/1234/subscribers/individual?user_id=123&type=wpcom"
@@ -460,7 +481,7 @@ mod tests {
460
481
. expect ( "Failed to parse url" ) ;
461
482
462
483
let mut query_pairs = url. query_pairs_mut ( ) ;
463
- GetSubscriberQuery :: Email ( SubscriptionId ( 123 ) ) . append_query_pairs ( & mut query_pairs) ;
484
+ GetSubscriberParams :: Email ( SubscriptionId ( 123 ) ) . append_query_pairs ( & mut query_pairs) ;
464
485
assert_eq ! (
465
486
query_pairs. finish( ) . as_str( ) ,
466
487
"https://public-api.wordpress.com/wpcom/v2/sites/1234/subscribers/individual?subscription_id=123&type=email"
@@ -566,4 +587,13 @@ mod tests {
566
587
assert_eq ! ( plans. len( ) , 2 ) ;
567
588
assert_eq ! ( plans[ 0 ] . start_date. to_string( ) , "2025-01-13T18:51:55+00:00" ) ;
568
589
}
590
+
591
+ #[ test]
592
+ fn test_individual_subscriber_stats_response_deserialization ( ) {
593
+ let json_file_path = "tests/wpcom/subscribers/individual-subscriber-stats.json" ;
594
+ let file = std:: fs:: File :: open ( json_file_path) . expect ( "Failed to open file" ) ;
595
+ let stats: IndividualSubscriberStats =
596
+ serde_json:: from_reader ( file) . expect ( "Unable to parse JSON" ) ;
597
+ assert_eq ! ( stats. emails_sent, 2 ) ;
598
+ }
569
599
}
0 commit comments