2021-01-16 04:25:06 +00:00
|
|
|
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 {
|
2021-01-28 02:58:38 +00:00
|
|
|
changes.title(&hyaenidae_content::html(title));
|
2021-01-16 04:25:06 +00:00
|
|
|
}
|
|
|
|
if let Some(description) = &self.description {
|
2021-01-28 02:58:38 +00:00
|
|
|
changes.description(&hyaenidae_content::html(description));
|
2021-01-16 04:25:06 +00:00
|
|
|
}
|
|
|
|
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())?;
|
|
|
|
|
2021-01-17 07:27:13 +00:00
|
|
|
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(),
|
|
|
|
)?;
|
2021-01-16 04:25:06 +00:00
|
|
|
} 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> {
|
2021-01-16 17:48:12 +00:00
|
|
|
let server = ctx
|
|
|
|
.store
|
|
|
|
.servers
|
|
|
|
.by_id(self.server_id)?
|
|
|
|
.req("server by id")?;
|
2021-01-16 04:25:06 +00:00
|
|
|
|
|
|
|
let mut changes = server.changes();
|
|
|
|
if let Some(title) = &self.title {
|
2021-01-28 02:58:38 +00:00
|
|
|
changes.title(&hyaenidae_content::html(title));
|
|
|
|
}
|
|
|
|
if let Some(title_source) = &self.title_source {
|
|
|
|
changes.title_source(title_source);
|
2021-01-16 04:25:06 +00:00
|
|
|
}
|
|
|
|
if let Some(description) = &self.description {
|
2021-01-28 02:58:38 +00:00
|
|
|
changes.description(&hyaenidae_content::html(description));
|
|
|
|
}
|
|
|
|
if let Some(description_source) = &self.description_source {
|
|
|
|
changes.description_source(description_source);
|
2021-01-16 04:25:06 +00:00
|
|
|
}
|
|
|
|
let server = if changes.any_changes() {
|
|
|
|
ctx.store.servers.update(&changes)?
|
|
|
|
} else {
|
|
|
|
server
|
|
|
|
};
|
|
|
|
|
2021-01-17 07:27:13 +00:00
|
|
|
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(),
|
|
|
|
)?;
|
2021-01-16 04:25:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|