Skip to content

Commit c9d3f61

Browse files
authored
Merge pull request #10550 from Turbo87/new-invite-struct
Extract `NewCrateOwnerInvitation` struct
2 parents be3112d + b0057f3 commit c9d3f61

File tree

3 files changed

+35
-31
lines changed

3 files changed

+35
-31
lines changed

src/models.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
pub use self::action::{NewVersionOwnerAction, VersionAction, VersionOwnerAction};
22
pub use self::category::{Category, CrateCategory, NewCategory};
3-
pub use self::crate_owner_invitation::{CrateOwnerInvitation, NewCrateOwnerInvitationOutcome};
3+
pub use self::crate_owner_invitation::{
4+
CrateOwnerInvitation, NewCrateOwnerInvitation, NewCrateOwnerInvitationOutcome,
5+
};
46
pub use self::default_versions::{update_default_version, verify_default_version};
57
pub use self::deleted_crate::NewDeletedCrate;
68
pub use self::dependency::{Dependency, DependencyKind, ReverseDependency};

src/models/crate_owner_invitation.rs

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,20 @@ pub enum NewCrateOwnerInvitationOutcome {
1616
InviteCreated { plaintext_token: SecretString },
1717
}
1818

19-
/// The model representing a row in the `crate_owner_invitations` database table.
20-
#[derive(Clone, Debug, Identifiable, Queryable)]
21-
#[diesel(primary_key(invited_user_id, crate_id))]
22-
pub struct CrateOwnerInvitation {
19+
#[derive(Clone, Debug, Insertable)]
20+
#[diesel(table_name = crate_owner_invitations, check_for_backend(diesel::pg::Pg))]
21+
pub struct NewCrateOwnerInvitation {
2322
pub invited_user_id: i32,
2423
pub invited_by_user_id: i32,
2524
pub crate_id: i32,
26-
pub created_at: NaiveDateTime,
27-
#[diesel(deserialize_as = String)]
28-
pub token: SecretString,
2925
}
3026

31-
impl CrateOwnerInvitation {
27+
impl NewCrateOwnerInvitation {
3228
pub async fn create(
33-
invited_user_id: i32,
34-
invited_by_user_id: i32,
35-
crate_id: i32,
29+
&self,
3630
conn: &mut AsyncPgConnection,
3731
config: &config::Server,
3832
) -> QueryResult<NewCrateOwnerInvitationOutcome> {
39-
#[derive(Insertable, Clone, Copy, Debug)]
40-
#[diesel(table_name = crate_owner_invitations, check_for_backend(diesel::pg::Pg))]
41-
struct NewRecord {
42-
invited_user_id: i32,
43-
invited_by_user_id: i32,
44-
crate_id: i32,
45-
}
46-
4733
// Before actually creating the invite, check if an expired invitation already exists
4834
// and delete it from the database. This allows obtaining a new invite if the old one
4935
// expired, instead of returning "already exists".
@@ -52,7 +38,7 @@ impl CrateOwnerInvitation {
5238
// This does a SELECT FOR UPDATE + DELETE instead of a DELETE with a WHERE clause to
5339
// use the model's `is_expired` method, centralizing our expiration checking logic.
5440
let existing: Option<CrateOwnerInvitation> = crate_owner_invitations::table
55-
.find((invited_user_id, crate_id))
41+
.find((self.invited_user_id, self.crate_id))
5642
.for_update()
5743
.first(conn)
5844
.await
@@ -70,11 +56,7 @@ impl CrateOwnerInvitation {
7056
.await?;
7157

7258
let res: Option<CrateOwnerInvitation> = diesel::insert_into(crate_owner_invitations::table)
73-
.values(&NewRecord {
74-
invited_user_id,
75-
invited_by_user_id,
76-
crate_id,
77-
})
59+
.values(self)
7860
// The ON CONFLICT DO NOTHING clause results in not creating the invite if another one
7961
// already exists. This does not cause problems with expired invitation as those are
8062
// deleted before doing this INSERT.
@@ -90,7 +72,21 @@ impl CrateOwnerInvitation {
9072
None => NewCrateOwnerInvitationOutcome::AlreadyExists,
9173
})
9274
}
75+
}
9376

77+
/// The model representing a row in the `crate_owner_invitations` database table.
78+
#[derive(Clone, Debug, Identifiable, Queryable)]
79+
#[diesel(primary_key(invited_user_id, crate_id))]
80+
pub struct CrateOwnerInvitation {
81+
pub invited_user_id: i32,
82+
pub invited_by_user_id: i32,
83+
pub crate_id: i32,
84+
pub created_at: NaiveDateTime,
85+
#[diesel(deserialize_as = String)]
86+
pub token: SecretString,
87+
}
88+
89+
impl CrateOwnerInvitation {
9490
pub async fn find_by_id(
9591
user_id: i32,
9692
crate_id: i32,

src/models/krate.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::controllers::helpers::pagination::*;
1313
use crate::models::helpers::with_count::*;
1414
use crate::models::version::TopVersions;
1515
use crate::models::{
16-
CrateOwner, CrateOwnerInvitation, NewCrateOwnerInvitationOutcome, Owner, OwnerKind,
16+
CrateOwner, NewCrateOwnerInvitation, NewCrateOwnerInvitationOutcome, Owner, OwnerKind,
1717
ReverseDependency, User, Version,
1818
};
1919
use crate::schema::*;
@@ -401,10 +401,16 @@ impl Crate {
401401
match owner {
402402
// Users are invited and must accept before being added
403403
Owner::User(user) => {
404-
let creation_ret =
405-
CrateOwnerInvitation::create(user.id, req_user.id, self.id, conn, &app.config)
406-
.await
407-
.map_err(BoxedAppError::from)?;
404+
let invite = NewCrateOwnerInvitation {
405+
invited_user_id: user.id,
406+
invited_by_user_id: req_user.id,
407+
crate_id: self.id,
408+
};
409+
410+
let creation_ret = invite
411+
.create(conn, &app.config)
412+
.await
413+
.map_err(BoxedAppError::from)?;
408414

409415
match creation_ret {
410416
NewCrateOwnerInvitationOutcome::InviteCreated { plaintext_token } => {

0 commit comments

Comments
 (0)