use md5; use mongodb::bson::doc; use mongodb::options::FindOneOptions; use rocket::response::Redirect; use urlencoding; use crate::database::*; use crate::util::result::{Error, Result}; use crate::util::variables::PUBLIC_URL; #[get("/<target>/avatar")] pub async fn req(target: Ref) -> Result<Redirect> { let doc = get_collection("accounts") .find_one( doc! { "_id": &target.id }, FindOneOptions::builder() .projection(doc! { "email": 1 }) .build(), ) .await .map_err(|_| Error::DatabaseError { operation: "find_one", with: "user", })? .ok_or_else(|| Error::UnknownUser)?; let email = doc .get_str("email") .map_err(|_| Error::DatabaseError { operation: "get_str(email)", with: "user", })? .to_lowercase(); let url = format!( "https://www.gravatar.com/avatar/{:x}?s=128&d={}", md5::compute(email), urlencoding::encode(&format!( "{}/users/{}/default_avatar", *PUBLIC_URL, &target.id )) ); dbg!(&url); Ok(Redirect::to(url)) }