Skip to main content

idkollen_client/models/
ftn.rs

1use chrono::NaiveDate;
2use serde::{Deserialize, Serialize};
3
4use super::common::ApiErrorCode;
5use super::email::Email;
6use super::ssn::Hetu;
7use super::url::Url;
8
9/// Request body for starting a Finnish Trust Network (FTN) authentication session.
10#[must_use]
11#[derive(Debug, Clone, Default, Serialize)]
12#[serde(rename_all = "camelCase")]
13pub struct FtnAuthRequest {
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 phone number.
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub request_phone: Option<bool>,
20    /// Request the user's email address.
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub request_email: Option<bool>,
23    /// Request the user's registered address.
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub request_address: Option<bool>,
26    /// Reference ID returned verbatim in the result and callback.
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub ref_id: Option<String>,
29}
30
31impl FtnAuthRequest {
32    #[inline]
33    pub fn new() -> Self {
34        Self::default()
35    }
36
37    #[inline]
38    pub fn redirect_url(mut self, url: Url) -> Self {
39        self.redirect_url = Some(url);
40        self
41    }
42
43    #[inline]
44    pub fn request_phone(mut self, v: bool) -> Self {
45        self.request_phone = Some(v);
46        self
47    }
48
49    #[inline]
50    pub fn request_email(mut self, v: bool) -> Self {
51        self.request_email = Some(v);
52        self
53    }
54
55    #[inline]
56    pub fn request_address(mut self, v: bool) -> Self {
57        self.request_address = Some(v);
58        self
59    }
60
61    #[inline]
62    pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
63        self.ref_id = Some(ref_id.into());
64        self
65    }
66}
67
68/// FTN session status.
69#[non_exhaustive]
70#[derive(Debug, Clone, Deserialize)]
71#[serde(tag = "status")]
72pub enum FtnStatus {
73    #[serde(rename = "PENDING")]
74    Pending(FtnPending),
75    #[serde(rename = "COMPLETED")]
76    Completed(FtnCompleted),
77    #[serde(rename = "FAILED")]
78    Failed(FtnFailed),
79}
80
81/// Returned while the user has not yet acted.
82#[derive(Debug, Clone, Deserialize)]
83#[serde(rename_all = "camelCase")]
84pub struct FtnPending {
85    pub id: String,
86    pub ref_id: Option<String>,
87    /// Redirect URL for the FTN provider login page.
88    pub url: String,
89}
90
91/// Returned when the FTN session has completed successfully.
92#[derive(Debug, Clone, Deserialize)]
93#[serde(rename_all = "camelCase")]
94pub struct FtnCompleted {
95    pub id: String,
96    pub ref_id: Option<String>,
97    /// Finnish personal identity code (henkilötunnus). May be absent depending on the provider.
98    pub ssn: Option<Hetu>,
99    pub name: String,
100    pub given_name: String,
101    pub surname: String,
102    pub phone: Option<String>,
103    pub email: Option<Email>,
104    pub address: Option<String>,
105    pub birth_date: Option<NaiveDate>,
106    pub pid: Option<String>,
107    pub bank_id: Option<String>,
108}
109
110/// Returned when the FTN session has failed.
111#[derive(Debug, Clone, Deserialize)]
112#[serde(rename_all = "camelCase")]
113pub struct FtnFailed {
114    pub id: String,
115    pub ref_id: Option<String>,
116    pub error: ApiErrorCode,
117}