Skip to content

Commit 6c2ddf4

Browse files
committed
models/owner: Extract insert() fn
1 parent 59cfba9 commit 6c2ddf4

File tree

7 files changed

+34
-54
lines changed

7 files changed

+34
-54
lines changed

src/controllers/krate/owners.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use axum::Json;
1515
use axum_extra::json;
1616
use axum_extra::response::ErasedJson;
1717
use chrono::Utc;
18-
use crates_io_database::schema::crate_owners;
1918
use crates_io_github::GitHubClient;
2019
use diesel::prelude::*;
2120
use diesel_async::scoped_futures::ScopedFutureExt;
@@ -342,18 +341,12 @@ async fn add_team_owner(
342341

343342
// Teams are added as owners immediately, since the above call ensures
344343
// the user is a team member.
345-
let crate_owner = CrateOwner::builder()
344+
CrateOwner::builder()
346345
.crate_id(krate.id)
347346
.team_id(team.id)
348347
.created_by(req_user.id)
349-
.build();
350-
351-
diesel::insert_into(crate_owners::table)
352-
.values(&crate_owner)
353-
.on_conflict(crate_owners::table.primary_key())
354-
.do_update()
355-
.set(crate_owners::deleted.eq(false))
356-
.execute(conn)
348+
.build()
349+
.insert(conn)
357350
.await?;
358351

359352
Ok(NewOwnerInvite::Team(team))

src/models/crate_owner_invitation.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl};
55
use secrecy::SecretString;
66

77
use crate::models::CrateOwner;
8-
use crate::schema::{crate_owner_invitations, crate_owners, crates};
8+
use crate::schema::{crate_owner_invitations, crates};
99

