obscura-server 0.3.12

A server for relaying secure messages using the Signal Protocol
Documentation
use crate::api::AppState;
use crate::api::schemas::auth::{
    AuthSession as AuthSessionSchema, Login, Logout, Refresh, Registration,
};
use crate::api::middleware::AuthUser;
use crate::domain::auth_session::AuthSession;
use crate::error::{AppError, Result};
use axum::{Json, extract::State, http::StatusCode, response::IntoResponse};

pub async fn login(State(state): State<AppState>, Json(payload): Json<Login>) -> Result<impl IntoResponse> {
    let session = state.account_service.login(payload.username, payload.password).await?;
    let auth_response = map_session(session);
    Ok(Json(auth_response))
}

pub async fn register(
    State(state): State<AppState>,
    Json(payload): Json<Registration>,
) -> Result<impl IntoResponse> {
    payload.validate().map_err(AppError::BadRequest)?;

    let session = state
        .account_service
        .register(
            payload.username,
            payload.password,
            payload.identity_key.try_into().map_err(AppError::BadRequest)?,
            payload.registration_id,
            payload.signed_pre_key.try_into().map_err(AppError::BadRequest)?,
            payload.one_time_pre_keys
                .into_iter()
                .map(|k| k.try_into())
                .collect::<std::result::Result<Vec<_>, _>>()
                .map_err(AppError::BadRequest)?,
        )
        .await?;

    let auth_response = map_session(session);
    Ok((StatusCode::CREATED, Json(auth_response)))
}

pub async fn refresh(State(state): State<AppState>, Json(payload): Json<Refresh>) -> Result<impl IntoResponse> {
    let session = state.account_service.refresh(payload.refresh_token).await?;
    let auth_response = map_session(session);
    Ok(Json(auth_response))
}

pub async fn logout(
    auth_user: AuthUser,
    State(state): State<AppState>,
    Json(payload): Json<Logout>,
) -> Result<impl IntoResponse> {
    state.account_service.logout(auth_user.user_id, payload.refresh_token).await?;
    Ok(StatusCode::OK)
}

fn map_session(session: AuthSession) -> AuthSessionSchema {
    AuthSessionSchema {
        token: session.token,
        refresh_token: session.refresh_token,
        expires_at: session.expires_at,
    }
}