fundaia 0.52.2

Command line for the Fundaia deployment platform: projects, services, variables, deployments, logs and metrics
use super::*;

#[derive(Default)]
pub struct TaskDraft<'a> {
    pub name: Option<&'a str>,
    pub command: Option<&'a str>,
    pub schedule: Option<&'a str>,
    pub enabled: Option<bool>,
}

impl ApiClient {
    pub async fn tasks(&self, service_environment_id: &str) -> Result<Answer<TasksPage>> {
        self.get_answer(&format!(
            "/api/infra/services/{service_environment_id}/tasks"
        ))
        .await
    }

    pub async fn create_task(
        &self,
        service_environment_id: &str,
        draft: &TaskDraft<'_>,
    ) -> Result<Answer<TaskPage>> {
        self.post_answer(
            &format!("/api/infra/services/{service_environment_id}/tasks"),
            &task_body(draft),
        )
        .await
    }

    pub async fn update_task(
        &self,
        task_id: &str,
        draft: &TaskDraft<'_>,
    ) -> Result<Answer<TaskPage>> {
        self.answer(
            Method::PATCH,
            &format!("/api/infra/tasks/{task_id}"),
            Some(&task_body(draft)),
        )
        .await
    }

    pub async fn delete_task(&self, task_id: &str) -> Result<()> {
        self.delete(&format!("/api/infra/tasks/{task_id}")).await
    }

    pub async fn run_task(&self, task_id: &str) -> Result<Answer<TaskRunPage>> {
        self.post_answer(
            &format!("/api/infra/tasks/{task_id}/run"),
            &serde_json::json!({}),
        )
        .await
    }

    pub async fn task_runs(&self, task_id: &str) -> Result<Answer<TaskRunsPage>> {
        self.get_answer(&format!("/api/infra/tasks/{task_id}/runs"))
            .await
    }

    pub async fn task_run(&self, run_id: &str) -> Result<Answer<TaskRunPage>> {
        self.get_answer(&format!("/api/infra/task-runs/{run_id}"))
            .await
    }
}

fn task_body(draft: &TaskDraft<'_>) -> serde_json::Value {
    let mut body = serde_json::Map::new();
    if let Some(name) = draft.name {
        body.insert("name".into(), name.into());
    }
    if let Some(command) = draft.command {
        body.insert("command".into(), command.into());
    }
    if let Some(schedule) = draft.schedule {
        body.insert("schedule".into(), schedule.into());
    }
    if let Some(enabled) = draft.enabled {
        body.insert("enabled".into(), enabled.into());
    }
    serde_json::Value::Object(body)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_should_send_only_what_changes() {
        let draft = TaskDraft {
            enabled: Some(false),
            ..TaskDraft::default()
        };
        assert_eq!(task_body(&draft), serde_json::json!({ "enabled": false }));
    }
}