use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
use super::common::ApiErrorCode;
use super::email::Email;
use super::ssn::Cpr;
use super::url::Url;
#[must_use]
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MitIdAuthRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub redirect_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reference_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_phone: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_email: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_address: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
}
impl MitIdAuthRequest {
#[inline]
pub fn new() -> Self {
Self::default()
}
#[inline]
pub fn redirect_url(mut self, url: Url) -> Self {
self.redirect_url = Some(url);
self
}
#[inline]
pub fn reference_text(mut self, v: impl Into<String>) -> Self {
self.reference_text = Some(v.into());
self
}
#[inline]
pub fn request_phone(mut self, v: bool) -> Self {
self.request_phone = Some(v);
self
}
#[inline]
pub fn request_email(mut self, v: bool) -> Self {
self.request_email = Some(v);
self
}
#[inline]
pub fn request_address(mut self, v: bool) -> Self {
self.request_address = Some(v);
self
}
#[inline]
pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
self.ref_id = Some(ref_id.into());
self
}
}
#[must_use]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MitIdBackchannelAuthRequest {
pub ssn: Cpr,
pub binding_message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
}
impl MitIdBackchannelAuthRequest {
#[inline]
pub fn new(ssn: Cpr, binding_message: impl Into<String>) -> Self {
Self {
ssn,
binding_message: binding_message.into(),
callback_url: None,
ref_id: None,
}
}
#[inline]
pub fn callback_url(mut self, url: Url) -> Self {
self.callback_url = Some(url);
self
}
#[inline]
pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
self.ref_id = Some(ref_id.into());
self
}
}
#[must_use]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MitIdSignRequest {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub redirect_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
}
impl MitIdSignRequest {
#[inline]
pub fn new(text: impl Into<String>) -> Self {
Self {
text: text.into(),
redirect_url: None,
ref_id: None,
}
}
#[inline]
pub fn redirect_url(mut self, url: Url) -> Self {
self.redirect_url = Some(url);
self
}
#[inline]
pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
self.ref_id = Some(ref_id.into());
self
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "status")]
pub enum MitIdStatus {
#[serde(rename = "PENDING")]
Pending(MitIdPending),
#[serde(rename = "COMPLETED")]
Completed(MitIdCompleted),
#[serde(rename = "FAILED")]
Failed(MitIdFailed),
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MitIdPending {
pub id: String,
pub ref_id: Option<String>,
pub url: Option<String>,
pub binding_message: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MitIdCompleted {
pub id: String,
pub ref_id: Option<String>,
pub ssn: Cpr,
pub name: String,
pub given_name: String,
pub surname: String,
pub phone: Option<String>,
pub email: Option<Email>,
pub address: Option<String>,
pub birth_date: Option<NaiveDate>,
pub pid: Option<String>,
pub bank_id: Option<String>,
pub sign_result: Option<MitIdSignResult>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MitIdFailed {
pub id: String,
pub ref_id: Option<String>,
pub error: ApiErrorCode,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MitIdSignResult {
pub checksum: String,
}