1010
#[derive(Debug)]
1111
pub enum NewCrateOwnerInvitationOutcome {
@@ -101,13 +101,7 @@ impl CrateOwnerInvitation {
101101

102102
conn.transaction(|conn| {
103103
async move {
104-
diesel::insert_into(crate_owners::table)
105-
.values(CrateOwner::from_invite(&self))
106-
.on_conflict(crate_owners::table.primary_key())
107-
.do_update()
108-
.set(crate_owners::deleted.eq(false))
109-
.execute(conn)
110-
.await?;
104+
CrateOwner::from_invite(&self).insert(conn).await?;
111105

112106
diesel::delete(&self).execute(conn).await?;
113107

src/models/krate.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,15 +128,12 @@ impl NewCrate<'_> {
128128
.get_result(conn)
129129
.await?;
130130

131-
let owner = CrateOwner::builder()
131+
CrateOwner::builder()
132132
.crate_id(krate.id)
133133
.user_id(user_id)
134134
.created_by(user_id)
135-
.build();
136-
137-
diesel::insert_into(crate_owners::table)
138-
.values(&owner)
139-
.execute(conn)
135+
.build()
136+
.insert(conn)
140137
.await?;
141138

142139
Ok(krate)

src/models/owner.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use bon::Builder;
22
use diesel::pg::Pg;
33
use diesel::prelude::*;
4+
use diesel_async::{AsyncPgConnection, RunQueryDsl};
45

56
use self::crate_owner_builder::{SetOwnerId, SetOwnerKind};
67
use crate::models::{Crate, CrateOwnerInvitation, Team, User};
@@ -64,6 +65,19 @@ impl CrateOwner {
6465
.created_by(invite.invited_by_user_id)
6566
.build()
6667
}
68+
69+
/// Inserts the crate owner into the database, or removes the `deleted` flag
70+
/// if the record already exists.
71+
pub async fn insert(&self, conn: &mut AsyncPgConnection) -> QueryResult<()> {
72+
diesel::insert_into(crate_owners::table)
73+
.values(self)
74+
.on_conflict(crate_owners::table.primary_key())
75+
.do_update()
76+
.set(crate_owners::deleted.eq(false))
77+
.execute(conn)
78+
.await
79+
.map(|_| ())
80+
}
6781
}
6882

6983
pg_enum! {

src/tests/issues/issue2736.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::models::CrateOwner;
22
use crate::tests::builders::CrateBuilder;
33
use crate::tests::util::{RequestHelper, TestApp};
4-
use crates_io_database::schema::{crate_owners, users};
4+
use crates_io_database::schema::users;
55
use diesel::prelude::*;
66
use diesel_async::RunQueryDsl;
77
use http::StatusCode;
@@ -23,15 +23,12 @@ async fn test_issue_2736() -> anyhow::Result<()> {
2323
.expect_build(&mut conn)
2424
.await;
2525

26-
let owner = CrateOwner::builder()
26+
CrateOwner::builder()
2727
.crate_id(krate.id)
2828
.user_id(foo1.as_model().id)
2929
.created_by(someone_else.as_model().id)
30-
.build();
31-
32-
diesel::insert_into(crate_owners::table)
33-
.values(owner)
34-
.execute(&mut conn)
30+
.build()
31+
.insert(&mut conn)
3532
.await?;
3633

3734
// - `foo` deleted their GitHub account (but crates.io has no real knowledge of this)

src/tests/mod.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::models::{Crate, CrateOwner, NewCategory, NewTeam, NewUser, Team, User};
2-
use crate::schema::crate_owners;
32
use crate::tests::util::{RequestHelper, TestApp};
43
use crate::views::{
54
EncodableCategory, EncodableCategoryWithSubcategories, EncodableCrate, EncodableKeyword,
@@ -8,7 +7,7 @@ use crate::views::{
87

98
use crate::tests::util::github::next_gh_id;
109
use diesel::prelude::*;
11-
use diesel_async::{AsyncPgConnection, RunQueryDsl};
10+
use diesel_async::AsyncPgConnection;
1211

1312
mod account_lock;
1413
mod authentication;
@@ -114,21 +113,13 @@ pub async fn add_team_to_crate(
114113
u: &User,
115114
conn: &mut AsyncPgConnection,
116115
) -> QueryResult<()> {
117-
let crate_owner = CrateOwner::builder()
116+
CrateOwner::builder()
118117
.crate_id(krate.id)
119118
.team_id(t.id)
120119
.created_by(u.id)
121-
.build();
122-
123-
diesel::insert_into(crate_owners::table)
124-
.values(&crate_owner)
125-
.on_conflict(crate_owners::table.primary_key())
126-
.do_update()
127-
.set(crate_owners::deleted.eq(false))
128-
.execute(conn)
129-
.await?;
130-
131-
Ok(())
120+
.build()
121+
.insert(conn)
122+
.await
132123
}
133124

134125
fn new_category<'a>(category: &'a str, slug: &'a str, description: &'a str) -> NewCategory<'a> {

src/tests/routes/crates/owners/remove.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use crate::models::CrateOwner;
22
use crate::tests::builders::CrateBuilder;
33
use crate::tests::util::{RequestHelper, TestApp};
4-
use crates_io_database::schema::crate_owners;
54
use crates_io_github::{GitHubOrganization, GitHubTeam, GitHubTeamMembership, MockGitHubClient};
65
use http::StatusCode;
76
use insta::assert_snapshot;
@@ -83,8 +82,6 @@ async fn test_unknown_team() {
8382

8483
#[tokio::test(flavor = "multi_thread")]
8584
async fn test_remove_uppercase_user() {
86-
use diesel_async::RunQueryDsl;
87-
8885
let (app, _, cookie) = TestApp::full().with_user().await;
8986
let user2 = app.db_new_user("user2").await;
9087
let mut conn = app.db_conn().await;
@@ -93,15 +90,12 @@ async fn test_remove_uppercase_user() {
9390
.expect_build(&mut conn)
9491
.await;
9592

96-
let owner = CrateOwner::builder()
93+
CrateOwner::builder()
9794
.crate_id(krate.id)
9895
.user_id(user2.as_model().id)
9996
.created_by(cookie.as_model().id)
100-
.build();
101-
102-
diesel::insert_into(crate_owners::table)
103-
.values(owner)
104-
.execute(&mut conn)
97+
.build()
98+
.insert(&mut conn)
10599
.await
106100
.unwrap();
107101

0 commit comments

Comments
 (0)