Skip to content

Commit 59cfba9

Browse files
committed
models/owner: Derive bon::Builder for CrateOwner struct
1 parent 10241e3 commit 59cfba9

File tree

6 files changed

+64
-47
lines changed

6 files changed

+64
-47
lines changed

src/controllers/krate/owners.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::controllers::krate::CratePath;
44
use crate::models::krate::OwnerRemoveError;
55
use crate::models::{
66
krate::NewOwnerInvite, token::EndpointScope, CrateOwner, NewCrateOwnerInvitation,
7-
NewCrateOwnerInvitationOutcome, OwnerKind,
7+
NewCrateOwnerInvitationOutcome,
88
};
99
use crate::models::{Crate, Owner, Rights, Team, User};
1010
use crate::util::errors::{bad_request, crate_not_found, custom, AppResult, BoxedAppError};
@@ -342,14 +342,14 @@ async fn add_team_owner(
342342

343343
// Teams are added as owners immediately, since the above call ensures
344344
// the user is a team member.
345+
let crate_owner = CrateOwner::builder()
346+
.crate_id(krate.id)
347+
.team_id(team.id)
348+
.created_by(req_user.id)
349+
.build();
350+
345351
diesel::insert_into(crate_owners::table)
346-
.values(&CrateOwner {
347-
crate_id: krate.id,
348-
owner_id: team.id,
349-
created_by: req_user.id,
350-
owner_kind: OwnerKind::Team,
351-
email_notifications: true,
352-
})
352+
.values(&crate_owner)
353353
.on_conflict(crate_owners::table.primary_key())
354354
.do_update()
355355
.set(crate_owners::deleted.eq(false))

src/models/krate.rs

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

131-
let owner = CrateOwner {
132-
crate_id: krate.id,
133-
owner_id: user_id,
134-
created_by: user_id,
135-
owner_kind: OwnerKind::User,
136-
email_notifications: true,
137-
};
131+
let owner = CrateOwner::builder()
132+
.crate_id(krate.id)
133+
.user_id(user_id)
134+
.created_by(user_id)
135+
.build();
138136

139137
diesel::insert_into(crate_owners::table)
140138
.values(&owner)

src/models/owner.rs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
use bon::Builder;
12
use diesel::pg::Pg;
23
use diesel::prelude::*;
34

5+
use self::crate_owner_builder::{SetOwnerId, SetOwnerKind};
46
use crate::models::{Crate, CrateOwnerInvitation, Team, User};
57
use crate::schema::crate_owners;
68
use crates_io_diesel_helpers::pg_enum;
79

8-
#[derive(Insertable, Associations, Identifiable, Debug, Clone, Copy)]
10+
#[derive(Insertable, Associations, Identifiable, Debug, Clone, Copy, Builder)]
911
#[diesel(
1012
table_name = crate_owners,
1113
check_for_backend(diesel::pg::Pg),
@@ -16,12 +18,33 @@ use crates_io_diesel_helpers::pg_enum;
1618
)]
1719
pub struct CrateOwner {
1820
pub crate_id: i32,
21+
#[builder(setters(vis = "pub(self)"))]
1922
pub owner_id: i32,
2023
pub created_by: i32,
24+
#[builder(setters(vis = "pub(self)"))]
2125
pub owner_kind: OwnerKind,
26+
#[builder(default = true)]
2227
pub email_notifications: bool,
2328
}
2429

30+
impl<S: crate_owner_builder::State> CrateOwnerBuilder<S> {
31+
pub fn team_id(self, team_id: i32) -> CrateOwnerBuilder<SetOwnerId<SetOwnerKind<S>>>
32+
where
33+
S::OwnerId: crate_owner_builder::IsUnset,
34+
S::OwnerKind: crate_owner_builder::IsUnset,
35+
{
36+
self.owner_kind(OwnerKind::Team).owner_id(team_id)
37+
}
38+
39+
pub fn user_id(self, user_id: i32) -> CrateOwnerBuilder<SetOwnerId<SetOwnerKind<S>>>
40+
where
41+
S::OwnerId: crate_owner_builder::IsUnset,
42+
S::OwnerKind: crate_owner_builder::IsUnset,
43+
{
44+
self.owner_kind(OwnerKind::User).owner_id(user_id)
45+
}
46+
}
47+
2548
type BoxedQuery<'a> = crate_owners::BoxedQuery<'a, Pg, crate_owners::SqlType>;
2649

