Skip to content

Commit 0be5672

Browse files
authored
Merge pull request #7191 from Turbo87/create-update
models/krate: Split `create_or_update()` fn into `create()` and `update()`
2 parents f6dd06a + 0e7a0b3 commit 0be5672

File tree

5 files changed

+31
-37
lines changed

5 files changed

+31
-37
lines changed

src/controllers/krate/publish.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,12 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
154154
return Err(cargo_err("cannot upload a crate with a reserved name"));
155155
}
156156

157-
let krate = persist.create_or_update(conn, user.id)?;
157+
// To avoid race conditions, we try to insert
158+
// first so we know whether to add an owner
159+
let krate = match persist.create(conn, user.id).optional()? {
160+
Some(krate) => krate,
161+
None => persist.update(conn)?,
162+
};
158163

159164
let owners = krate.owners(conn)?;
160165
if user.rights(&app, &owners)? < Rights::Publish {

src/downloads_counter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ mod tests {
439439
name: "foo",
440440
..NewCrate::default()
441441
}
442-
.create_or_update(conn, user.id)
442+
.create(conn, user.id)
443443
.expect("failed to create crate");
444444

445445
Self {

src/models/krate.rs

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -101,50 +101,39 @@ pub struct NewCrate<'a> {
101101
}
102102

103103
impl<'a> NewCrate<'a> {
104-
pub fn create_or_update(self, conn: &mut PgConnection, uploader: i32) -> AppResult<Crate> {
104+
pub fn update(&self, conn: &mut PgConnection) -> QueryResult<Crate> {
105105
use diesel::update;
106106

107-
conn.transaction(|conn| {
108-
// To avoid race conditions, we try to insert
109-
// first so we know whether to add an owner
110-
if let Some(krate) = self.save_new_crate(conn, uploader)? {
111-
return Ok(krate);
112-
}
113-
114-
update(crates::table)
115-
.filter(canon_crate_name(crates::name).eq(canon_crate_name(self.name)))
116-
.set(&self)
117-
.returning(Crate::as_returning())
118-
.get_result(conn)
119-
.map_err(Into::into)
120-
})
107+
update(crates::table)
108+
.filter(canon_crate_name(crates::name).eq(canon_crate_name(self.name)))
109+
.set(self)
110+
.returning(Crate::as_returning())
111+
.get_result(conn)
121112
}
122113

123-
fn save_new_crate(&self, conn: &mut PgConnection, user_id: i32) -> QueryResult<Option<Crate>> {
114+
pub fn create(&self, conn: &mut PgConnection, user_id: i32) -> QueryResult<Crate> {
124115
use crate::schema::crates::dsl::*;
125116

126117
conn.transaction(|conn| {
127-
let maybe_inserted: Option<Crate> = diesel::insert_into(crates)
118+
let krate: Crate = diesel::insert_into(crates)
128119
.values(self)
129120
.on_conflict_do_nothing()
130121
.returning(Crate::as_returning())
131-
.get_result(conn)
132-
.optional()?;
133-
134-
if let Some(ref krate) = maybe_inserted {
135-
let owner = CrateOwner {
136-
crate_id: krate.id,
137-
owner_id: user_id,
138-
created_by: user_id,
139-
owner_kind: OwnerKind::User as i32,
140-
email_notifications: true,
141-
};
142-
diesel::insert_into(crate_owners::table)
143-
.values(&owner)
144-
.execute(conn)?;
145-
}
122+
.get_result(conn)?;
123+
124+
let owner = CrateOwner {
125+
crate_id: krate.id,
126+
owner_id: user_id,
127+
created_by: user_id,
128+
owner_kind: OwnerKind::User as i32,
129+
email_notifications: true,
130+
};
131+
132+
diesel::insert_into(crate_owners::table)
133+
.values(&owner)
134+
.execute(conn)?;
146135

147-
Ok(maybe_inserted)
136+
Ok(krate)
148137
})
149138
}
150139
}

src/tests/builders/krate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ impl<'a> CrateBuilder<'a> {
114114
pub fn build(mut self, connection: &mut PgConnection) -> AppResult<Crate> {
115115
use diesel::{insert_into, select, update};
116116

117-
let mut krate = self.krate.create_or_update(connection, self.owner_id)?;
117+
let mut krate = self.krate.create(connection, self.owner_id)?;
118118

119119
// Since we are using `NewCrate`, we can't set all the
120120
// crate properties in a single DB call.

src/worker/update_downloads.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ mod test {
9898
name: "foo",
9999
..Default::default()
100100
}
101-
.create_or_update(conn, user_id)
101+
.create(conn, user_id)
102102
.unwrap();
103103
let version = NewVersion::new(
104104
krate.id,

0 commit comments

Comments
 (0)