diff --git a/src/admin/render_readmes.rs b/src/admin/render_readmes.rs index 72f2023a930..66f2f5d2c61 100644 --- a/src/admin/render_readmes.rs +++ b/src/admin/render_readmes.rs @@ -100,7 +100,7 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> { let versions: Vec<(Version, String)> = versions::table .inner_join(crates::table) .filter(versions::id.eq_any(version_ids_chunk)) - .select((versions::all_columns, crates::name)) + .select((Version::as_select(), crates::name)) .load(conn) .context("error loading versions")?; diff --git a/src/controllers/krate/metadata.rs b/src/controllers/krate/metadata.rs index 0c05a171624..0c10c4197ab 100644 --- a/src/controllers/krate/metadata.rs +++ b/src/controllers/krate/metadata.rs @@ -7,8 +7,8 @@ use crate::app::AppState; use crate::controllers::helpers::pagination::PaginationOptions; use crate::models::{ - Category, Crate, CrateCategory, CrateKeyword, CrateVersions, Keyword, RecentCrateDownloads, - User, Version, VersionOwnerAction, + Category, Crate, CrateCategory, CrateKeyword, CrateName, CrateVersions, Keyword, + RecentCrateDownloads, User, Version, VersionOwnerAction, }; use crate::schema::*; use crate::tasks::spawn_blocking; @@ -63,7 +63,7 @@ pub async fn show(app: AppState, Path(name): Path, req: Parts) -> AppRes let mut versions_and_publishers: Vec<(Version, Option)> = krate .all_versions() .left_outer_join(users::table) - .select((versions::all_columns, users::all_columns.nullable())) + .select(<(Version, Option)>::as_select()) .load(conn)?; versions_and_publishers.sort_by_cached_key(|(version, _)| { Reverse(semver::Version::parse(&version.num).ok()) @@ -92,7 +92,7 @@ pub async fn show(app: AppState, Path(name): Path, req: Parts) -> AppRes Some( CrateKeyword::belonging_to(&krate) .inner_join(keywords::table) - .select(keywords::all_columns) + .select(Keyword::as_select()) .load(conn)?, ) } else { @@ -102,7 +102,7 @@ pub async fn show(app: AppState, Path(name): Path, req: Parts) -> AppRes Some( CrateCategory::belonging_to(&krate) .inner_join(categories::table) - .select(categories::all_columns) + .select(Category::as_select()) .load(conn)?, ) } else { @@ -260,15 +260,11 @@ pub async fn reverse_dependencies( let version_ids: Vec = rev_deps.iter().map(|dep| dep.version_id).collect(); - let versions_and_publishers: Vec<(Version, String, Option)> = versions::table + let versions_and_publishers: Vec<(Version, CrateName, Option)> = versions::table .filter(versions::id.eq_any(version_ids)) .inner_join(crates::table) .left_outer_join(users::table) - .select(( - versions::all_columns, - crates::name, - users::all_columns.nullable(), - )) + .select(<(Version, CrateName, Option)>::as_select()) .load(conn)?; let versions = versions_and_publishers .iter() @@ -279,7 +275,7 @@ pub async fn reverse_dependencies( .into_iter() .zip(actions) .map(|((version, krate_name, published_by), actions)| { - EncodableVersion::from(version, &krate_name, published_by, actions) + EncodableVersion::from(version, &krate_name.name, published_by, actions) }) .collect::>(); diff --git a/src/controllers/krate/versions.rs b/src/controllers/krate/versions.rs index b7623f5a11b..9ccb48c1373 100644 --- a/src/controllers/krate/versions.rs +++ b/src/controllers/krate/versions.rs @@ -102,7 +102,7 @@ fn list_by_date( let mut query = versions::table .filter(versions::crate_id.eq(crate_id)) .left_outer_join(users::table) - .select((versions::all_columns, users::all_columns.nullable())) + .select(<(Version, Option)>::as_select()) .into_boxed(); let mut release_tracks = None; @@ -239,7 +239,7 @@ fn list_by_semver( for result in versions::table .filter(versions::crate_id.eq(crate_id)) .left_outer_join(users::table) - .select((versions::all_columns, users::all_columns.nullable())) + .select(<(Version, Option)>::as_select()) .filter(versions::id.eq_any(ids)) .load_iter::<(Version, Option), DefaultLoadingMode>(conn)? { @@ -267,7 +267,7 @@ fn list_by_semver( let mut data: Vec<(Version, Option)> = versions::table .filter(versions::crate_id.eq(crate_id)) .left_outer_join(users::table) - .select((versions::all_columns, users::all_columns.nullable())) + .select(<(Version, Option)>::as_select()) .load(conn)?; data.sort_by_cached_key(|(version, _)| Reverse(semver::Version::parse(&version.num).ok())); let total = data.len(); diff --git a/src/controllers/user/me.rs b/src/controllers/user/me.rs index 36875cc16c6..4d8f96a4ab3 100644 --- a/src/controllers/user/me.rs +++ b/src/controllers/user/me.rs @@ -11,6 +11,7 @@ use std::collections::HashMap; use crate::app::AppState; use crate::controllers::helpers::pagination::{Paginated, PaginationOptions}; use crate::controllers::helpers::{ok_true, Paginate}; +use crate::models::krate::CrateName; use crate::models::{CrateOwner, Follow, OwnerKind, User, Version, VersionOwnerAction}; use crate::schema::{crate_owners, crates, emails, follows, users, versions}; use crate::tasks::spawn_blocking; @@ -31,7 +32,7 @@ pub async fn me(app: AppState, req: Parts) -> AppResult> { .find(user_id) .left_join(emails::table) .select(( - users::all_columns, + User::as_select(), emails::verified.nullable(), emails::email.nullable(), emails::token_generated_at.nullable().is_not_null(), @@ -77,13 +78,9 @@ pub async fn updates(app: AppState, req: Parts) -> AppResult> { .left_outer_join(users::table) .filter(crates::id.eq_any(followed_crates)) .order(versions::created_at.desc()) - .select(( - versions::all_columns, - crates::name, - users::all_columns.nullable(), - )) + .select(<(Version, CrateName, Option)>::as_select()) .pages_pagination(PaginationOptions::builder().gather(&req)?); - let data: Paginated<(Version, String, Option)> = query.load(conn)?; + let data: Paginated<(Version, CrateName, Option)> = query.load(conn)?; let more = data.next_page_params().is_some(); let versions = data.iter().map(|(v, ..)| v).collect::>(); let actions = VersionOwnerAction::for_versions(conn, &versions)?; @@ -95,7 +92,7 @@ pub async fn updates(app: AppState, req: Parts) -> AppResult> { let versions = data .into_iter() .map(|(version, crate_name, published_by, actions)| { - EncodableVersion::from(version, &crate_name, published_by, actions) + EncodableVersion::from(version, &crate_name.name, published_by, actions) }) .collect::>(); diff --git a/src/index.rs b/src/index.rs index 0ee06a62d24..52010ec364a 100644 --- a/src/index.rs +++ b/src/index.rs @@ -3,7 +3,7 @@ //! index files. use crate::models::{Crate, CrateVersions, Dependency, Version}; -use crate::schema::{crates, dependencies}; +use crate::schema::crates; use anyhow::Context; use crates_io_index::features::split_features; use diesel::prelude::*; @@ -68,7 +68,7 @@ pub async fn index_metadata( let deps: Vec<(Dependency, String)> = Dependency::belonging_to(&versions) .inner_join(crates::table) - .select((dependencies::all_columns, crates::name)) + .select((Dependency::as_select(), crates::name)) .load(conn) .await?; diff --git a/src/models.rs b/src/models.rs index 08cc17b4695..ce547c2fc7f 100644 --- a/src/models.rs +++ b/src/models.rs @@ -7,7 +7,7 @@ pub use self::download::VersionDownload; pub use self::email::{Email, NewEmail}; pub use self::follow::Follow; pub use self::keyword::{CrateKeyword, Keyword}; -pub use self::krate::{Crate, CrateVersions, NewCrate, RecentCrateDownloads}; +pub use self::krate::{Crate, CrateName, CrateVersions, NewCrate, RecentCrateDownloads}; pub use self::owner::{CrateOwner, Owner, OwnerKind}; pub use self::rights::Rights; pub use self::team::{NewTeam, Team}; diff --git a/src/models/category.rs b/src/models/category.rs index 0f222c1dbcf..815c38ca3e7 100644 --- a/src/models/category.rs +++ b/src/models/category.rs @@ -5,7 +5,7 @@ use crate::models::Crate; use crate::schema::*; use crate::util::diesel::Conn; -#[derive(Clone, Identifiable, Queryable, QueryableByName, Debug)] +#[derive(Clone, Identifiable, Queryable, QueryableByName, Debug, Selectable)] #[diesel(table_name = categories, check_for_backend(diesel::pg::Pg))] pub struct Category { pub id: i32, diff --git a/src/models/dependency.rs b/src/models/dependency.rs index 6681464ae23..21d9cd14f22 100644 --- a/src/models/dependency.rs +++ b/src/models/dependency.rs @@ -5,7 +5,7 @@ use crate::schema::*; use crate::sql::pg_enum; use crates_io_index::DependencyKind as IndexDependencyKind; -#[derive(Identifiable, Associations, Debug, Queryable, QueryableByName)] +#[derive(Identifiable, Associations, Debug, Queryable, QueryableByName, Selectable)] #[diesel( table_name = dependencies, check_for_backend(diesel::pg::Pg), diff --git a/src/models/keyword.rs b/src/models/keyword.rs index af9e94f74eb..59739587338 100644 --- a/src/models/keyword.rs +++ b/src/models/keyword.rs @@ -6,7 +6,7 @@ use crate::schema::*; use crate::sql::lower; use crate::util::diesel::Conn; -#[derive(Clone, Identifiable, Queryable, Debug)] +#[derive(Clone, Identifiable, Queryable, Debug, Selectable)] pub struct Keyword { pub id: i32, pub keyword: String, diff --git a/src/models/krate.rs b/src/models/krate.rs index a6a34598a6f..c6fcfb6e6f8 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -34,6 +34,12 @@ pub struct RecentCrateDownloads { pub downloads: i32, } +#[derive(Debug, Clone, Queryable, Selectable)] +#[diesel(table_name = crates, check_for_backend(diesel::pg::Pg))] +pub struct CrateName { + pub name: String, +} + #[derive(Debug, Clone, Queryable, Identifiable, AsChangeset, QueryableByName, Selectable)] #[diesel(table_name = crates, check_for_backend(diesel::pg::Pg))] pub struct Crate { @@ -338,14 +344,14 @@ impl Crate { let users = CrateOwner::by_owner_kind(OwnerKind::User) .filter(crate_owners::crate_id.eq(self.id)) .inner_join(users::table) - .select(users::all_columns) + .select(User::as_select()) .load(conn)? .into_iter() .map(Owner::User); let teams = CrateOwner::by_owner_kind(OwnerKind::Team) .filter(crate_owners::crate_id.eq(self.id)) .inner_join(teams::table) - .select(teams::all_columns) + .select(Team::as_select()) .load(conn)? .into_iter() .map(Owner::Team); diff --git a/src/models/team.rs b/src/models/team.rs index 89804ffa874..413aaa1dc62 100644 --- a/src/models/team.rs +++ b/src/models/team.rs @@ -15,7 +15,7 @@ use crate::util::diesel::Conn; /// For now, just a Github Team. Can be upgraded to other teams /// later if desirable. -#[derive(Queryable, Identifiable, Serialize, Deserialize, Debug)] +#[derive(Queryable, Identifiable, Serialize, Deserialize, Debug, Selectable)] pub struct Team { /// Unique table id pub id: i32, @@ -200,7 +200,7 @@ impl Team { let base_query = CrateOwner::belonging_to(krate).filter(crate_owners::deleted.eq(false)); let teams = base_query .inner_join(teams::table) - .select(teams::all_columns) + .select(Team::as_select()) .filter(crate_owners::owner_kind.eq(OwnerKind::Team)) .load(conn)? .into_iter() diff --git a/src/models/user.rs b/src/models/user.rs index 7aa70f9209e..8b3f63c099f 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -13,7 +13,7 @@ use crate::sql::lower; use crate::util::diesel::Conn; /// The model representing a row in the `users` database table. -#[derive(Clone, Debug, PartialEq, Eq, Queryable, Identifiable, AsChangeset)] +#[derive(Clone, Debug, PartialEq, Eq, Queryable, Identifiable, AsChangeset, Selectable)] pub struct User { pub id: i32, pub gh_access_token: String, @@ -43,7 +43,7 @@ impl User { pub fn owning(krate: &Crate, conn: &mut impl Conn) -> QueryResult> { let users = CrateOwner::by_owner_kind(OwnerKind::User) .inner_join(users::table) - .select(users::all_columns) + .select(User::as_select()) .filter(crate_owners::crate_id.eq(krate.id)) .load(conn)? .into_iter() diff --git a/src/models/version.rs b/src/models/version.rs index 07d81d345c5..958d331a9ee 100644 --- a/src/models/version.rs +++ b/src/models/version.rs @@ -11,7 +11,7 @@ use crate::schema::*; use crate::util::diesel::Conn; // Queryable has a custom implementation below -#[derive(Clone, Identifiable, Associations, Debug, Queryable)] +#[derive(Clone, Identifiable, Associations, Debug, Queryable, Selectable)] #[diesel(belongs_to(Crate))] pub struct Version { pub id: i32, @@ -39,7 +39,7 @@ impl Version { pub fn dependencies(&self, conn: &mut impl Conn) -> QueryResult> { Dependency::belonging_to(self) .inner_join(crates::table) - .select((dependencies::all_columns, crates::name)) + .select((Dependency::as_select(), crates::name)) .order((dependencies::optional, crates::name)) .load(conn) }