Skip to content

Commit

Permalink
Merge #489: #446 optional user id extractor
Browse files Browse the repository at this point in the history
3607dc9 refactor: [#446] fixed text formatting (Mario)
4208f3a refactor: [#446] refactored handlers with new extractor (Mario)
8f7b8a6 feat: [#446] new optional user id extractor (Mario)

Pull request description:

  Resolves #446.

ACKs for top commit:
  josecelano:
    ACK 3607dc9

Tree-SHA512: 26dc989751076f094344725e6f6cd8efa51164d0a4160aa0e492e4ec3bc27b71c62dbf81db7ff9dc256f058dfc1fc4580b61f0e332da0f7d9d0041486c39cd4e
  • Loading branch information
josecelano committed Feb 22, 2024
2 parents 1c16300 + 3607dc9 commit 88e127e
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 14 deletions.
17 changes: 3 additions & 14 deletions src/web/api/server/v1/contexts/torrent/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ use crate::models::torrent_tag::TagId;
use crate::services::torrent::{AddTorrentRequest, ListingRequest};
use crate::services::torrent_file::generate_random_torrent;
use crate::utils::parse_torrent;
use crate::web::api::server::v1::auth::get_optional_logged_in_user;
use crate::web::api::server::v1::extractors::bearer_token::Extract;
use crate::web::api::server::v1::extractors::optional_user_id::ExtractOptionalLoggedInUser;
use crate::web::api::server::v1::extractors::user_id::ExtractLoggedInUser;
use crate::web::api::server::v1::responses::OkResponseData;
use crate::web::api::server::v1::routes::API_VERSION_URL_PREFIX;
Expand Down Expand Up @@ -69,7 +68,7 @@ impl InfoHashParam {
#[allow(clippy::unused_async)]
pub async fn download_torrent_handler(
State(app_data): State<Arc<AppData>>,
Extract(maybe_bearer_token): Extract,
ExtractOptionalLoggedInUser(opt_user_id): ExtractOptionalLoggedInUser,
Path(info_hash): Path<InfoHashParam>,
) -> Response {
let Ok(info_hash) = InfoHash::from_str(&info_hash.lowercase()) else {
Expand All @@ -82,11 +81,6 @@ pub async fn download_torrent_handler(
debug!("Redirecting to URL with canonical info-hash");
redirect_response
} else {
let opt_user_id = match get_optional_logged_in_user(maybe_bearer_token, app_data.clone()).await {
Ok(opt_user_id) => opt_user_id,
Err(error) => return error.into_response(),
};

let torrent = match app_data.torrent_service.get_torrent(&info_hash, opt_user_id).await {
Ok(torrent) => torrent,
Err(error) => return error.into_response(),
Expand Down Expand Up @@ -156,7 +150,7 @@ pub async fn get_torrents_handler(State(app_data): State<Arc<AppData>>, Query(cr
#[allow(clippy::unused_async)]
pub async fn get_torrent_info_handler(
State(app_data): State<Arc<AppData>>,
Extract(maybe_bearer_token): Extract,
ExtractOptionalLoggedInUser(opt_user_id): ExtractOptionalLoggedInUser,
Path(info_hash): Path<InfoHashParam>,
) -> Response {
let Ok(info_hash) = InfoHash::from_str(&info_hash.lowercase()) else {
Expand All @@ -166,11 +160,6 @@ pub async fn get_torrent_info_handler(
if let Some(redirect_response) = redirect_to_details_url_using_canonical_info_hash_if_needed(&app_data, &info_hash).await {
redirect_response
} else {
let opt_user_id = match get_optional_logged_in_user(maybe_bearer_token, app_data.clone()).await {
Ok(opt_user_id) => opt_user_id,
Err(error) => return error.into_response(),
};

match app_data.torrent_service.get_torrent_info(&info_hash, opt_user_id).await {
Ok(torrent_response) => Json(OkResponseData { data: torrent_response }).into_response(),
Err(error) => error.into_response(),
Expand Down
1 change: 1 addition & 0 deletions src/web/api/server/v1/extractors/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod bearer_token;
pub mod optional_user_id;
pub mod user_id;
41 changes: 41 additions & 0 deletions src/web/api/server/v1/extractors/optional_user_id.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
use std::sync::Arc;

use async_trait::async_trait;
use axum::extract::{FromRef, FromRequestParts};
use axum::http::request::Parts;
use axum::response::Response;

use crate::common::AppData;
use crate::models::user::UserId;
use crate::web::api::server::v1::extractors::bearer_token;

pub struct ExtractOptionalLoggedInUser(pub Option<UserId>);

#[async_trait]
impl<S> FromRequestParts<S> for ExtractOptionalLoggedInUser
where
Arc<AppData>: FromRef<S>,
S: Send + Sync,
{
type Rejection = Response;

async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
/* let maybe_bearer_token = match bearer_token::Extract::from_request_parts(parts, state).await {
Ok(maybe_bearer_token) => maybe_bearer_token.0,
Err(_) => return Err(ServiceError::TokenNotFound.into_response()),
}; */

let bearer_token = match bearer_token::Extract::from_request_parts(parts, state).await {
Ok(bearer_token) => bearer_token.0,
Err(_) => None,
};

//Extracts the app state
let app_data = Arc::from_ref(state);

match app_data.auth.get_user_id_from_bearer_token(&bearer_token).await {
Ok(user_id) => Ok(ExtractOptionalLoggedInUser(Some(user_id))),
Err(_) => Ok(ExtractOptionalLoggedInUser(None)),
}
}
}

0 comments on commit 88e127e

Please sign in to comment.