Some checks failed
CI / Clippy (push) Successful in 2m35s
CI / Security Audit (push) Successful in 1m46s
CI / Tests (push) Successful in 3m5s
CI / Format (push) Successful in 6m53s
CI / Build & Push Image (push) Failing after 1m54s
CI / Changelog (push) Failing after 1m39s
Co-authored-by: Sharang Parnerkar <parnerkarsharang@gmail.com> Reviewed-on: #2
58 lines
1.3 KiB
Rust
58 lines
1.3 KiB
Rust
use std::{ops::Deref, sync::Arc};
|
|
|
|
use axum::extract::FromRequestParts;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct UserState(Arc<UserStateInner>);
|
|
|
|
impl Deref for UserState {
|
|
type Target = UserStateInner;
|
|
fn deref(&self) -> &Self::Target {
|
|
&self.0
|
|
}
|
|
}
|
|
|
|
impl From<UserStateInner> for UserState {
|
|
fn from(value: UserStateInner) -> Self {
|
|
Self(Arc::new(value))
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
|
pub struct UserStateInner {
|
|
/// Subject in Oauth
|
|
pub sub: String,
|
|
/// Access Token
|
|
pub access_token: String,
|
|
/// Refresh Token
|
|
pub refresh_token: String,
|
|
/// User
|
|
pub user: User,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
|
pub struct User {
|
|
/// Email
|
|
pub email: String,
|
|
/// Avatar Url
|
|
pub avatar_url: String,
|
|
}
|
|
|
|
impl<S> FromRequestParts<S> for UserState
|
|
where
|
|
S: std::marker::Sync + std::marker::Send,
|
|
{
|
|
type Rejection = super::Error;
|
|
async fn from_request_parts(
|
|
parts: &mut axum::http::request::Parts,
|
|
_: &S,
|
|
) -> Result<Self, super::Error> {
|
|
parts
|
|
.extensions
|
|
.get::<UserState>()
|
|
.cloned()
|
|
.ok_or(super::Error::StateError("Unable to get extension".into()))
|
|
}
|
|
}
|