Skip to content
Clone
0ecef20
33 lines 1.3 KB Rust
use axum::extract::{Extension, State};
use axum_extra::extract::cookie::CookieJar;
use crate::error::AuthError;
use crate::features::AuthService;
use crate::features::register::types::{RegisterCmd, RegisterResp};
use export::data::{AppRequest, AppRequestData, AppResponseData};
use super::cookies;
#[utoipa::path(
post,
path = "/auth/register",
tag = "auth",
request_body = AppRequestData<RegisterCmd>,
responses(
(status = 200, description = "Account created (possibly pending email verification).", body = AppResponseData<RegisterResp>),
(status = 400, description = "Validation / PoW failure.", body = super::openapi::ErrorBody),
(status = 409, description = "Email or username already taken.", body = super::openapi::ErrorBody),
(status = 429, description = "Rate limited.", body = super::openapi::ErrorBody),
),
)]
pub(crate) async fn handler(
State(svc): State<AuthService>,
jar: CookieJar,
cid: Option<Extension<rate_limit::ClientId>>,
cmd: AppRequest<RegisterCmd>,
) -> Result<(CookieJar, AppResponseData<RegisterResp>), AuthError> {
let resp = svc.register(cmd.into_inner(), cid.map(|c| c.0 .0)).await?;
let cookie = cookies::temp_key_to_cookie(&svc.config, &resp.temp_key);
let jar = jar.add(cookie);
Ok((jar, AppResponseData::ok(resp)))
}