1use crate::client::RainClient;
6use crate::error::Result;
7use crate::models::disputes::*;
8use uuid::Uuid;
9
10impl RainClient {
11 #[cfg(feature = "async")]
27 pub async fn list_disputes(&self, params: &ListDisputesParams) -> Result<Vec<Dispute>> {
28 let path = "/disputes";
29 let query_string = serde_urlencoded::to_string(params)?;
30 let full_path = if query_string.is_empty() {
31 path.to_string()
32 } else {
33 format!("{path}?{query_string}")
34 };
35 self.get(&full_path).await
36 }
37
38 #[cfg(feature = "async")]
55 pub async fn get_dispute(&self, dispute_id: &Uuid) -> Result<Dispute> {
56 let path = format!("/disputes/{dispute_id}");
57 self.get(&path).await
58 }
59
60 #[cfg(feature = "async")]
79 pub async fn update_dispute(
80 &self,
81 dispute_id: &Uuid,
82 request: &UpdateDisputeRequest,
83 ) -> Result<()> {
84 let path = format!("/disputes/{dispute_id}");
85 let _: serde_json::Value = self.patch(&path, request).await?;
86 Ok(())
87 }
88
89 #[cfg(feature = "async")]
99 pub async fn get_dispute_evidence(&self, dispute_id: &Uuid) -> Result<Vec<u8>> {
100 let path = format!("/disputes/{dispute_id}/evidence");
101 self.get_bytes(&path).await
102 }
103
104 #[cfg(feature = "async")]
115 pub async fn upload_dispute_evidence(
116 &self,
117 dispute_id: &Uuid,
118 request: &UploadDisputeEvidenceRequest,
119 ) -> Result<()> {
120 let path = format!("/disputes/{dispute_id}/evidence");
121
122 use reqwest::multipart::{Form, Part};
123 let form = Form::new()
124 .text("name", request.name.clone())
125 .text("type", request.evidence_type.clone())
126 .part(
127 "evidence",
128 Part::bytes(request.file.clone()).file_name(request.name.clone()),
129 );
130
131 self.put_multipart_no_content(&path, form).await
132 }
133
134 #[cfg(feature = "async")]
153 pub async fn create_transaction_dispute(
154 &self,
155 transaction_id: &Uuid,
156 request: &CreateDisputeRequest,
157 ) -> Result<Dispute> {
158 let path = format!("/transactions/{transaction_id}/disputes");
159 self.post(&path, request).await
160 }
161
162 #[cfg(feature = "sync")]
168 pub fn list_disputes_blocking(&self, params: &ListDisputesParams) -> Result<Vec<Dispute>> {
169 let path = "/disputes";
170 let query_string = serde_urlencoded::to_string(params)?;
171 let full_path = if query_string.is_empty() {
172 path.to_string()
173 } else {
174 format!("{path}?{query_string}")
175 };
176 self.get_blocking(&full_path)
177 }
178
179 #[cfg(feature = "sync")]
181 pub fn get_dispute_blocking(&self, dispute_id: &Uuid) -> Result<Dispute> {
182 let path = format!("/disputes/{dispute_id}");
183 self.get_blocking(&path)
184 }
185
186 #[cfg(feature = "sync")]
188 pub fn update_dispute_blocking(
189 &self,
190 dispute_id: &Uuid,
191 request: &UpdateDisputeRequest,
192 ) -> Result<()> {
193 let path = format!("/disputes/{dispute_id}");
194 let _: serde_json::Value = self.patch_blocking(&path, request)?;
195 Ok(())
196 }
197
198 #[cfg(feature = "sync")]
200 pub fn get_dispute_evidence_blocking(&self, dispute_id: &Uuid) -> Result<Vec<u8>> {
201 let path = format!("/disputes/{dispute_id}/evidence");
202 self.get_bytes_blocking(&path)
203 }
204
205 #[cfg(feature = "sync")]
207 pub fn upload_dispute_evidence_blocking(
208 &self,
209 dispute_id: &Uuid,
210 request: &UploadDisputeEvidenceRequest,
211 ) -> Result<()> {
212 let path = format!("/disputes/{dispute_id}/evidence");
213
214 use reqwest::blocking::multipart::{Form, Part};
215 let form = Form::new()
216 .text("name", request.name.clone())
217 .text("type", request.evidence_type.clone())
218 .part(
219 "evidence",
220 Part::bytes(request.file.clone()).file_name(request.name.clone()),
221 );
222
223 let url = self.build_url(&path)?;
224 let response = self.put_multipart_blocking_no_content(&path, form)?;
225 Ok(response)
226 }
227
228 #[cfg(feature = "sync")]
230 pub fn create_transaction_dispute_blocking(
231 &self,
232 transaction_id: &Uuid,
233 request: &CreateDisputeRequest,
234 ) -> Result<Dispute> {
235 let path = format!("/transactions/{transaction_id}/disputes");
236 self.post_blocking(&path, request)
237 }
238}