use anyhow::Context; use formatting::format_serror; use komodo_client::{ api::write::*, entities::{ NoData, Operation, permission::PermissionLevel, server::Server, to_docker_compatible_name, update::{Update, UpdateStatus}, }, }; use periphery_client::api; use resolver_api::Resolve; use crate::{ helpers::{ periphery_client, update::{add_update, make_update, update_update}, }, permission::get_check_permissions, resource, }; use super::WriteArgs; impl Resolve for CreateServer { #[instrument(name = "CreateServer", skip(user))] async fn resolve( self, WriteArgs { user }: &WriteArgs, ) -> serror::Result { resource::create::(&self.name, self.config, user).await } } impl Resolve for CopyServer { #[instrument(name = "CopyServer", skip(user))] async fn resolve( self, WriteArgs { user }: &WriteArgs, ) -> serror::Result { let Server { config, .. } = get_check_permissions::( &self.id, user, PermissionLevel::Read.into(), ) .await?; resource::create::(&self.name, config.into(), user).await } } impl Resolve for DeleteServer { #[instrument(name = "DeleteServer", skip(args))] async fn resolve(self, args: &WriteArgs) -> serror::Result { Ok(resource::delete::(&self.id, args).await?) } } impl Resolve for UpdateServer { #[instrument(name = "UpdateServer", skip(user))] async fn resolve( self, WriteArgs { user }: &WriteArgs, ) -> serror::Result { Ok(resource::update::(&self.id, self.config, user).await?) } } impl Resolve for RenameServer { #[instrument(name = "RenameServer", skip(user))] async fn resolve( self, WriteArgs { user }: &WriteArgs, ) -> serror::Result { Ok(resource::rename::(&self.id, &self.name, user).await?) } } impl Resolve for CreateNetwork { #[instrument(name = "CreateNetwork", skip(user))] async fn resolve( self, WriteArgs { user }: &WriteArgs, ) -> serror::Result { let server = get_check_permissions::( &self.server, user, PermissionLevel::Write.into(), ) .await?; let periphery = periphery_client(&server)?; let mut update = make_update(&server, Operation::CreateNetwork, user); update.status = UpdateStatus::InProgress; update.id = add_update(update.clone()).await?; match periphery .request(api::network::CreateNetwork { name: to_docker_compatible_name(&self.name), driver: None, }) .await { Ok(log) => update.logs.push(log), Err(e) => update.push_error_log( "create network", format_serror(&e.context("failed to create network").into()), ), }; update.finalize(); update_update(update.clone()).await?; Ok(update) } } impl Resolve for CreateTerminal { #[instrument(name = "CreateTerminal", skip(user))] async fn resolve( self, WriteArgs { user }: &WriteArgs, ) -> serror::Result { let server = get_check_permissions::( &self.server, user, PermissionLevel::Write.terminal(), ) .await?; let periphery = periphery_client(&server)?; periphery .request(api::terminal::CreateTerminal { name: self.name, command: self.command, recreate: self.recreate, }) .await .context("Failed to create terminal on periphery")?; Ok(NoData {}) } } impl Resolve for DeleteTerminal { #[instrument(name = "DeleteTerminal", skip(user))] async fn resolve( self, WriteArgs { user }: &WriteArgs, ) -> serror::Result { let server = get_check_permissions::( &self.server, user, PermissionLevel::Write.terminal(), ) .await?; let periphery = periphery_client(&server)?; periphery .request(api::terminal::DeleteTerminal { terminal: self.terminal, }) .await .context("Failed to delete terminal on periphery")?; Ok(NoData {}) } } impl Resolve for DeleteAllTerminals { #[instrument(name = "DeleteAllTerminals", skip(user))] async fn resolve( self, WriteArgs { user }: &WriteArgs, ) -> serror::Result { let server = get_check_permissions::( &self.server, user, PermissionLevel::Write.terminal(), ) .await?; let periphery = periphery_client(&server)?; periphery .request(api::terminal::DeleteAllTerminals {}) .await .context("Failed to delete all terminals on periphery")?; Ok(NoData {}) } }