summaryrefslogtreecommitdiff
path: root/src/invite
diff options
context:
space:
mode:
Diffstat (limited to 'src/invite')
-rw-r--r--src/invite/app.rs48
-rw-r--r--src/invite/handlers/accept/test.rs4
-rw-r--r--src/invite/handlers/issue/mod.rs2
-rw-r--r--src/invite/handlers/issue/test.rs2
4 files changed, 45 insertions, 11 deletions
diff --git a/src/invite/app.rs b/src/invite/app.rs
index 6e235b2..6684d03 100644
--- a/src/invite/app.rs
+++ b/src/invite/app.rs
@@ -5,13 +5,15 @@ use super::{Id, Invite, Summary, repo::Provider as _};
use crate::{
clock::DateTime,
db::{Duplicate as _, NotFound as _},
- event::Broadcaster,
- name::Name,
+ event::{Broadcaster, repo::Provider as _},
+ login::Login,
+ name::{self, Name},
password::Password,
token::{Secret, Token, repo::Provider as _},
user::{
- User,
+ self,
create::{self, Create},
+ repo::{LoadError, Provider as _},
},
};
@@ -25,9 +27,19 @@ impl<'a> Invites<'a> {
Self { db, events }
}
- pub async fn issue(&self, issuer: &User, issued_at: &DateTime) -> Result<Invite, sqlx::Error> {
+ pub async fn issue(&self, issuer: &Login, issued_at: &DateTime) -> Result<Invite, Error> {
+ let issuer_not_found = || Error::IssuerNotFound(issuer.id.clone().into());
+ let issuer_deleted = || Error::IssuerDeleted(issuer.id.clone().into());
+
let mut tx = self.db.begin().await?;
- let invite = tx.invites().create(issuer, issued_at).await?;
+ let issuer = tx
+ .users()
+ .by_login(issuer)
+ .await
+ .not_found(issuer_not_found)?;
+ let now = tx.sequence().current().await?;
+ let issuer = issuer.as_of(now).ok_or_else(issuer_deleted)?;
+ let invite = tx.invites().create(&issuer, issued_at).await?;
tx.commit().await?;
Ok(invite)
@@ -71,8 +83,8 @@ impl<'a> Invites<'a> {
.store(&mut tx)
.await
.duplicate(|| AcceptError::DuplicateLogin(name.clone()))?;
- let user = stored.user().as_created();
- let (token, secret) = Token::generate(&user, accepted_at);
+ let login = stored.login();
+ let (token, secret) = Token::generate(login, accepted_at);
tx.tokens().create(&token, &secret).await?;
tx.commit().await?;
@@ -94,6 +106,28 @@ impl<'a> Invites<'a> {
}
#[derive(Debug, thiserror::Error)]
+pub enum Error {
+ #[error("issuing user {0} not found")]
+ IssuerNotFound(user::Id),
+ #[error("issuing user {0} deleted")]
+ IssuerDeleted(user::Id),
+ #[error(transparent)]
+ Database(#[from] sqlx::Error),
+ #[error(transparent)]
+ Name(#[from] name::Error),
+}
+
+impl From<user::repo::LoadError> for Error {
+ fn from(error: LoadError) -> Self {
+ use user::repo::LoadError;
+ match error {
+ LoadError::Database(error) => error.into(),
+ LoadError::Name(error) => error.into(),
+ }
+ }
+}
+
+#[derive(Debug, thiserror::Error)]
pub enum AcceptError {
#[error("invite not found: {0}")]
NotFound(Id),
diff --git a/src/invite/handlers/accept/test.rs b/src/invite/handlers/accept/test.rs
index 4e4a09d..283ec76 100644
--- a/src/invite/handlers/accept/test.rs
+++ b/src/invite/handlers/accept/test.rs
@@ -44,8 +44,8 @@ async fn valid_invite() {
// Verify that the given credentials can log in
let secret = app
- .tokens()
- .login(&name, &password, &fixtures::now())
+ .logins()
+ .with_password(&name, &password, &fixtures::now())
.await
.expect("credentials given on signup are valid");
verify::token::valid_for_name(&app, &secret, &name).await;
diff --git a/src/invite/handlers/issue/mod.rs b/src/invite/handlers/issue/mod.rs
index 6085f7a..4ac74cc 100644
--- a/src/invite/handlers/issue/mod.rs
+++ b/src/invite/handlers/issue/mod.rs
@@ -13,7 +13,7 @@ pub async fn handler(
identity: Identity,
_: Json<Request>,
) -> Result<Json<Invite>, Internal> {
- let invite = app.invites().issue(&identity.user, &issued_at).await?;
+ let invite = app.invites().issue(&identity.login, &issued_at).await?;
Ok(Json(invite))
}
diff --git a/src/invite/handlers/issue/test.rs b/src/invite/handlers/issue/test.rs
index 2bf5400..4421705 100644
--- a/src/invite/handlers/issue/test.rs
+++ b/src/invite/handlers/issue/test.rs
@@ -22,6 +22,6 @@ async fn create_invite() {
.expect("creating an invite always succeeds");
// Verify the response
- assert_eq!(issuer.user.id, invite.issuer);
+ assert_eq!(issuer.login.id, invite.issuer);
assert_eq!(&*issued_at, &invite.issued_at);
}