pinpayments/resources/
refund.rs

1use 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), &params))
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", &params)
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), &params)
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}