diff --git a/crates/crates_io_database/src/models/mod.rs b/crates/crates_io_database/src/models/mod.rs index 383d3b97443..e04985b9885 100644 --- a/crates/crates_io_database/src/models/mod.rs +++ b/crates/crates_io_database/src/models/mod.rs @@ -36,3 +36,4 @@ pub mod token; pub mod trustpub; pub mod user; pub mod version; +pub mod versions_published_by; diff --git a/crates/crates_io_database/src/models/version.rs b/crates/crates_io_database/src/models/version.rs index 1fc2e1eef5d..6702489816d 100644 --- a/crates/crates_io_database/src/models/version.rs +++ b/crates/crates_io_database/src/models/version.rs @@ -4,12 +4,11 @@ use bon::Builder; use chrono::{DateTime, Utc}; use crates_io_index::features::FeaturesMap; use diesel::prelude::*; -use diesel_async::scoped_futures::ScopedFutureExt; -use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl}; +use diesel_async::{AsyncPgConnection, RunQueryDsl}; use serde::Deserialize; use crate::models::{Crate, User}; -use crate::schema::*; +use crate::schema::{readme_renderings, users, versions}; // Queryable has a custom implementation below #[derive(Clone, Identifiable, Associations, Debug, Queryable, Selectable)] @@ -107,34 +106,12 @@ pub struct NewVersion<'a> { } impl NewVersion<'_> { - pub async fn save( - &self, - conn: &mut AsyncPgConnection, - published_by_email: &str, - ) -> QueryResult { - use diesel::insert_into; - - conn.transaction(|conn| { - async move { - let version: Version = insert_into(versions::table) - .values(self) - .returning(Version::as_returning()) - .get_result(conn) - .await?; - - insert_into(versions_published_by::table) - .values(( - versions_published_by::version_id.eq(version.id), - versions_published_by::email.eq(published_by_email), - )) - .execute(conn) - .await?; - - Ok(version) - } - .scope_boxed() - }) - .await + pub async fn save(&self, conn: &mut AsyncPgConnection) -> QueryResult { + diesel::insert_into(versions::table) + .values(self) + .returning(Version::as_returning()) + .get_result(conn) + .await } } diff --git a/crates/crates_io_database/src/models/versions_published_by.rs b/crates/crates_io_database/src/models/versions_published_by.rs new file mode 100644 index 00000000000..31755bdee8f --- /dev/null +++ b/crates/crates_io_database/src/models/versions_published_by.rs @@ -0,0 +1,17 @@ +use crate::schema::versions_published_by; +use diesel::prelude::*; +use diesel_async::{AsyncPgConnection, RunQueryDsl}; + +pub async fn insert( + version_id: i32, + email: &str, + conn: &mut AsyncPgConnection, +) -> QueryResult { + diesel::insert_into(versions_published_by::table) + .values(( + versions_published_by::version_id.eq(version_id), + versions_published_by::email.eq(email), + )) + .execute(conn) + .await +} diff --git a/src/controllers/krate/publish.rs b/src/controllers/krate/publish.rs index c3456ac9b2d..83eca6e663e 100644 --- a/src/controllers/krate/publish.rs +++ b/src/controllers/krate/publish.rs @@ -42,6 +42,7 @@ use crate::util::errors::{AppResult, BoxedAppError, bad_request, custom, interna use crate::views::{ EncodableCrate, EncodableCrateDependency, GoodCrate, PublishMetadata, PublishWarnings, }; +use crates_io_database::models::versions_published_by; use crates_io_diesel_helpers::canon_crate_name; 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 @@ -441,6 +442,8 @@ pub async fn publish(app: AppState, req: Parts, body: Body) -> AppResult