use bson::{Document, doc};
use derive_builder::Builder;
use derive_default_builder::DefaultBuilder;
use partial_derive2::Partial;
use serde::{Deserialize, Serialize};
use strum::Display;
use typeshare::typeshare;
use crate::{
deserializers::{
file_contents_deserializer, option_file_contents_deserializer,
},
entities::{FileFormat, I64, NoData},
};
use super::{
ScheduleFormat,
resource::{Resource, ResourceListItem, ResourceQuery},
};
#[typeshare]
pub type ActionListItem = ResourceListItem<ActionListItemInfo>;
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ActionListItemInfo {
pub state: ActionState,
pub last_run_at: Option<I64>,
pub next_scheduled_run: Option<I64>,
pub schedule_error: Option<String>,
}
#[typeshare]
#[derive(
Debug,
Clone,
Copy,
Default,
PartialEq,
Eq,
PartialOrd,
Ord,
Display,
Serialize,
Deserialize,
)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub enum ActionState {
#[default]
Unknown,
Ok,
Failed,
Running,
}
#[cfg(feature = "utoipa")]
#[derive(utoipa::ToSchema)]
#[schema(as = Action)]
pub struct ActionSchema(
#[schema(inline)] pub Resource<ActionConfig, NoData>,
);
#[typeshare]
pub type Action = Resource<ActionConfig, NoData>;
#[typeshare(serialized_as = "Partial<ActionConfig>")]
pub type _PartialActionConfig = PartialActionConfig;
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Builder, Partial)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[partial_derive(Serialize, Deserialize, Debug, Clone, Default)]
#[diff_derive(Serialize, Deserialize, Debug, Clone, Default)]
#[partial(skip_serializing_none, from, diff)]
pub struct ActionConfig {
#[serde(default = "default_run_at_startup")]
#[builder(default = "default_run_at_startup()")]
#[partial_default(default_run_at_startup())]
pub run_at_startup: bool,
#[serde(default)]
#[builder(default)]
pub schedule_format: ScheduleFormat,
#[serde(default)]
#[builder(default)]
pub schedule: String,
#[serde(default = "default_schedule_enabled")]
#[builder(default = "default_schedule_enabled()")]
#[partial_default(default_schedule_enabled())]
pub schedule_enabled: bool,
#[serde(default)]
#[builder(default)]
pub schedule_timezone: String,
#[serde(default = "default_schedule_alert")]
#[builder(default = "default_schedule_alert()")]
#[partial_default(default_schedule_alert())]
pub schedule_alert: bool,
#[serde(default = "default_failure_alert")]
#[builder(default = "default_failure_alert()")]
#[partial_default(default_failure_alert())]
pub failure_alert: bool,
#[serde(default = "default_webhook_enabled")]
#[builder(default = "default_webhook_enabled()")]
#[partial_default(default_webhook_enabled())]
pub webhook_enabled: bool,
#[serde(default)]
#[builder(default)]
pub webhook_secret: String,
#[serde(default)]
#[builder(default)]
pub reload_deno_deps: bool,
#[serde(default, deserialize_with = "file_contents_deserializer")]
#[partial_attr(serde(
default,
deserialize_with = "option_file_contents_deserializer"
))]
#[builder(default)]
pub file_contents: String,
#[serde(default)]
#[builder(default)]
pub arguments_format: FileFormat,
#[serde(default, deserialize_with = "file_contents_deserializer")]
#[partial_attr(serde(
default,
deserialize_with = "option_file_contents_deserializer"
))]
#[builder(default)]
pub arguments: String,
}
fn default_schedule_enabled() -> bool {
true
}
fn default_schedule_alert() -> bool {
true
}
fn default_failure_alert() -> bool {
true
}
fn default_run_at_startup() -> bool {
false
}
fn default_webhook_enabled() -> bool {
true
}
impl ActionConfig {
pub fn builder() -> ActionConfigBuilder {
ActionConfigBuilder::default()
}
}
impl Default for ActionConfig {
fn default() -> Self {
Self {
schedule_format: Default::default(),
schedule: Default::default(),
schedule_enabled: default_schedule_enabled(),
schedule_timezone: Default::default(),
run_at_startup: default_run_at_startup(),
schedule_alert: default_schedule_alert(),
failure_alert: default_failure_alert(),
webhook_enabled: default_webhook_enabled(),
webhook_secret: Default::default(),
reload_deno_deps: Default::default(),
arguments_format: Default::default(),
file_contents: Default::default(),
arguments: Default::default(),
}
}
}
#[cfg(feature = "utoipa")]
impl utoipa::PartialSchema for PartialActionConfig {
fn schema()
-> utoipa::openapi::RefOr<utoipa::openapi::schema::Schema> {
utoipa::schema!(#[inline] std::collections::HashMap<String, serde_json::Value>).into()
}
}
#[cfg(feature = "utoipa")]
impl utoipa::ToSchema for PartialActionConfig {}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Copy, Default)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ActionActionState {
pub running: u32,
}
#[typeshare]
pub type ActionQuery = ResourceQuery<ActionQuerySpecifics>;
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Default, DefaultBuilder,
)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct ActionQuerySpecifics {}
impl super::resource::AddFilters for ActionQuerySpecifics {
fn add_filters(&self, _filters: &mut Document) {}
}