forge_common 0.1.0

Library for dealing with forge servers
Documentation
use serde::{Deserialize, Serialize};

use crate::error::{AppError, AppResult};

use super::ForgeClient;

#[derive(Serialize)]
pub struct CreateDatabaseRequest {
    pub name: String,
    pub user: String,
    pub password: String,
}

#[derive(Debug, Deserialize)]
pub struct DatabaseResponse {
    pub database: Database,
}

#[derive(Debug, Deserialize)]
pub struct ListDatabaseResponse {
    pub databases: Vec<Database>,
}

#[derive(Debug, Deserialize)]
pub struct Database {
    pub id: u32,
    pub name: String,
    pub status: String,
    pub created_at: String,
}

impl ForgeClient {
    pub fn create_database(
        &self,
        server_id: &str,
        cdr: &CreateDatabaseRequest,
    ) -> AppResult<DatabaseResponse> {
        self.post_request(server_id, "databases", cdr)
    }

    pub fn list_databases(&self, server_id: &str) -> AppResult<ListDatabaseResponse> {
        self.list_request(server_id, "databases")
    }

    pub fn get_database(&self, server_id: &str, database_id: &str) -> AppResult<DatabaseResponse> {
        self.get_request(server_id, "databases", database_id)
    }

    pub fn delete_database(&self, server_id: &str, database_id: &str) -> AppResult<()> {
        self.delete_request(server_id, "databases", database_id)
    }

    pub fn delete_database_by_name(&self, server_id: &str, database_name: &str) -> AppResult<()> {
        match self
            .list_databases(server_id)?
            .databases
            .iter()
            .find(|database| database.name == database_name)
            .map(|database| database.id)
        {
            Some(database_id) => self.delete_database(server_id, &database_id.to_string()),
            None => Err(AppError::ForgeAPIError(format!(
                "Could not find database with the name: {}",
                database_name
            ))),
        }
    }
}