74 lines
2.2 KiB
Rust
74 lines
2.2 KiB
Rust
|
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()?;
|
||
|
|
||
|
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)
|
||
|
}
|
||
|
}
|