use std::sync::Arc;
use axum::extract::{Path, State};
use axum::response::Response;
use super::responses::png_image;
use crate::cache::image::manager::Error;
use crate::common::AppData;
use crate::ui::proxy::map_error_to_image;
use crate::web::api::v1::extractors::bearer_token::Extract;
#[allow(clippy::unused_async)]
pub async fn get_proxy_image_handler(
State(app_data): State<Arc<AppData>>,
Extract(maybe_bearer_token): Extract,
Path(url): Path<String>,
) -> Response {
if maybe_bearer_token.is_none() {
return png_image(map_error_to_image(&Error::Unauthenticated));
}
let Ok(user_id) = app_data.auth.get_user_id_from_bearer_token(&maybe_bearer_token).await else { return png_image(map_error_to_image(&Error::Unauthenticated)) };
let image_url = urlencoding::decode(&url).unwrap_or_default().into_owned();
match app_data.proxy_service.get_image_by_url(&image_url, &user_id).await {
Ok(image_bytes) => {
png_image(image_bytes)
}
Err(e) => {
png_image(map_error_to_image(&e))
}
}
}