2750
impl CrateOwner {
@@ -35,13 +58,11 @@ impl CrateOwner {
3558
}
3659

3760
pub fn from_invite(invite: &CrateOwnerInvitation) -> Self {
38-
Self {
39-
crate_id: invite.crate_id,
40-
owner_id: invite.invited_user_id,
41-
created_by: invite.invited_by_user_id,
42-
owner_kind: OwnerKind::User,
43-
email_notifications: true,
44-
}
61+
CrateOwner::builder()
62+
.crate_id(invite.crate_id)
63+
.user_id(invite.invited_user_id)
64+
.created_by(invite.invited_by_user_id)
65+
.build()
4566
}
4667
}
4768

src/tests/issues/issue2736.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::models::{CrateOwner, OwnerKind};
1+
use crate::models::CrateOwner;
22
use crate::tests::builders::CrateBuilder;
33
use crate::tests::util::{RequestHelper, TestApp};
44
use crates_io_database::schema::{crate_owners, users};
@@ -23,14 +23,14 @@ async fn test_issue_2736() -> anyhow::Result<()> {
2323
.expect_build(&mut conn)
2424
.await;
2525

26+
let owner = CrateOwner::builder()
27+
.crate_id(krate.id)
28+
.user_id(foo1.as_model().id)
29+
.created_by(someone_else.as_model().id)
30+
.build();
31+
2632
diesel::insert_into(crate_owners::table)
27-
.values(CrateOwner {
28-
crate_id: krate.id,
29-
owner_id: foo1.as_model().id,
30-
created_by: someone_else.as_model().id,
31-
owner_kind: OwnerKind::User,
32-
email_notifications: true,
33-
})
33+
.values(owner)
3434
.execute(&mut conn)
3535
.await?;
3636

src/tests/mod.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::models::{Crate, CrateOwner, NewCategory, NewTeam, NewUser, OwnerKind, Team, User};
1+
use crate::models::{Crate, CrateOwner, NewCategory, NewTeam, NewUser, Team, User};
22
use crate::schema::crate_owners;
33
use crate::tests::util::{RequestHelper, TestApp};
44
use crate::views::{
@@ -114,13 +114,11 @@ pub async fn add_team_to_crate(
114114
u: &User,
115115
conn: &mut AsyncPgConnection,
116116
) -> QueryResult<()> {
117-
let crate_owner = CrateOwner {
118-
crate_id: krate.id,
119-
owner_id: t.id,
120-
created_by: u.id,
121-
owner_kind: OwnerKind::Team,
122-
email_notifications: true,
123-
};
117+
let crate_owner = CrateOwner::builder()
118+
.crate_id(krate.id)
119+
.team_id(t.id)
120+
.created_by(u.id)
121+
.build();
124122

125123
diesel::insert_into(crate_owners::table)
126124
.values(&crate_owner)

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::models::{CrateOwner, OwnerKind};
1+
use crate::models::CrateOwner;
22
use crate::tests::builders::CrateBuilder;
33
use crate::tests::util::{RequestHelper, TestApp};
44
use crates_io_database::schema::crate_owners;
@@ -93,14 +93,14 @@ async fn test_remove_uppercase_user() {
9393
.expect_build(&mut conn)
9494
.await;
9595

96+
let owner = CrateOwner::builder()
97+
.crate_id(krate.id)
98+
.user_id(user2.as_model().id)
99+
.created_by(cookie.as_model().id)
100+
.build();
101+
96102
diesel::insert_into(crate_owners::table)
97-
.values(CrateOwner {
98-
crate_id: krate.id,
99-
owner_id: user2.as_model().id,
100-
created_by: cookie.as_model().id,
101-
owner_kind: OwnerKind::User,
102-
email_notifications: true,
103-
})
103+
.values(owner)
104104
.execute(&mut conn)
105105
.await
106106
.unwrap();

0 commit comments

Comments
 (0)