refactor: split paheko source code
This commit is contained in:
parent
a604d63622
commit
af8b93ab91
3 changed files with 102 additions and 75 deletions
94
src/main.rs
94
src/main.rs
|
@ -1,3 +1,4 @@
|
||||||
|
mod utils;
|
||||||
mod paheko;
|
mod paheko;
|
||||||
mod helloasso;
|
mod helloasso;
|
||||||
|
|
||||||
|
@ -7,27 +8,8 @@ use chrono::prelude::{NaiveDate, DateTime, Utc, Datelike};
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
use serde::{Serialize, Deserialize};
|
use serde::{Serialize, Deserialize};
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use rand::{thread_rng, Rng};
|
|
||||||
use phonenumber;
|
use phonenumber;
|
||||||
|
use utils::generate_id;
|
||||||
/// ID
|
|
||||||
#[derive(Clone, Deserialize, Serialize, Debug, PartialEq, Eq, Hash)]
|
|
||||||
pub struct Id(pub u64);
|
|
||||||
impl Id {
|
|
||||||
pub fn to_string(&self) -> String {
|
|
||||||
format!("{:x}", self.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl Into<String> for Id {
|
|
||||||
fn into(self) -> String {
|
|
||||||
format!("{:x}", self.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn generate_id() -> Id {
|
|
||||||
Id(thread_rng().gen())
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// permanent config to store long-term config
|
/// permanent config to store long-term config
|
||||||
/// used to ingest env settings
|
/// used to ingest env settings
|
||||||
|
@ -142,48 +124,6 @@ async fn get_auth_client_from_cache(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
|
||||||
struct HelloassoReferences {
|
|
||||||
answer_id: u64,
|
|
||||||
order_id: u64
|
|
||||||
// payment_id: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
|
||||||
struct ExternalReferences {
|
|
||||||
helloasso_ref: HelloassoReferences
|
|
||||||
}
|
|
||||||
|
|
||||||
/// for now we include the custom fields into the paheko user
|
|
||||||
/// we don't have time to implement user settings to change the custom fields mapping
|
|
||||||
/// for now, manual mapping
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
|
||||||
struct PahekoUser {
|
|
||||||
id: Id,
|
|
||||||
first_name: String,
|
|
||||||
last_name: String,
|
|
||||||
email: Option<String>,
|
|
||||||
|
|
||||||
phone: Option<String>,
|
|
||||||
address: String,
|
|
||||||
city: String,
|
|
||||||
postal_code: String,
|
|
||||||
country: String,
|
|
||||||
skills: Option<String>,
|
|
||||||
job: Option<String>,
|
|
||||||
birthday: Option<u32>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
|
||||||
struct PahekoMembership {
|
|
||||||
id: Id,
|
|
||||||
users: Vec<Id>,
|
|
||||||
campaign: String,
|
|
||||||
mode: helloasso::MembershipMode,
|
|
||||||
inception_datum: DateTime<Utc>,
|
|
||||||
external_references: ExternalReferences
|
|
||||||
}
|
|
||||||
|
|
||||||
/// rust how to access inner enum value
|
/// rust how to access inner enum value
|
||||||
#[derive(Debug, PartialEq, Clone, Copy)]
|
#[derive(Debug, PartialEq, Clone, Copy)]
|
||||||
enum HelloassoCustomFieldType {
|
enum HelloassoCustomFieldType {
|
||||||
|
@ -247,6 +187,15 @@ fn parse_and_get_birthday_year(raw_date: String) -> Option<u32> {
|
||||||
Some(d.year().try_into().ok()?)
|
Some(d.year().try_into().ok()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn helloasso_to_paheko_membership(helloasso_membership: &helloasso::MembershipMode) -> paheko::MembershipMode {
|
||||||
|
match helloasso_membership {
|
||||||
|
helloasso::MembershipMode::Couple => paheko::MembershipMode::Couple,
|
||||||
|
helloasso::MembershipMode::Individual => paheko::MembershipMode::Individual,
|
||||||
|
helloasso::MembershipMode::BenefactorCouple => paheko::MembershipMode::BenefactorCouple,
|
||||||
|
helloasso::MembershipMode::BenefactorIndividual => paheko::MembershipMode::BenefactorIndividual
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async fn launch_adapter() -> Result<()> {
|
async fn launch_adapter() -> Result<()> {
|
||||||
dotenvy::dotenv()?;
|
dotenvy::dotenv()?;
|
||||||
|
|
||||||
|
@ -276,16 +225,15 @@ async fn launch_adapter() -> Result<()> {
|
||||||
// get the list of payments associated
|
// get the list of payments associated
|
||||||
|
|
||||||
// first step: output a list of PahekoUser with PahekoMembership
|
// first step: output a list of PahekoUser with PahekoMembership
|
||||||
let pk_memberships: Vec<PahekoMembership> = vec![];
|
let pk_memberships: Vec<paheko::Membership> = vec![];
|
||||||
let mut pk_users: Vec<PahekoUser> = vec![];
|
let mut pk_users: Vec<paheko::User> = vec![];
|
||||||
let mut pk_memberships: Vec<PahekoMembership> = vec![];
|
let mut pk_memberships: Vec<paheko::Membership> = vec![];
|
||||||
|
|
||||||
let mut count: u64 = 0;
|
let mut count: u64 = 0;
|
||||||
let mut names: HashSet<String> = HashSet::new();
|
let mut names: HashSet<String> = HashSet::new();
|
||||||
|
|
||||||
// read_custom_field(&answer, HelloAssoCustomFieldType::Email).or(Some(answer.payer_user.email.clone())),
|
// read_custom_field(&answer, HelloAssoCustomFieldType::Email).or(Some(answer.payer_user.email.clone())),
|
||||||
use email_address::*;
|
use email_address::*;
|
||||||
use std::str::FromStr;
|
|
||||||
fn choose_email(answer: &helloasso::FormAnswer) -> Option<String> {
|
fn choose_email(answer: &helloasso::FormAnswer) -> Option<String> {
|
||||||
read_custom_field(&answer, HelloassoCustomFieldType::Email)
|
read_custom_field(&answer, HelloassoCustomFieldType::Email)
|
||||||
.and_then(|x| {
|
.and_then(|x| {
|
||||||
|
@ -305,7 +253,7 @@ async fn launch_adapter() -> Result<()> {
|
||||||
names.insert(custom_field.name.clone());
|
names.insert(custom_field.name.clone());
|
||||||
count += 1;
|
count += 1;
|
||||||
}
|
}
|
||||||
let paheko_user = PahekoUser {
|
let paheko_user = paheko::User {
|
||||||
id: generate_id(),
|
id: generate_id(),
|
||||||
first_name: answer.user.first_name.clone(),
|
first_name: answer.user.first_name.clone(),
|
||||||
last_name: answer.user.last_name.clone(),
|
last_name: answer.user.last_name.clone(),
|
||||||
|
@ -321,14 +269,14 @@ async fn launch_adapter() -> Result<()> {
|
||||||
// FIXME: the reference will be in the data of the paheko activity, and will only
|
// FIXME: the reference will be in the data of the paheko activity, and will only
|
||||||
// reference the answer id
|
// reference the answer id
|
||||||
};
|
};
|
||||||
let mut pk_membership = PahekoMembership {
|
let mut pk_membership = paheko::Membership {
|
||||||
id: generate_id(),
|
id: generate_id(),
|
||||||
campaign: "".to_string(),
|
campaign: "".to_string(),
|
||||||
inception_datum: Utc::now(),
|
inception_datum: Utc::now(),
|
||||||
mode: answer.mode.clone(),
|
mode: helloasso_to_paheko_membership(&answer.mode),
|
||||||
users: vec![paheko_user.id.clone()],
|
users: vec![paheko_user.id.clone()],
|
||||||
external_references: ExternalReferences {
|
external_references: paheko::ExternalReferences {
|
||||||
helloasso_ref: HelloassoReferences {
|
helloasso_ref: paheko::HelloassoReferences {
|
||||||
answer_id: answer.id,
|
answer_id: answer.id,
|
||||||
order_id: answer.order.id
|
order_id: answer.order.id
|
||||||
}
|
}
|
||||||
|
@ -368,7 +316,6 @@ async fn launch_adapter() -> Result<()> {
|
||||||
dbg!(&pk_users.len());
|
dbg!(&pk_users.len());
|
||||||
dbg!(&pk_memberships.len());
|
dbg!(&pk_memberships.len());
|
||||||
|
|
||||||
|
|
||||||
// println!("{:?}", &pk_users.iter().map(|user| format!("{:?}", user.email)).collect::<Vec<String>>());
|
// println!("{:?}", &pk_users.iter().map(|user| format!("{:?}", user.email)).collect::<Vec<String>>());
|
||||||
|
|
||||||
for u in pk_users.iter() {
|
for u in pk_users.iter() {
|
||||||
|
@ -389,9 +336,6 @@ async fn launch_adapter() -> Result<()> {
|
||||||
// for each uses we extracted
|
// for each uses we extracted
|
||||||
// we check if there is an existing user by checking for the ha forn answer id
|
// we check if there is an existing user by checking for the ha forn answer id
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
62
src/paheko.rs
Normal file
62
src/paheko.rs
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
use anyhow::{Context, Result, anyhow};
|
||||||
|
use url::Url;
|
||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
use fully_pub::fully_pub;
|
||||||
|
use crate::utils::Id;
|
||||||
|
use chrono::prelude::{NaiveDate, DateTime, Utc, Datelike};
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[fully_pub]
|
||||||
|
struct HelloassoReferences {
|
||||||
|
answer_id: u64,
|
||||||
|
order_id: u64
|
||||||
|
// payment_id: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[fully_pub]
|
||||||
|
struct ExternalReferences {
|
||||||
|
helloasso_ref: HelloassoReferences
|
||||||
|
}
|
||||||
|
|
||||||
|
/// for now we include the custom fields into the paheko user
|
||||||
|
/// we don't have time to implement user settings to change the custom fields mapping
|
||||||
|
/// for now, manual mapping
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[fully_pub]
|
||||||
|
struct User {
|
||||||
|
id: Id,
|
||||||
|
first_name: String,
|
||||||
|
last_name: String,
|
||||||
|
email: Option<String>,
|
||||||
|
|
||||||
|
phone: Option<String>,
|
||||||
|
address: String,
|
||||||
|
city: String,
|
||||||
|
postal_code: String,
|
||||||
|
country: String,
|
||||||
|
skills: Option<String>,
|
||||||
|
job: Option<String>,
|
||||||
|
birthday: Option<u32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
||||||
|
#[fully_pub]
|
||||||
|
enum MembershipMode {
|
||||||
|
Individual,
|
||||||
|
Couple,
|
||||||
|
BenefactorIndividual,
|
||||||
|
BenefactorCouple,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
|
#[fully_pub]
|
||||||
|
struct Membership {
|
||||||
|
id: Id,
|
||||||
|
users: Vec<Id>,
|
||||||
|
campaign: String,
|
||||||
|
mode: MembershipMode,
|
||||||
|
inception_datum: DateTime<Utc>,
|
||||||
|
external_references: ExternalReferences
|
||||||
|
}
|
||||||
|
|
21
src/utils.rs
Normal file
21
src/utils.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
use rand::{thread_rng, Rng};
|
||||||
|
|
||||||
|
/// ID
|
||||||
|
#[derive(Clone, Deserialize, Serialize, Debug, PartialEq, Eq, Hash)]
|
||||||
|
pub struct Id(pub u64);
|
||||||
|
impl Id {
|
||||||
|
pub fn to_string(&self) -> String {
|
||||||
|
format!("{:x}", self.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Into<String> for Id {
|
||||||
|
fn into(self) -> String {
|
||||||
|
format!("{:x}", self.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn generate_id() -> Id {
|
||||||
|
Id(thread_rng().gen())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue