use axum::http::StatusCode;
use uuid::Uuid;
use crate::{models::ApiToken, AppState};
#[derive(Debug, Clone)]
pub struct TokenAuthResult {
pub user_id: Uuid,
pub org_id: Uuid,
pub token: ApiToken,
}
pub async fn authenticate_api_token(
state: &AppState,
token: &str,
) -> Result<Option<TokenAuthResult>, StatusCode> {
let pool = state.db.pool();
let api_token = ApiToken::verify_token(pool, token)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
let api_token = match api_token {
Some(t) => t,
None => return Ok(None),
};
if let Some(expires_at) = api_token.expires_at {
if expires_at < chrono::Utc::now() {
return Ok(None); }
}
let user_id = if let Some(uid) = api_token.user_id {
uid
} else {
use crate::models::Organization;
let org = Organization::find_by_id(pool, api_token.org_id)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
.ok_or(StatusCode::UNAUTHORIZED)?;
org.owner_id
};
Ok(Some(TokenAuthResult {
user_id,
org_id: api_token.org_id,
token: api_token,
}))
}