use serde::{Deserialize, Serialize};
use crate::event::{context::EventHeader, dispatcher::EventHandler};
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ApprovalInstanceCreatedV4 {
pub schema: String,
pub header: EventHeader,
pub event: P2ApprovalInstanceCreatedV4Data,
}
pub(crate) struct P2ApprovalInstanceCreatedV4ProcessorImpl<F>
where
F: Fn(P2ApprovalInstanceCreatedV4) + 'static,
{
f: F,
}
impl<F> EventHandler for P2ApprovalInstanceCreatedV4ProcessorImpl<F>
where
F: Fn(P2ApprovalInstanceCreatedV4) + 'static + Sync + Send,
{
fn handle(&self, payload: &[u8]) -> anyhow::Result<()> {
let event: P2ApprovalInstanceCreatedV4 = serde_json::from_slice(payload)?;
(self.f)(event);
Ok(())
}
}
impl<F> P2ApprovalInstanceCreatedV4ProcessorImpl<F>
where
F: Fn(P2ApprovalInstanceCreatedV4) + 'static,
{
pub(crate) fn new(f: F) -> Self {
P2ApprovalInstanceCreatedV4ProcessorImpl { f }
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ApprovalInstanceCreatedV4Data {
pub object: ApprovalInstanceEventObject,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApprovalInstanceEventObject {
pub object_type: String,
pub instance: ApprovalInstance,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApprovalInstance {
pub instance_id: String,
pub approval_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub approval_name: Option<String>,
pub status: String,
pub user_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_info: Option<ApprovalUser>,
#[serde(skip_serializing_if = "Option::is_none")]
pub form: Option<ApprovalForm>,
#[serde(skip_serializing_if = "Option::is_none")]
pub process: Option<ApprovalProcess>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub submit_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub finish_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub serial_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instance_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachments: Option<Vec<ApprovalAttachment>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApprovalUser {
pub user_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_ids: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApprovalForm {
#[serde(skip_serializing_if = "Option::is_none")]
pub form_fields: Option<Vec<ApprovalFormField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApprovalFormField {
pub field_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_name: Option<String>,
pub field_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_value: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApprovalProcess {
#[serde(skip_serializing_if = "Option::is_none")]
pub nodes: Option<Vec<ApprovalNode>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_node_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApprovalNode {
pub node_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub node_name: Option<String>,
pub node_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub approvers: Option<Vec<ApprovalUser>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub process_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comment: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApprovalAttachment {
pub attachment_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachment_type: Option<String>,
}