hyaenidae/profiles/src/apub/actions/server.rs

78 lines
2.2 KiB
Rust
Raw Normal View History

use crate::{
apub::actions::{CreateServer, DeleteServer, UpdateServer},
Action, Context, Error, Outbound, Required,
};
impl Action for CreateServer {
fn perform(&self, ctx: &Context) -> Result<Option<Box<dyn Outbound + Send>>, Error> {
let server = ctx.store.servers.create(&self.domain, self.published)?;
let mut changes = server.changes();
if let Some(title) = &self.title {
changes.title(title);
}
if let Some(description) = &self.description {
changes.description(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.public_key_id, &apub.public_key)?;
} 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<Option<Box<dyn Outbound + Send>>, 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(title);
}
if let Some(description) = &self.description {
changes.description(description);
}
let server = if changes.any_changes() {
ctx.store.servers.update(&changes)?
} else {
server
};
if let Some((id, key)) = &self.public_key {
ctx.apub.store_server_public_key(server.id(), id, key)?;
}
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<Option<Box<dyn Outbound + Send>>, Error> {
Err(Error::Invalid)
}
}