diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2024-10-11 22:40:03 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2024-10-11 22:40:03 -0400 |
| commit | 812f1cafe3f8a68bf45b677fade7417c30d92eac (patch) | |
| tree | e2633472a31bd86bf08bcc16ddb4296df89064b4 /src/invite/repo.rs | |
| parent | a0abed5ea08b2fc5b9ac4abdade1199f62cd5da7 (diff) | |
Create APIs for inviting users.
Diffstat (limited to 'src/invite/repo.rs')
| -rw-r--r-- | src/invite/repo.rs | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/invite/repo.rs b/src/invite/repo.rs new file mode 100644 index 0000000..2ab993f --- /dev/null +++ b/src/invite/repo.rs @@ -0,0 +1,121 @@ +use sqlx::{sqlite::Sqlite, SqliteConnection, Transaction}; + +use super::{Id, Invite, Summary}; +use crate::{ + clock::DateTime, + login::{self, Login}, +}; + +pub trait Provider { + fn invites(&mut self) -> Invites; +} + +impl<'c> Provider for Transaction<'c, Sqlite> { + fn invites(&mut self) -> Invites { + Invites(self) + } +} + +pub struct Invites<'t>(&'t mut SqliteConnection); + +impl<'c> Invites<'c> { + pub async fn create( + &mut self, + issuer: &Login, + issued_at: &DateTime, + ) -> Result<Invite, sqlx::Error> { + let id = Id::generate(); + let invite = sqlx::query_as!( + Invite, + r#" + insert into invite (id, issuer, issued_at) + values ($1, $2, $3) + returning + id as "id: Id", + issuer as "issuer: login::Id", + issued_at as "issued_at: DateTime" + "#, + id, + issuer.id, + issued_at + ) + .fetch_one(&mut *self.0) + .await?; + + Ok(invite) + } + + pub async fn by_id(&mut self, invite: &Id) -> Result<Invite, sqlx::Error> { + let invite = sqlx::query_as!( + Invite, + r#" + select + id as "id: Id", + issuer as "issuer: login::Id", + issued_at as "issued_at: DateTime" + from invite + where id = $1 + "#, + invite, + ) + .fetch_one(&mut *self.0) + .await?; + + Ok(invite) + } + + pub async fn summary(&mut self, invite: &Id) -> Result<Summary, sqlx::Error> { + let invite = sqlx::query!( + r#" + select + issuer.id as "issuer_id: login::Id", + issuer.name as "issuer_name", + invite.issued_at as "invite_issued_at: DateTime" + from invite + join login as issuer on (invite.issuer = issuer.id) + where invite.id = $1 + "#, + invite, + ) + .map(|row| Summary { + issuer: Login { + id: row.issuer_id, + name: row.issuer_name, + }, + issued_at: row.invite_issued_at, + }) + .fetch_one(&mut *self.0) + .await?; + + Ok(invite) + } + + pub async fn accept(&mut self, invite: &Invite) -> Result<(), sqlx::Error> { + sqlx::query_scalar!( + r#" + delete from invite + where id = $1 + returning 1 as "deleted: bool" + "#, + invite.id, + ) + .fetch_one(&mut *self.0) + .await?; + + Ok(()) + } + + pub async fn expire(&mut self, expire_at: &DateTime) -> Result<(), sqlx::Error> { + sqlx::query!( + r#" + delete from invite + where issued_at < $1 + "#, + expire_at, + ) + .execute(&mut *self.0) + .await?; + + Ok(()) + } +} |
