summaryrefslogtreecommitdiff
path: root/src/invite/app.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/invite/app.rs')
-rw-r--r--src/invite/app.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/invite/app.rs b/src/invite/app.rs
index 998b4f1..6800d72 100644
--- a/src/invite/app.rs
+++ b/src/invite/app.rs
@@ -4,7 +4,7 @@ use sqlx::sqlite::SqlitePool;
use super::{repo::Provider as _, Id, Invite, Summary};
use crate::{
clock::DateTime,
- db::NotFound as _,
+ db::{Duplicate as _, NotFound as _},
event::repo::Provider as _,
login::{repo::Provider as _, Login, Password},
token::{repo::Provider as _, Secret},
@@ -68,7 +68,11 @@ impl<'a> Invites<'a> {
// catch it.
tx.invites().accept(&invite).await?;
let created = tx.sequence().next(accepted_at).await?;
- let login = tx.logins().create(name, &password_hash, &created).await?;
+ let login = tx
+ .logins()
+ .create(name, &password_hash, &created)
+ .await
+ .duplicate(|| AcceptError::DuplicateLogin(name.into()))?;
let secret = tx.tokens().issue(&login, accepted_at).await?;
tx.commit().await?;
@@ -99,6 +103,8 @@ pub enum Error {
pub enum AcceptError {
#[error("invite not found: {0}")]
NotFound(Id),
+ #[error("name in use: {0}")]
+ DuplicateLogin(String),
#[error(transparent)]
Database(#[from] sqlx::Error),
#[error(transparent)]