use axum::{extract::State, http::StatusCode, response::IntoResponse, Json};
use crate::{
persistence::sql::signup_code::{SignupCodeId, SignupCodeRepository},
shared::{user_quota::UserQuota, HttpError, HttpResult},
};
use super::super::app_state::AppState;
async fn create_signup_code(state: &AppState, limits: &UserQuota) -> HttpResult<impl IntoResponse> {
let code = SignupCodeRepository::create(
&SignupCodeId::random(),
limits,
&mut state.sql_db.pool().into(),
)
.await?;
Ok((StatusCode::OK, code.id.0))
}
pub async fn generate_signup_token(State(state): State<AppState>) -> HttpResult<impl IntoResponse> {
create_signup_code(&state, &UserQuota::default()).await
}
pub async fn generate_signup_token_with_limits(
State(state): State<AppState>,
Json(config): Json<UserQuota>,
) -> HttpResult<impl IntoResponse> {
config
.validate()
.map_err(|e| HttpError::new_with_message(StatusCode::UNPROCESSABLE_ENTITY, e))?;
create_signup_code(&state, &config).await
}