use crate::prelude2::*;
use futures_util::stream::StreamExt;
use mongodb::bson::doc;
pub async fn profile_picture(
resource_id: actix_web::web::Path<String>,
app_state: web::Data<AppContext>,
) -> impl Responder {
let filter = doc! {"resource_id": resource_id.into_inner(), "upload_type": "profile_picture"};
get_file(app_state.mongo(), filter, 0).await
}
pub async fn avator(
user_id: actix_web::web::Path<String>,
app_state: web::Data<AppContext>,
) -> impl Responder {
let filter = doc! {"user_id": user_id.into_inner(), "upload_type": "profile_picture"};
get_file(app_state.mongo(), filter, 0).await
}
pub async fn get_file(
mongo: &crate::core::mongo::MongoClient,
filter: mongodb::bson::Document,
skip: usize,
) -> impl Responder {
match mongo
.get_file_with_opts(
&crate::sitepages::upload0::GRID_FS_DATABASE_NAME,
doc! {"created_at": -1},
filter,
skip,
)
.await
{
Ok((mime_type, mut _stream)) => {
let stream = async_stream::stream! {
while let Some(chunk) = _stream.next().await {
yield Ok::<_, actix_web::Error>(web::Bytes::from(chunk));
}
};
let mut response = HttpResponse::Ok();
response.append_header((actix_web::http::header::CONTENT_DISPOSITION, "inline"));
match mime_type {
Some(mime_type) => {
response.content_type(mime_type);
}
None => {
response.content_type("image/jpeg");
}
}
response.streaming(stream)
}
Err(_) => {
let _byte_content = std::fs::read("./RichMedias/images/30916342.jpg").unwrap();
let stream = futures_util::stream::iter(vec![_byte_content])
.map(|chunk| Ok::<_, actix_web::Error>(web::Bytes::from(chunk)))
.boxed();
let response = HttpResponse::Ok()
.content_type("image/jpeg")
.streaming(stream);
response
}
}
}