reduce code repetition

This commit is contained in:
glyph 2022-03-03 09:33:45 +02:00
parent 69a8cc262e
commit 59ef5960a4
1 changed files with 339 additions and 359 deletions

View File

@ -23,6 +23,68 @@ use crate::{
utils,
};
// HELPER FUNCTIONS
/// Check to see if the go-sbot.service process is currently active.
/// Return an error in the form of a `String` if the process
/// check command fails. Otherwise, return the state of the process.
fn is_sbot_active() -> Result<bool, String> {
// retrieve go-sbot systemd process status
let sbot_status = match SbotStatus::read() {
Ok(status) => status,
Err(e) => return Err(format!("Failed to read sbot status: {}", e)),
};
if sbot_status.state == Some("active".to_string()) {
Ok(true)
} else {
Ok(false)
}
}
/// Ensure that the given public key is a valid ed25519 key.
fn validate_public_key(public_key: &str, redirect_url: String) -> Result<(), Flash<Redirect>> {
// ensure the id starts with the correct sigil link
if !public_key.starts_with('@') {
return Err(Flash::error(
Redirect::to(redirect_url),
"Invalid key: expected '@' sigil as first character",
));
}
// find the dot index denoting the start of the algorithm definition tag
let dot_index = match public_key.rfind('.') {
Some(index) => index,
None => {
return Err(Flash::error(
Redirect::to(redirect_url),
"Invalid key: no dot index was found",
))
}
};
// check hashing algorithm (must end with ".ed25519")
if !&public_key.ends_with(".ed25519") {
return Err(Flash::error(
Redirect::to(redirect_url),
"Invalid key: hashing algorithm must be ed25519",
));
}
// obtain the base64 portion (substring) of the public key
let base64_str = &public_key[1..dot_index];
// length of a base64 encoded ed25519 public key
if base64_str.len() != 44 {
return Err(Flash::error(
Redirect::to(redirect_url),
"Invalid key: base64 data length is incorrect",
));
}
Ok(())
}
// HELPERS AND ROUTES FOR INVITES
#[get("/invites")]
@ -66,38 +128,39 @@ pub async fn create_invite(invite: Form<Invite>, _auth: Authenticated) -> Flash<
let url = uri!("/scuttlebutt", invites);
// retrieve go-sbot systemd process status
// TODO: handle unwrap properly
let sbot_status = SbotStatus::read().unwrap();
// we only want to try and interact with the sbot if it's active
if sbot_status.state == Some("active".to_string()) {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
match is_sbot_active() {
Ok(true) => {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Generating Scuttlebutt invite code");
match sbot_client.invite_create(uses).await {
// construct a custom flash msg to pass along the invite code
Ok(code) => Flash::new(Redirect::to(url), "code", code),
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to create invite code: {}", e),
),
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Generating Scuttlebutt invite code");
match sbot_client.invite_create(uses).await {
// construct a custom flash msg to pass along the invite code
Ok(code) => Flash::new(Redirect::to(url), "code", code),
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to create invite code: {}", e),
),
}
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
} else {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, new posts cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
Ok(false) => {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, new posts cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
)
}
// failed to retrieve go-sbot systemd process status
Err(e) => return Flash::error(Redirect::to(url), e)
}
}
@ -154,56 +217,50 @@ pub struct Private {
pub async fn private_post(private: Form<Private>, _auth: Authenticated) -> Flash<Redirect> {
let url = uri!("/scuttlebutt", private(None::<String>));
// retrieve go-sbot systemd process status
let sbot_status = match SbotStatus::read() {
Ok(status) => status,
Err(e) => {
return Flash::error(
Redirect::to(url),
format!("Failed to read sbot status: {}", e),
)
}
};
// we only want to try and interact with the sbot if it's active
if sbot_status.state == Some("active".to_string()) {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
match is_sbot_active() {
Ok(true) => {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
let id = &private.id;
let text = &private.text;
let recipient = &private.recipient;
// now we need to add the local id to the recipients vector,
// otherwise the local id will not be able to read the message.
let recipients = vec![id.to_string(), recipient.to_string()];
let id = &private.id;
let text = &private.text;
let recipient = &private.recipient;
// now we need to add the local id to the recipients vector,
// otherwise the local id will not be able to read the message.
let recipients = vec![id.to_string(), recipient.to_string()];
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Publishing a new Scuttlebutt private message");
match sbot_client
.publish_private(text.to_string(), recipients)
.await
{
Ok(_) => {
Flash::success(Redirect::to(url), format!("Published private message"))
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Publishing a new Scuttlebutt private message");
match sbot_client
.publish_private(text.to_string(), recipients)
.await
{
Ok(_) => {
Flash::success(Redirect::to(url), format!("Published private message"))
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to publish private message: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to publish private message: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
} else {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, new private message cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
Ok(false) => {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, new private message cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
}
// failed to retrieve go-sbot systemd process status
Err(e) => return Flash::error(Redirect::to(url), e),
}
}
@ -240,48 +297,6 @@ pub struct Peer {
pub public_key: String,
}
fn validate_public_key(public_key: &str, redirect_url: String) -> Result<(), Flash<Redirect>> {
// ensure the id starts with the correct sigil link
if !public_key.starts_with('@') {
return Err(Flash::error(
Redirect::to(redirect_url),
"Invalid key: expected '@' sigil as first character",
));
}
// find the dot index denoting the start of the algorithm definition tag
let dot_index = match public_key.rfind('.') {
Some(index) => index,
None => {
return Err(Flash::error(
Redirect::to(redirect_url),
"Invalid key: no dot index was found",
))
}
};
// check hashing algorithm (must end with ".ed25519")
if !&public_key.ends_with(".ed25519") {
return Err(Flash::error(
Redirect::to(redirect_url),
"Invalid key: hashing algorithm must be ed25519",
));
}
// obtain the base64 portion (substring) of the public key
let base64_str = &public_key[1..dot_index];
// length of a base64 encoded ed25519 public key
if base64_str.len() != 44 {
return Err(Flash::error(
Redirect::to(redirect_url),
"Invalid key: base64 data length is incorrect",
));
}
Ok(())
}
/// Accept the peer search form and redirect to the profile for that peer.
#[post("/search", data = "<peer>")]
pub async fn search_post(peer: Form<Peer>, _auth: Authenticated) -> Flash<Redirect> {
@ -291,6 +306,7 @@ pub async fn search_post(peer: Form<Peer>, _auth: Authenticated) -> Flash<Redire
// validate the key before redirecting to profile url
if let Err(flash) = validate_public_key(&public_key, search_url) {
// redirect with error message
return flash;
}
@ -343,46 +359,39 @@ pub struct Post {
#[post("/publish", data = "<post>")]
pub async fn publish(post: Form<Post>, _auth: Authenticated) -> Flash<Redirect> {
let post_text = &post.text;
let url = uri!("/scuttlebutt", profile(None::<String>));
// retrieve go-sbot systemd process status
let sbot_status = match SbotStatus::read() {
Ok(status) => status,
Err(e) => {
return Flash::error(
Redirect::to(url),
format!("Failed to read sbot status: {}", e),
)
}
};
// we only want to try and interact with the sbot if it's active
if sbot_status.state == Some("active".to_string()) {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
match is_sbot_active() {
Ok(true) => {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Publishing new Scuttlebutt public post");
match sbot_client.publish_post(post_text).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Published post")),
Err(e) => {
Flash::error(Redirect::to(url), format!("Failed to publish post: {}", e))
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Publishing new Scuttlebutt public post");
match sbot_client.publish_post(post_text).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Published post")),
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to publish post: {}", e),
),
}
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
} else {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, new posts cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
Ok(false) => {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, new posts cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
}
Err(e) => return Flash::error(Redirect::to(url), e),
}
}
@ -394,46 +403,38 @@ pub async fn publish(post: Form<Post>, _auth: Authenticated) -> Flash<Redirect>
#[post("/follow", data = "<peer>")]
pub async fn follow(peer: Form<Peer>, _auth: Authenticated) -> Flash<Redirect> {
let public_key = &peer.public_key;
let url = uri!("/scuttlebutt", profile(Some(public_key)));
// retrieve go-sbot systemd process status
let sbot_status = match SbotStatus::read() {
Ok(status) => status,
Err(e) => {
return Flash::error(
Redirect::to(url),
format!("Failed to read sbot status: {}", e),
)
}
};
// we only want to try and interact with the sbot if it's active
if sbot_status.state == Some("active".to_string()) {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
match is_sbot_active() {
Ok(true) => {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Following Scuttlebutt peer");
match sbot_client.follow(public_key).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Followed peer")),
Err(e) => {
Flash::error(Redirect::to(url), format!("Failed to follow peer: {}", e))
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Following Scuttlebutt peer");
match sbot_client.follow(public_key).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Followed peer")),
Err(e) => {
Flash::error(Redirect::to(url), format!("Failed to follow peer: {}", e))
}
}
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
} else {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, follow messages cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
Ok(false) => {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, follow messages cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
}
Err(e) => return Flash::error(Redirect::to(url), e),
}
}
@ -448,43 +449,37 @@ pub async fn unfollow(peer: Form<Peer>, _auth: Authenticated) -> Flash<Redirect>
let url = uri!("/scuttlebutt", profile(Some(public_key)));
// retrieve go-sbot systemd process status
let sbot_status = match SbotStatus::read() {
Ok(status) => status,
Err(e) => {
return Flash::error(
Redirect::to(url),
format!("Failed to read sbot status: {}", e),
)
}
};
// we only want to try and interact with the sbot if it's active
if sbot_status.state == Some("active".to_string()) {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
match is_sbot_active() {
Ok(true) => {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Unfollowing Scuttlebutt peer");
match sbot_client.unfollow(public_key).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Unfollowed peer")),
Err(e) => {
Flash::error(Redirect::to(url), format!("Failed to unfollow peer: {}", e))
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Unfollowing Scuttlebutt peer");
match sbot_client.unfollow(public_key).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Unfollowed peer")),
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to unfollow peer: {}", e),
),
}
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
} else {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, follow messages cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
Ok(false) => {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, follow messages cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
}
Err(e) => return Flash::error(Redirect::to(url), e),
}
}
@ -496,46 +491,38 @@ pub async fn unfollow(peer: Form<Peer>, _auth: Authenticated) -> Flash<Redirect>
#[post("/block", data = "<peer>")]
pub async fn block(peer: Form<Peer>, _auth: Authenticated) -> Flash<Redirect> {
let public_key = &peer.public_key;
let url = uri!("/scuttlebutt", profile(Some(public_key)));
// retrieve go-sbot systemd process status
let sbot_status = match SbotStatus::read() {
Ok(status) => status,
Err(e) => {
return Flash::error(
Redirect::to(url),
format!("Failed to read sbot status: {}", e),
)
}
};
// we only want to try and interact with the sbot if it's active
if sbot_status.state == Some("active".to_string()) {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
match is_sbot_active() {
Ok(true) => {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Blocking Scuttlebutt peer");
match sbot_client.block(public_key).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Blocked peer")),
Err(e) => {
Flash::error(Redirect::to(url), format!("Failed to block peer: {}", e))
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Blocking Scuttlebutt peer");
match sbot_client.block(public_key).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Blocked peer")),
Err(e) => {
Flash::error(Redirect::to(url), format!("Failed to block peer: {}", e))
}
}
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
} else {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, follow messages cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
Ok(false) => {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, follow messages cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
}
Err(e) => return Flash::error(Redirect::to(url), e),
}
}
@ -547,46 +534,39 @@ pub async fn block(peer: Form<Peer>, _auth: Authenticated) -> Flash<Redirect> {
#[post("/unblock", data = "<peer>")]
pub async fn unblock(peer: Form<Peer>, _auth: Authenticated) -> Flash<Redirect> {
let public_key = &peer.public_key;
let url = uri!("/scuttlebutt", profile(Some(public_key)));
// retrieve go-sbot systemd process status
let sbot_status = match SbotStatus::read() {
Ok(status) => status,
Err(e) => {
return Flash::error(
Redirect::to(url),
format!("Failed to read sbot status: {}", e),
)
}
};
// we only want to try and interact with the sbot if it's active
if sbot_status.state == Some("active".to_string()) {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
match is_sbot_active() {
Ok(true) => {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Unblocking Scuttlebutt peer");
match sbot_client.unblock(public_key).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Unblocked peer")),
Err(e) => {
Flash::error(Redirect::to(url), format!("Failed to unblock peer: {}", e))
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
debug!("Unblocking Scuttlebutt peer");
match sbot_client.unblock(public_key).await {
Ok(_) => Flash::success(Redirect::to(url), format!("Unblocked peer")),
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to unblock peer: {}", e),
),
}
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
} else {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, follow messages cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
Ok(false) => {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, follow messages cannot be published. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
}
Err(e) => return Flash::error(Redirect::to(url), e),
}
}
@ -697,105 +677,105 @@ pub async fn update_profile_post(
) -> Flash<Redirect> {
let url = uri!("/scuttlebutt", update_profile);
// retrieve go-sbot systemd process status
// TODO: handle unwrap properly
let sbot_status = SbotStatus::read().unwrap();
// we only want to try and interact with the sbot if it's active
if sbot_status.state == Some("active".to_string()) {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
match is_sbot_active() {
Ok(true) => {
// retrieve latest go-sbot configuration parameters
let sbot_config = SbotConfig::read().ok();
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
// track whether the name, description or image have been updated
let mut name_updated: bool = false;
let mut description_updated: bool = false;
let image_updated: bool;
// initialise sbot connection with ip:port and shscap from config file
match scuttlebutt::init_sbot_with_config(&sbot_config).await {
Ok(mut sbot_client) => {
// track whether the name, description or image have been updated
let mut name_updated: bool = false;
let mut description_updated: bool = false;
let image_updated: bool;
// only update the name if it has changed
if profile.new_name != profile.current_name {
debug!("Publishing new Scuttlebutt profile name");
let publish_name_res = sbot_client.publish_name(&profile.new_name).await;
if publish_name_res.is_err() {
return Flash::error(
Redirect::to(url),
format!("Failed to update name: {}", publish_name_res.unwrap_err()),
);
} else {
name_updated = true
}
}
// only update the description if it has changed
if profile.new_description != profile.current_description {
debug!("Publishing new Scuttlebutt profile description");
let publish_description_res = sbot_client
.publish_description(&profile.new_description)
.await;
if publish_description_res.is_err() {
return Flash::error(
Redirect::to(url),
format!(
"Failed to update description: {}",
publish_description_res.unwrap_err()
),
);
} else {
description_updated = true
}
}
// only update the image if a file was uploaded
if profile.image.name().is_some() {
match utils::write_blob_to_store(&mut profile.image).await {
Ok(blob_id) => {
// if the file was successfully added to the blobstore,
// publish an about image message with the blob id
let publish_image_res = sbot_client.publish_image(&blob_id).await;
if publish_image_res.is_err() {
return Flash::error(
Redirect::to(url),
format!(
"Failed to update image: {}",
publish_image_res.unwrap_err()
),
);
} else {
image_updated = true
}
}
Err(e) => {
// only update the name if it has changed
if profile.new_name != profile.current_name {
debug!("Publishing new Scuttlebutt profile name");
let publish_name_res = sbot_client.publish_name(&profile.new_name).await;
if publish_name_res.is_err() {
return Flash::error(
Redirect::to(url),
format!("Failed to add image to blobstore: {}", e),
)
format!("Failed to update name: {}", publish_name_res.unwrap_err()),
);
} else {
name_updated = true
}
}
} else {
image_updated = false
}
if name_updated || description_updated || image_updated {
return Flash::success(Redirect::to(url), "Profile updated");
} else {
// no updates were made but no errors were encountered either
return Flash::success(Redirect::to(url), "Profile info unchanged");
// only update the description if it has changed
if profile.new_description != profile.current_description {
debug!("Publishing new Scuttlebutt profile description");
let publish_description_res = sbot_client
.publish_description(&profile.new_description)
.await;
if publish_description_res.is_err() {
return Flash::error(
Redirect::to(url),
format!(
"Failed to update description: {}",
publish_description_res.unwrap_err()
),
);
} else {
description_updated = true
}
}
// only update the image if a file was uploaded
if profile.image.name().is_some() {
match utils::write_blob_to_store(&mut profile.image).await {
Ok(blob_id) => {
// if the file was successfully added to the blobstore,
// publish an about image message with the blob id
let publish_image_res = sbot_client.publish_image(&blob_id).await;
if publish_image_res.is_err() {
return Flash::error(
Redirect::to(url),
format!(
"Failed to update image: {}",
publish_image_res.unwrap_err()
),
);
} else {
image_updated = true
}
}
Err(e) => {
return Flash::error(
Redirect::to(url),
format!("Failed to add image to blobstore: {}", e),
)
}
}
} else {
image_updated = false
}
if name_updated || description_updated || image_updated {
return Flash::success(Redirect::to(url), "Profile updated");
} else {
// no updates were made but no errors were encountered either
return Flash::success(Redirect::to(url), "Profile info unchanged");
}
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
Err(e) => Flash::error(
Redirect::to(url),
format!("Failed to initialise sbot: {}", e),
),
}
} else {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, profile data cannot be updated. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
Ok(false) => {
return Flash::warning(
Redirect::to(url),
"The Sbot is currently inactive. As a result, profile data cannot be updated. Visit the Scuttlebutt settings menu to start the Sbot and then try again",
);
}
Err(e) => return Flash::error(Redirect::to(url), e),
}
}