thunkmetrc_wrapper/services/
webhooks_service.rs1use thunkmetrc_client::MetrcClient;
2use serde_json::Value;
3use std::error::Error;
4use std::sync::Arc;
5#[allow(unused_imports)]
6use futures::Stream;
7use crate::ratelimiter::MetrcRateLimiter;
8#[allow(unused_imports)]
9use crate::utils::iterate_pages;
10#[allow(unused_imports)]
11use crate::models::*;
12
13pub struct WebhooksService {
14 client: MetrcClient,
15 rate_limiter: Arc<MetrcRateLimiter>,
16}
17
18impl WebhooksService {
19 pub fn new(client: MetrcClient, rate_limiter: Arc<MetrcRateLimiter>) -> Self {
20 Self {
21 client,
22 rate_limiter,
23 }
24 }
25
26 pub async fn delete_webhooks_by_subscription_id(&self, subscription_id: &str, body: Option<&Value>) -> std::result::Result<Option<serde_json::Value>, Box<dyn Error + Send + Sync>> {
31 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
32 let subscription_id = subscription_id.to_string();
33 let client = self.client.clone();
34
35 let body_val = body_val.clone();
36
37 let resp_val = self.rate_limiter.execute(None,false,
38 move || {
39 let client = client.clone();
40 let subscription_id = subscription_id.clone();
41 let body_val = body_val.clone();
42
43 async move {
44 client.webhooks().delete_webhooks_by_subscription_id(&subscription_id, body_val.as_ref()
45 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
46 }
47 }
48 ).await?;
49
50 if let Some(v) = resp_val {
51 let typed: serde_json::Value = serde_json::from_value(v)?;
52 Ok(Some(typed))
53 } else {
54 Ok(None)
55 }
56 }
57
58 pub async fn get_webhooks(&self, body: Option<&Value>) -> std::result::Result<Option<serde_json::Value>, Box<dyn Error + Send + Sync>> {
62 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
63 let client = self.client.clone();
64
65 let body_val = body_val.clone();
66
67 let resp_val = self.rate_limiter.execute(None,true,
68 move || {
69 let client = client.clone();
70 let body_val = body_val.clone();
71
72 async move {
73 client.webhooks().get_webhooks(body_val.as_ref()
74 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
75 }
76 }
77 ).await?;
78
79 if let Some(v) = resp_val {
80 let typed: serde_json::Value = serde_json::from_value(v)?;
81 Ok(Some(typed))
82 } else {
83 Ok(None)
84 }
85 }
86
87 pub async fn update_webhooks_disable_by_subscription_id(&self, subscription_id: &str, body: Option<&Value>) -> std::result::Result<Option<serde_json::Value>, Box<dyn Error + Send + Sync>> {
93 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
94 let subscription_id = subscription_id.to_string();
95 let client = self.client.clone();
96
97 let body_val = body_val.clone();
98
99 let resp_val = self.rate_limiter.execute(None,false,
100 move || {
101 let client = client.clone();
102 let subscription_id = subscription_id.clone();
103 let body_val = body_val.clone();
104
105 async move {
106 client.webhooks().update_webhooks_disable_by_subscription_id(&subscription_id, body_val.as_ref()
107 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
108 }
109 }
110 ).await?;
111
112 if let Some(v) = resp_val {
113 let typed: serde_json::Value = serde_json::from_value(v)?;
114 Ok(Some(typed))
115 } else {
116 Ok(None)
117 }
118 }
119
120 pub async fn update_webhooks_enable_by_subscription_id(&self, subscription_id: &str, body: Option<&Value>) -> std::result::Result<Option<serde_json::Value>, Box<dyn Error + Send + Sync>> {
126 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
127 let subscription_id = subscription_id.to_string();
128 let client = self.client.clone();
129
130 let body_val = body_val.clone();
131
132 let resp_val = self.rate_limiter.execute(None,false,
133 move || {
134 let client = client.clone();
135 let subscription_id = subscription_id.clone();
136 let body_val = body_val.clone();
137
138 async move {
139 client.webhooks().update_webhooks_enable_by_subscription_id(&subscription_id, body_val.as_ref()
140 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
141 }
142 }
143 ).await?;
144
145 if let Some(v) = resp_val {
146 let typed: serde_json::Value = serde_json::from_value(v)?;
147 Ok(Some(typed))
148 } else {
149 Ok(None)
150 }
151 }
152
153 pub async fn update_webhooks(&self, body: Option<UpdateWebhooksRequest>) -> std::result::Result<Option<WriteResponse>, Box<dyn Error + Send + Sync>> {
158 let body_val = if let Some(b) = body { Some(serde_json::to_value(b)?) } else { None };
159 let client = self.client.clone();
160
161 let body_val = body_val.clone();
162
163 let resp_val = self.rate_limiter.execute(None,false,
164 move || {
165 let client = client.clone();
166 let body_val = body_val.clone();
167
168 async move {
169 client.webhooks().update_webhooks(body_val.as_ref()
170 ).await.map_err(|e| e as Box<dyn Error + Send + Sync>)
171 }
172 }
173 ).await?;
174
175 if let Some(v) = resp_val {
176 let typed: WriteResponse = serde_json::from_value(v)?;
177 Ok(Some(typed))
178 } else {
179 Ok(None)
180 }
181 }
182}
183