use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use uuid::Uuid;
use ironflow_engine::signal::{SignalDelivery, SignalRejected, SignalResumed};
use ironflow_store::entities::Signal;
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[derive(Debug, Deserialize)]
pub struct SendSignalRequest {
pub name: String,
pub key: String,
#[cfg_attr(feature = "openapi", schema(value_type = Object))]
pub payload: Value,
pub idempotency_id: Option<String>,
}
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[derive(Debug, Serialize)]
pub struct ResumedRunResponse {
pub run_id: Uuid,
pub step_id: Uuid,
}
impl From<SignalResumed> for ResumedRunResponse {
fn from(r: SignalResumed) -> Self {
Self {
run_id: r.run_id,
step_id: r.step_id,
}
}
}
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[derive(Debug, Serialize)]
pub struct RejectedRunResponse {
pub run_id: Uuid,
pub step_id: Uuid,
pub error: String,
}
impl From<SignalRejected> for RejectedRunResponse {
fn from(r: SignalRejected) -> Self {
Self {
run_id: r.run_id,
step_id: r.step_id,
error: r.error,
}
}
}
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[derive(Debug, Serialize)]
pub struct SignalDeliveryResponse {
pub signal_id: Uuid,
pub duplicate: bool,
pub resumed: Vec<ResumedRunResponse>,
pub rejected: Vec<RejectedRunResponse>,
}
impl From<SignalDelivery> for SignalDeliveryResponse {
fn from(d: SignalDelivery) -> Self {
Self {
signal_id: d.signal_id,
duplicate: d.duplicate,
resumed: d
.resumed
.into_iter()
.map(ResumedRunResponse::from)
.collect(),
rejected: d
.rejected
.into_iter()
.map(RejectedRunResponse::from)
.collect(),
}
}
}
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[derive(Debug, Serialize)]
pub struct SignalResponse {
pub id: Uuid,
pub name: String,
pub key: String,
#[cfg_attr(feature = "openapi", schema(value_type = Object))]
pub payload: Value,
pub idempotency_id: Option<String>,
pub received_at: DateTime<Utc>,
}
impl From<Signal> for SignalResponse {
fn from(s: Signal) -> Self {
Self {
id: s.id,
name: s.name,
key: s.key,
payload: s.payload,
idempotency_id: s.idempotency_id,
received_at: s.received_at,
}
}
}
#[cfg_attr(feature = "openapi", derive(utoipa::IntoParams, utoipa::ToSchema))]
#[derive(Debug, Deserialize)]
pub struct ListSignalsQuery {
pub name: Option<String>,
pub key: Option<String>,
pub page: Option<u32>,
pub per_page: Option<u32>,
}