use serde::{Deserialize, Serialize};
use crate::event::{context::EventHeader, dispatcher::EventHandler};
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ContactUserUpdatedV3 {
pub schema: String,
pub header: EventHeader,
pub event: P2ContactUserUpdatedV3Data,
}
pub(crate) struct P2ContactUserUpdatedV3ProcessorImpl<F>
where
F: Fn(P2ContactUserUpdatedV3) + 'static,
{
f: F,
}
impl<F> EventHandler for P2ContactUserUpdatedV3ProcessorImpl<F>
where
F: Fn(P2ContactUserUpdatedV3) + 'static + Sync + Send,
{
fn handle(&self, payload: &[u8]) -> anyhow::Result<()> {
let event: P2ContactUserUpdatedV3 = serde_json::from_slice(payload)?;
(self.f)(event);
Ok(())
}
}
impl<F> P2ContactUserUpdatedV3ProcessorImpl<F>
where
F: Fn(P2ContactUserUpdatedV3) + 'static,
{
pub(crate) fn new(f: F) -> Self {
P2ContactUserUpdatedV3ProcessorImpl { f }
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ContactUserUpdatedV3Data {
pub object: ContactEventObject,
#[serde(skip_serializing_if = "Option::is_none")]
pub old_object: Option<ContactEventObject>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ContactEventObject {
pub object_type: String,
pub user: ContactUser,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ContactUser {
pub user_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub union_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub open_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub en_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mobile: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gender: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar: Option<UserAvatar>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<UserStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_no: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_type: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub join_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_level: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub work_city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub leader_user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_tenant_manager: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_attrs: Option<Vec<UserCustomAttribute>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub update_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserAvatar {
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar_72: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar_240: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar_640: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar_origin: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserStatus {
#[serde(skip_serializing_if = "Option::is_none")]
pub is_frozen: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_resigned: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_activated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_exited: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserCustomAttribute {
#[serde(skip_serializing_if = "Option::is_none")]
pub type_: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<serde_json::Value>,
}