webdav_server/api/auth/
register.rs1use crate::api::Error::BadRequest;
2use crate::app::State as AppState;
3use crate::logger::Module;
4use crate::model::{error::Error as ModelErr, user::User};
5use crate::{Error as AppErr, Result, info};
6use axum::{Json, extract::State};
7use hyper::StatusCode;
8use serde::Deserialize;
9use sqlx::Error as SqlErr;
10
11#[derive(Deserialize)]
13pub struct RegisterRequest {
14 pub identity_hash: String,
19 pub auth_verifier: String,
25}
26
27pub async fn register(
34 State(state): State<AppState>,
35 Json(register_request): Json<RegisterRequest>,
36) -> Result<StatusCode> {
37 let Ok(identity_hash) = hex::decode(®ister_request.identity_hash) else {
38 Err(BadRequest("identity_hash failed to decode".into()))?
39 };
40
41 let result =
42 User::create(&state.db, &identity_hash, register_request.auth_verifier)
43 .await;
44
45 match result {
46 Ok(()) => {
47 info!(
48 Module::Api,
49 "New user reggistered with id: {:?}",
50 hex::encode(identity_hash)
51 );
52 Ok(StatusCode::CREATED)
53 }
54 Err(ModelErr::Database(SqlErr::Database(err)))
55 if err.is_unique_violation() =>
56 {
57 Err(AppErr::Conflict("User already exists".into()))
58 }
59 Err(e) => Err(e.into()),
60 }
61}