summaryrefslogtreecommitdiff
path: root/src/setup
diff options
context:
space:
mode:
Diffstat (limited to 'src/setup')
-rw-r--r--src/setup/app.rs9
-rw-r--r--src/setup/routes/mod.rs9
-rw-r--r--src/setup/routes/post.rs (renamed from src/setup/routes.rs)45
3 files changed, 36 insertions, 27 deletions
diff --git a/src/setup/app.rs b/src/setup/app.rs
index 24e0010..030b5f6 100644
--- a/src/setup/app.rs
+++ b/src/setup/app.rs
@@ -4,7 +4,8 @@ use super::repo::Provider as _;
use crate::{
clock::DateTime,
event::{repo::Provider as _, Broadcaster, Event},
- login::{repo::Provider as _, Password},
+ login::{repo::Provider as _, Login, Password},
+ name::Name,
token::{repo::Provider as _, Secret},
};
@@ -20,10 +21,10 @@ impl<'a> Setup<'a> {
pub async fn initial(
&self,
- name: &str,
+ name: &Name,
password: &Password,
created_at: &DateTime,
- ) -> Result<Secret, Error> {
+ ) -> Result<(Login, Secret), Error> {
let password_hash = password.hash()?;
let mut tx = self.db.begin().await?;
@@ -39,7 +40,7 @@ impl<'a> Setup<'a> {
self.events
.broadcast(login.events().map(Event::from).collect::<Vec<_>>());
- Ok(secret)
+ Ok((login.as_created(), secret))
}
pub async fn completed(&self) -> Result<bool, sqlx::Error> {
diff --git a/src/setup/routes/mod.rs b/src/setup/routes/mod.rs
new file mode 100644
index 0000000..e1e1711
--- /dev/null
+++ b/src/setup/routes/mod.rs
@@ -0,0 +1,9 @@
+use axum::{routing::post, Router};
+
+use crate::app::App;
+
+mod post;
+
+pub fn router() -> Router<App> {
+ Router::new().route("/api/setup", post(post::handler))
+}
diff --git a/src/setup/routes.rs b/src/setup/routes/post.rs
index ff41734..f7b256e 100644
--- a/src/setup/routes.rs
+++ b/src/setup/routes/post.rs
@@ -2,44 +2,43 @@ use axum::{
extract::{Json, State},
http::StatusCode,
response::{IntoResponse, Response},
- routing::post,
- Router,
};
-use super::app;
use crate::{
- app::App, clock::RequestedAt, error::Internal, login::Password, token::extract::IdentityToken,
+ app::App,
+ clock::RequestedAt,
+ error::Internal,
+ login::{Login, Password},
+ name::Name,
+ setup::app,
+ token::extract::IdentityCookie,
};
-pub fn router() -> Router<App> {
- Router::new().route("/api/setup", post(on_setup))
-}
-
-#[derive(serde::Deserialize)]
-struct SetupRequest {
- name: String,
- password: Password,
-}
-
-async fn on_setup(
+pub async fn handler(
State(app): State<App>,
RequestedAt(setup_at): RequestedAt,
- identity: IdentityToken,
- Json(request): Json<SetupRequest>,
-) -> Result<(IdentityToken, StatusCode), SetupError> {
- let secret = app
+ identity: IdentityCookie,
+ Json(request): Json<Request>,
+) -> Result<(IdentityCookie, Json<Login>), Error> {
+ let (login, secret) = app
.setup()
.initial(&request.name, &request.password, &setup_at)
.await
- .map_err(SetupError)?;
+ .map_err(Error)?;
let identity = identity.set(secret);
- Ok((identity, StatusCode::NO_CONTENT))
+ Ok((identity, Json(login)))
+}
+
+#[derive(serde::Deserialize)]
+pub struct Request {
+ pub name: Name,
+ pub password: Password,
}
#[derive(Debug)]
-struct SetupError(app::Error);
+pub struct Error(pub app::Error);
-impl IntoResponse for SetupError {
+impl IntoResponse for Error {
fn into_response(self) -> Response {
let Self(error) = self;
match error {