Skip to content

Commit 19759c7

Browse files
authored
Merge pull request #11290 from Turbo87/version-save
Simplify `NewVersion::save()` fn
2 parents bfb02aa + 26c4edf commit 19759c7

File tree

6 files changed

+35
-34
lines changed

6 files changed

+35
-34
lines changed

crates/crates_io_database/src/models/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,4 @@ pub mod token;
3636
pub mod trustpub;
3737
pub mod user;
3838
pub mod version;
39+
pub mod versions_published_by;

crates/crates_io_database/src/models/version.rs

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ use bon::Builder;
44
use chrono::{DateTime, Utc};
55
use crates_io_index::features::FeaturesMap;
66
use diesel::prelude::*;
7-
use diesel_async::scoped_futures::ScopedFutureExt;
8-
use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl};
7+
use diesel_async::{AsyncPgConnection, RunQueryDsl};
98
use serde::Deserialize;
109

1110
use crate::models::{Crate, User};
12-
use crate::schema::*;
11+
use crate::schema::{readme_renderings, users, versions};
1312

1413
// Queryable has a custom implementation below
1514
#[derive(Clone, Identifiable, Associations, Debug, Queryable, Selectable)]
@@ -107,34 +106,12 @@ pub struct NewVersion<'a> {
107106
}
108107

109108
impl NewVersion<'_> {
110-
pub async fn save(
111-
&self,
112-
conn: &mut AsyncPgConnection,
113-
published_by_email: &str,
114-
) -> QueryResult<Version> {
115-
use diesel::insert_into;
116-
117-
conn.transaction(|conn| {
118-
async move {
119-
let version: Version = insert_into(versions::table)
120-
.values(self)
121-
.returning(Version::as_returning())
122-
.get_result(conn)
123-
.await?;
124-
125-
insert_into(versions_published_by::table)
126-
.values((
127-
versions_published_by::version_id.eq(version.id),
128-
versions_published_by::email.eq(published_by_email),
129-
))
130-
.execute(conn)
131-
.await?;
132-
133-
Ok(version)
134-
}
135-
.scope_boxed()
136-
})
137-
.await
109+
pub async fn save(&self, conn: &mut AsyncPgConnection) -> QueryResult<Version> {
110+
diesel::insert_into(versions::table)
111+
.values(self)
112+
.returning(Version::as_returning())
113+
.get_result(conn)
114+
.await
138115
}
139116
}
140117

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use crate::schema::versions_published_by;
2+
use diesel::prelude::*;
3+
use diesel_async::{AsyncPgConnection, RunQueryDsl};
4+
5+
pub async fn insert(
6+
version_id: i32,
7+
email: &str,
8+
conn: &mut AsyncPgConnection,
9+
) -> QueryResult<usize> {
10+
diesel::insert_into(versions_published_by::table)
11+
.values((
12+
versions_published_by::version_id.eq(version_id),
13+
versions_published_by::email.eq(email),
14+
))
15+
.execute(conn)
16+
.await
17+
}

src/controllers/krate/publish.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ use crate::util::errors::{AppResult, BoxedAppError, bad_request, custom, interna
4242
use crate::views::{
4343
EncodableCrate, EncodableCrateDependency, GoodCrate, PublishMetadata, PublishWarnings,
4444
};
45+
use crates_io_database::models::versions_published_by;
4546
use crates_io_diesel_helpers::canon_crate_name;
4647

4748
const MISSING_RIGHTS_ERROR_MESSAGE: &str = "this crate exists but you don't seem to be an owner. \
@@ -432,7 +433,7 @@ pub async fn publish(app: AppState, req: Parts, body: Body) -> AppResult<Json<Go
432433
.keywords(&keywords)
433434
.build();
434435

435-
let version = new_version.save(conn, &verified_email_address).await.map_err(|error| {
436+
let version = new_version.save(conn).await.map_err(|error| {
436437
use diesel::result::{Error, DatabaseErrorKind};
437438
match error {
438439
Error::DatabaseError(DatabaseErrorKind::UniqueViolation, _) =>
@@ -441,6 +442,8 @@ pub async fn publish(app: AppState, req: Parts, body: Body) -> AppResult<Json<Go
441442
}
442443
})?;
443444

445+
versions_published_by::insert(version.id, &verified_email_address, conn).await?;
446+
444447
NewVersionOwnerAction::builder()
445448
.version_id(version.id)
446449
.user_id(user.id)

src/tests/builders/version.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::schema::dependencies;
33
use std::collections::BTreeMap;
44

55
use chrono::{DateTime, Utc};
6+
use crates_io_database::models::versions_published_by;
67
use diesel::prelude::*;
78
use diesel_async::{AsyncPgConnection, RunQueryDsl};
89

@@ -110,7 +111,8 @@ impl VersionBuilder {
110111
.maybe_created_at(self.created_at.as_ref())
111112
.build();
112113

113-
let vers = new_version.save(connection, "[email protected]").await?;
114+
let vers = new_version.save(connection).await?;
115+
versions_published_by::insert(vers.id, "[email protected]", connection).await?;
114116

115117
let new_deps = self
116118
.dependencies

src/worker/jobs/downloads/update_metadata.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ mod tests {
136136
.checksum("0000000000000000000000000000000000000000000000000000000000000000")
137137
.build();
138138

139-
let version = version.save(conn, "[email protected]").await.unwrap();
139+
let version = version.save(conn).await.unwrap();
140+
140141
(krate, version)
141142
}
142143

0 commit comments

Comments
 (0)