use serde::{Deserialize, Serialize};
use crate::event::{context::EventHeader, dispatcher::EventHandler};
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ApprovalInstanceRejectedV4 {
pub schema: String,
pub header: EventHeader,
pub event: P2ApprovalInstanceRejectedV4Data,
}
pub(crate) struct P2ApprovalInstanceRejectedV4ProcessorImpl<F>
where
F: Fn(P2ApprovalInstanceRejectedV4) + 'static,
{
f: F,
}
impl<F> EventHandler for P2ApprovalInstanceRejectedV4ProcessorImpl<F>
where
F: Fn(P2ApprovalInstanceRejectedV4) + 'static + Sync + Send,
{
fn handle(&self, payload: &[u8]) -> anyhow::Result<()> {
let event: P2ApprovalInstanceRejectedV4 = serde_json::from_slice(payload)?;
(self.f)(event);
Ok(())
}
}
impl<F> P2ApprovalInstanceRejectedV4ProcessorImpl<F>
where
F: Fn(P2ApprovalInstanceRejectedV4) + 'static,
{
pub(crate) fn new(f: F) -> Self {
P2ApprovalInstanceRejectedV4ProcessorImpl { f }
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct P2ApprovalInstanceRejectedV4Data {
pub object: ApprovalInstanceEventObject,
#[serde(skip_serializing_if = "Option::is_none")]
pub old_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rejection_info: Option<RejectionInfo>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApprovalInstanceEventObject {
pub object_type: String,
pub instance: RejectedApprovalInstance,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct RejectedApprovalInstance {
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 rejection_details: Option<RejectionDetails>,
#[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 reject_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>,
}
#[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>,
}
#[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 rejected_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 RejectionInfo {
pub reject_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub rejector_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rejector_info: Option<ApprovalUser>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reject_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct RejectionDetails {
pub rejected_node_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub can_resubmit: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suggested_changes: Option<Vec<String>>,
}