mirror of
				https://github.com/nitnelave/lldap.git
				synced 2023-04-12 14:25:13 +00:00 
			
		
		
		
	app: Refactor API calls
This commit is contained in:
		
							parent
							
								
									e07efc9585
								
							
						
					
					
						commit
						9899c6f5aa
					
				
							
								
								
									
										105
									
								
								app/src/api.rs
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								app/src/api.rs
									
									
									
									
									
								
							@ -22,30 +22,41 @@ fn get_claims_from_jwt(jwt: &str) -> Result<JWTClaims> {
 | 
			
		||||
    Ok(token.claims().clone())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn create_handler<Resp, CallbackResult, F>(
 | 
			
		||||
    callback: Callback<Result<CallbackResult>>,
 | 
			
		||||
    handler: F,
 | 
			
		||||
) -> Callback<Response<Result<Resp>>>
 | 
			
		||||
where
 | 
			
		||||
    F: Fn(http::StatusCode, Resp) -> Result<CallbackResult> + 'static,
 | 
			
		||||
    Resp: std::fmt::Display,
 | 
			
		||||
    CallbackResult: 'static,
 | 
			
		||||
{
 | 
			
		||||
    Callback::once(move |response: Response<Result<Resp>>| {
 | 
			
		||||
        let (meta, maybe_data) = response.into_parts();
 | 
			
		||||
        let message = maybe_data
 | 
			
		||||
            .map_err(|e| anyhow!("Could not reach server: {}", e))
 | 
			
		||||
            .and_then(|data| handler(meta.status, data));
 | 
			
		||||
        callback.emit(message)
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl HostService {
 | 
			
		||||
    pub fn list_users(
 | 
			
		||||
        request: ListUsersRequest,
 | 
			
		||||
        callback: Callback<Result<Vec<User>>>,
 | 
			
		||||
    ) -> Result<FetchTask> {
 | 
			
		||||
        let url = "/api/users";
 | 
			
		||||
        let handler = move |response: Response<Result<String>>| {
 | 
			
		||||
            let (meta, maybe_data) = response.into_parts();
 | 
			
		||||
            let message = maybe_data
 | 
			
		||||
                .map_err(|e| anyhow!("Could not fetch: {}", e))
 | 
			
		||||
                .and_then(|data| {
 | 
			
		||||
                    if meta.status.is_success() {
 | 
			
		||||
                        serde_json::from_str(&data)
 | 
			
		||||
                            .map_err(|e| anyhow!("Could not parse response: {}", e))
 | 
			
		||||
                    } else {
 | 
			
		||||
                        Err(anyhow!("[{}]: {}", meta.status, data))
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            callback.emit(message)
 | 
			
		||||
        };
 | 
			
		||||
        let request = Request::post(url)
 | 
			
		||||
            .header("Content-Type", "application/json")
 | 
			
		||||
            .body(Json(&request))?;
 | 
			
		||||
        FetchService::fetch_with_options(request, get_default_options(), handler.into())
 | 
			
		||||
        let handler = create_handler(callback, |status, data: String| {
 | 
			
		||||
            if status.is_success() {
 | 
			
		||||
                serde_json::from_str(&data).map_err(|e| anyhow!("Could not parse response: {}", e))
 | 
			
		||||
            } else {
 | 
			
		||||
                Err(anyhow!("[{}]: {}", status, data))
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        FetchService::fetch_with_options(request, get_default_options(), handler)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn authenticate(
 | 
			
		||||
@ -53,53 +64,37 @@ impl HostService {
 | 
			
		||||
        callback: Callback<Result<String>>,
 | 
			
		||||
    ) -> Result<FetchTask> {
 | 
			
		||||
        let url = "/auth";
 | 
			
		||||
        let handler = move |response: Response<Result<String>>| {
 | 
			
		||||
            let (meta, maybe_data) = response.into_parts();
 | 
			
		||||
            let message = maybe_data
 | 
			
		||||
                .map_err(|e| anyhow!("Could not reach authentication server: {}", e))
 | 
			
		||||
                .and_then(|data| {
 | 
			
		||||
                    if meta.status.is_success() {
 | 
			
		||||
                        get_claims_from_jwt(&data)
 | 
			
		||||
                            .map_err(|e| anyhow!("Could not parse response: {}", e))
 | 
			
		||||
                            .and_then(|jwt_claims| {
 | 
			
		||||
                                set_cookie("user_id", &jwt_claims.user, &jwt_claims.exp)
 | 
			
		||||
                                    .map(|_| jwt_claims.user.clone())
 | 
			
		||||
                                    .map_err(|e| anyhow!("Error clearing cookie: {}", e))
 | 
			
		||||
                            })
 | 
			
		||||
                    } else if meta.status == 401 {
 | 
			
		||||
                        Err(anyhow!("Invalid username or password"))
 | 
			
		||||
                    } else {
 | 
			
		||||
                        Err(anyhow!(
 | 
			
		||||
                            "Could not authenticate: [{}]: {}",
 | 
			
		||||
                            meta.status,
 | 
			
		||||
                            data
 | 
			
		||||
                        ))
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            callback.emit(message)
 | 
			
		||||
        };
 | 
			
		||||
        let request = Request::post(url)
 | 
			
		||||
            .header("Content-Type", "application/json")
 | 
			
		||||
            .body(Json(&request))?;
 | 
			
		||||
        FetchService::fetch_with_options(request, get_default_options(), handler.into())
 | 
			
		||||
        let handler = create_handler(callback, |status, data: String| {
 | 
			
		||||
            if status.is_success() {
 | 
			
		||||
                get_claims_from_jwt(&data)
 | 
			
		||||
                    .map_err(|e| anyhow!("Could not parse response: {}", e))
 | 
			
		||||
                    .and_then(|jwt_claims| {
 | 
			
		||||
                        set_cookie("user_id", &jwt_claims.user, &jwt_claims.exp)
 | 
			
		||||
                            .map(|_| jwt_claims.user.clone())
 | 
			
		||||
                            .map_err(|e| anyhow!("Error clearing cookie: {}", e))
 | 
			
		||||
                    })
 | 
			
		||||
            } else if status == 401 {
 | 
			
		||||
                Err(anyhow!("Invalid username or password"))
 | 
			
		||||
            } else {
 | 
			
		||||
                Err(anyhow!("Could not authenticate: [{}]: {}", status, data))
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        FetchService::fetch_with_options(request, get_default_options(), handler)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn logout(callback: Callback<Result<()>>) -> Result<FetchTask> {
 | 
			
		||||
        let url = "/auth/logout";
 | 
			
		||||
        let handler = move |response: Response<Result<String>>| {
 | 
			
		||||
            let (meta, maybe_data) = response.into_parts();
 | 
			
		||||
            let message = maybe_data
 | 
			
		||||
                .map_err(|e| anyhow!("Could not reach authentication server: {}", e))
 | 
			
		||||
                .and_then(|data| {
 | 
			
		||||
                    if meta.status.is_success() {
 | 
			
		||||
                        Ok(())
 | 
			
		||||
                    } else {
 | 
			
		||||
                        Err(anyhow!("Could not logout: [{}]: {}", meta.status, data))
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            callback.emit(message)
 | 
			
		||||
        };
 | 
			
		||||
        let request = Request::post(url).body(yew::format::Nothing)?;
 | 
			
		||||
        FetchService::fetch_with_options(request, get_default_options(), handler.into())
 | 
			
		||||
        let handler = create_handler(callback, |status, data: String| {
 | 
			
		||||
            if status.is_success() {
 | 
			
		||||
                Ok(())
 | 
			
		||||
            } else {
 | 
			
		||||
                Err(anyhow!("Could not logout: [{}]: {}", status, data))
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        FetchService::fetch_with_options(request, get_default_options(), handler)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user