Skip to main content

idkollen_client/models/
vipps.rs

1use chrono::NaiveDate;
2use serde::{Deserialize, Serialize};
3
4use super::common::ApiErrorCode;
5use super::email::Email;
6use super::ssn::Nnin;
7use super::url::Url;
8
9/// Request body for starting a Vipps MobilePay authentication session.
10#[must_use]
11#[derive(Debug, Clone, Default, Serialize)]
12#[serde(rename_all = "camelCase")]
13pub struct VippsAuthRequest {
14    /// URL to redirect the user to after completing the flow.
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub redirect_url: Option<Url>,
17    /// Request the user's Norwegian personal number.
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub request_ssn: Option<bool>,
20    /// Request the user's phone number.
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub request_phone: Option<bool>,
23    /// Request the user's email address.
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub request_email: Option<bool>,
26    /// Request the user's registered address.
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub request_address: Option<bool>,
29    /// Reference ID returned verbatim in the result and callback.
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub ref_id: Option<String>,
32    /// (BETA) Deep-link URI to return the user to your app after authentication.
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub app_callback_uri: Option<Url>,
35}
36
37impl VippsAuthRequest {
38    #[inline]
39    pub fn new() -> Self {
40        Self::default()
41    }
42
43    #[inline]
44    pub fn redirect_url(mut self, url: Url) -> Self {
45        self.redirect_url = Some(url);
46        self
47    }
48
49    #[inline]
50    pub fn request_ssn(mut self, v: bool) -> Self {
51        self.request_ssn = Some(v);
52        self
53    }
54
55    #[inline]
56    pub fn request_phone(mut self, v: bool) -> Self {
57        self.request_phone = Some(v);
58        self
59    }
60
61    #[inline]
62    pub fn request_email(mut self, v: bool) -> Self {
63        self.request_email = Some(v);
64        self
65    }
66
67    #[inline]
68    pub fn request_address(mut self, v: bool) -> Self {
69        self.request_address = Some(v);
70        self
71    }
72
73    #[inline]
74    pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
75        self.ref_id = Some(ref_id.into());
76        self
77    }
78
79    #[inline]
80    pub fn app_callback_uri(mut self, uri: Url) -> Self {
81        self.app_callback_uri = Some(uri);
82        self
83    }
84}
85
86/// Request body for starting a Vipps MobilePay backchannel authentication session.
87#[must_use]
88#[derive(Debug, Clone, Serialize)]
89#[serde(rename_all = "camelCase")]
90pub struct VippsBackchannelAuthRequest {
91    /// Phone number of the user to authenticate.
92    pub phone: String,
93    /// Request the user's Norwegian personal number.
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub request_ssn: Option<bool>,
96    /// Request the user's email address.
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub request_email: Option<bool>,
99    /// Request the user's registered address.
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub request_address: Option<bool>,
102    /// URL to receive the result callback on success or failure.
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub callback_url: Option<Url>,
105    /// Reference ID returned verbatim in the result and callback.
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub ref_id: Option<String>,
108}
109
110impl VippsBackchannelAuthRequest {
111    #[inline]
112    pub fn new(phone: impl Into<String>) -> Self {
113        Self {
114            phone: phone.into(),
115            request_ssn: None,
116            request_email: None,
117            request_address: None,
118            callback_url: None,
119            ref_id: None,
120        }
121    }
122
123    #[inline]
124    pub fn request_ssn(mut self, v: bool) -> Self {
125        self.request_ssn = Some(v);
126        self
127    }
128
129    #[inline]
130    pub fn request_email(mut self, v: bool) -> Self {
131        self.request_email = Some(v);
132        self
133    }
134
135    #[inline]
136    pub fn request_address(mut self, v: bool) -> Self {
137        self.request_address = Some(v);
138        self
139    }
140
141    #[inline]
142    pub fn callback_url(mut self, url: Url) -> Self {
143        self.callback_url = Some(url);
144        self
145    }
146
147    #[inline]
148    pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
149        self.ref_id = Some(ref_id.into());
150        self
151    }
152}
153
154/// Vipps MobilePay session status.
155#[non_exhaustive]
156#[derive(Debug, Clone, Deserialize)]
157#[serde(tag = "status")]
158pub enum VippsStatus {
159    #[serde(rename = "PENDING")]
160    Pending(VippsPending),
161    #[serde(rename = "COMPLETED")]
162    Completed(VippsCompleted),
163    #[serde(rename = "FAILED")]
164    Failed(VippsFailed),
165}
166
167/// Returned while the user has not yet acted.
168#[derive(Debug, Clone, Deserialize)]
169#[serde(rename_all = "camelCase")]
170pub struct VippsPending {
171    pub id: String,
172    pub ref_id: Option<String>,
173    /// Redirect URL for the Vipps login page.
174    pub url: Option<String>,
175}
176
177/// Returned when the Vipps session has completed successfully.
178#[derive(Debug, Clone, Deserialize)]
179#[serde(rename_all = "camelCase")]
180pub struct VippsCompleted {
181    pub id: String,
182    pub ref_id: Option<String>,
183    /// Present when `request_ssn` was `true`.
184    pub ssn: Option<Nnin>,
185    pub name: String,
186    pub given_name: String,
187    pub surname: String,
188    pub phone: Option<String>,
189    pub email: Option<Email>,
190    pub address: Option<String>,
191    pub birth_date: Option<NaiveDate>,
192    pub pid: Option<String>,
193    pub bank_id: Option<String>,
194}
195
196/// Returned when the Vipps session has failed.
197#[derive(Debug, Clone, Deserialize)]
198#[serde(rename_all = "camelCase")]
199pub struct VippsFailed {
200    pub id: String,
201    pub ref_id: Option<String>,
202    pub error: ApiErrorCode,
203}