use crate::{ apub::actions::{CreateServer, DeleteServer, UpdateServer}, Action, Context, Error, Outbound, Required, }; impl Action for CreateServer { fn perform(&self, ctx: &Context) -> Result>, Error> { let server = ctx.store.servers.create(&self.domain, self.published)?; let mut changes = server.changes(); if let Some(title) = &self.title { changes.title(&hyaenidae_content::html(title)); } if let Some(description) = &self.description { changes.description(&hyaenidae_content::html(description)); } let server = if changes.any_changes() { ctx.store.servers.update(&changes)? } else { server }; if let Some(apub) = &self.apub { ctx.apub.server(&apub.application_apub_id, server.id())?; ctx.apub.store_server_public_key( server.id(), &apub.endpoints.public_key, &apub.public_key, )?; ctx.apub.store_server_endpoints( server.id(), &apub.application_apub_id, apub.endpoints.clone(), )?; } else { return Ok(Some(Box::new(crate::apub::results::ServerCreated { server_id: server.id(), }))); } Ok(None) } } impl Action for UpdateServer { fn perform(&self, ctx: &Context) -> Result>, Error> { let server = ctx .store .servers .by_id(self.server_id)? .req("server by id")?; let mut changes = server.changes(); if let Some(title) = &self.title { changes.title(&hyaenidae_content::html(title)); } if let Some(title_source) = &self.title_source { changes.title_source(title_source); } if let Some(description) = &self.description { changes.description(&hyaenidae_content::html(description)); } if let Some(description_source) = &self.description_source { changes.description_source(description_source); } let server = if changes.any_changes() { ctx.store.servers.update(&changes)? } else { server }; if let Some(apub) = &self.apub { let application_apub_id = ctx .apub .apub_for_server(server.id())? .req("apub id for server")?; ctx.apub.store_server_public_key( server.id(), &apub.endpoints.public_key, &apub.public_key, )?; ctx.apub.store_server_endpoints( server.id(), &application_apub_id, apub.endpoints.clone(), )?; } if ctx.is_self_server(self.server_id)? { return Ok(Some(Box::new(crate::apub::results::ServerUpdated { server_id: server.id(), }))); } Ok(None) } } impl Action for DeleteServer { fn perform(&self, _: &Context) -> Result>, Error> { Err(Error::Invalid) } }