pinpayments/resources/
refund.rs1use time::{OffsetDateTime};
2use serde::{Deserialize, Serialize};
3
4use crate::client::{Client, Response};
5use crate::error::PinError;
6use crate::ids::{RefundId, ChargeId};
7use crate::params::{Page, Paginator, unpack_contained, paginate};
8use crate::resources::{
9 Currency
10};
11use crate::build_map;
12
13#[derive(Clone, Debug, Serialize, Default)]
14pub struct CreateRefund {
15 pub amount: Option<i64>
16}
17
18#[derive(Clone, Debug, Default, Deserialize)]
19pub struct Refund {
20 pub token: RefundId,
21 pub success: Option<bool>,
22 pub amount: i64,
23 pub currency: Currency,
24 pub charge: ChargeId,
25 #[serde(with = "time::serde::iso8601::option")]
26 pub created_at: Option<OffsetDateTime>,
27 pub error_message: Option<String>,
28 pub status_message: String
29}
30
31impl Refund {
32 pub fn create(client: &Client, token: &ChargeId, params: CreateRefund) -> Response<Refund> {
33 unpack_contained(client.post_form(&format!("/charges/{}/refunds", token), ¶ms))
34 }
35
36 pub fn list(client: &Client, page: Option<u32>, per_page: Option<u32>) -> Response<Page<Refund>> {
37 let page = page.map(|s| s.to_string());
38 let per_page = per_page.map(|s| s.to_string());
39 let params = build_map([
40 ("page", page.as_deref()),
41 ("per_page", per_page.as_deref())
42 ]);
43 client.get_query("/refunds", ¶ms)
44 }
45
46 pub fn list_with_paginator(client: &Client, per_page: Option<u32>) -> Paginator<Result<Refund, PinError>> {
47 paginate(
48 move |page, per_page| {
49 Refund::list(client, Some(page), Some(per_page))
50 },
51 per_page.unwrap_or(25)
52 )
53 }
54
55 pub fn list_for_charge(client: &Client, token: &ChargeId, page: Option<u32>, per_page: Option<u32>) -> Response<Page<Refund>> {
56 let page = page.map(|s| s.to_string());
57 let per_page = per_page.map(|s| s.to_string());
58 let params = build_map([
59 ("page", page.as_deref()),
60 ("per_page", per_page.as_deref())
61 ]);
62 client.get_query(&format!("/charges/{}/refunds", token), ¶ms)
63 }
64
65 pub fn list_for_charge_with_paginator<'a>(client: &'a Client, token: &'a ChargeId, per_page: Option<u32>) -> Paginator<'a, Result<Refund, PinError>> {
66 paginate(
67 move |page, per_page| {
68 Refund::list_for_charge(client, token, Some(page), Some(per_page))
69 },
70 per_page.unwrap_or(25)
71 )
72 }
73
74 pub fn retrieve(client: &Client, token: &RefundId) -> Response<Refund> {
75 unpack_contained(client.get(&format!("/refunds/{}", token)))
76 }
77}