From e318a57982a49e6845eb9792c513d30a3c4c188b Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 6 Nov 2022 10:43:28 +0100 Subject: [PATCH 1/4] EncodableCrate: Simplify `badges` parameter in `from()` function --- src/views.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views.rs b/src/views.rs index f8edce8f5ac..8d1238b9968 100644 --- a/src/views.rs +++ b/src/views.rs @@ -242,7 +242,7 @@ impl EncodableCrate { versions: Option>, keywords: Option<&[Keyword]>, categories: Option<&[Category]>, - badges: Option>, + badges: Option>, exact_match: bool, recent_downloads: Option, ) -> Self { @@ -313,7 +313,7 @@ impl EncodableCrate { pub fn from_minimal( krate: Crate, top_versions: Option<&TopVersions>, - badges: Option>, + badges: Option>, exact_match: bool, recent_downloads: Option, ) -> Self { From 924b719cb664da653b725ad955cd54867f152c27 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 6 Nov 2022 10:33:41 +0100 Subject: [PATCH 2/4] EncodableCrate: Simplify `badges` type This field has been deprecated and will always contain `null` or an empty array, so there is no need anymore to have it contain `EncodableBadges` --- src/views.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views.rs b/src/views.rs index 8d1238b9968..73d3a982c1d 100644 --- a/src/views.rs +++ b/src/views.rs @@ -216,7 +216,7 @@ pub struct EncodableCrate { pub versions: Option>, pub keywords: Option>, pub categories: Option>, - pub badges: Option>, + pub badges: Option>, #[serde(with = "rfc3339")] pub created_at: NaiveDateTime, // NOTE: Used by shields.io, altering `downloads` requires a PR with shields.io From 24d5792ea359c3416db021001e395dfaa0f90dd4 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 6 Nov 2022 10:34:01 +0100 Subject: [PATCH 3/4] Remove unused `EncodableBadge` struct --- src/views.rs | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/views.rs b/src/views.rs index 73d3a982c1d..aa688e298db 100644 --- a/src/views.rs +++ b/src/views.rs @@ -1,11 +1,10 @@ use chrono::NaiveDateTime; -use std::collections::HashMap; use url::Url; use crate::github; use crate::models::{ - Badge, Category, Crate, CrateOwnerInvitation, CreatedApiToken, Dependency, DependencyKind, - Keyword, Owner, ReverseDependency, Team, TopVersions, User, Version, VersionDownload, + Category, Crate, CrateOwnerInvitation, CreatedApiToken, Dependency, DependencyKind, Keyword, + Owner, ReverseDependency, Team, TopVersions, User, Version, VersionDownload, VersionOwnerAction, }; use crate::util::rfc3339; @@ -14,19 +13,6 @@ use crate::util::rfc3339; /// and are possibly of malicious intent e.g. ad tracking networks, etc. const DOCUMENTATION_BLOCKLIST: &[&str] = &["rust-ci.org", "rustless.org", "ironframework.io"]; -#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct EncodableBadge { - pub badge_type: String, - pub attributes: HashMap>, -} - -impl From for EncodableBadge { - fn from(badge: Badge) -> Self { - // The serde attributes on Badge ensure it can be deserialized to EncodableBadge - serde_json::from_value(serde_json::to_value(badge).unwrap()).unwrap() - } -} - #[derive(Serialize, Deserialize, Debug)] pub struct EncodableCategory { pub id: String, From 8bab4066c171375577915031066942719affa777 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 6 Nov 2022 10:58:29 +0100 Subject: [PATCH 4/4] models: Remove unused `CrateBadge` struct --- src/models.rs | 2 - src/models/badge.rs | 147 -------------------------------------------- 2 files changed, 149 deletions(-) delete mode 100644 src/models/badge.rs diff --git a/src/models.rs b/src/models.rs index 261427a1465..fe277f1cc45 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,5 +1,4 @@ pub use self::action::{insert_version_owner_action, VersionAction, VersionOwnerAction}; -pub use self::badge::{Badge, CrateBadge, MaintenanceStatus}; pub use self::category::{Category, CrateCategory, NewCategory}; pub use self::crate_owner_invitation::{CrateOwnerInvitation, NewCrateOwnerInvitationOutcome}; pub use self::dependency::{Dependency, DependencyKind, ReverseDependency}; @@ -18,7 +17,6 @@ pub use self::version::{NewVersion, TopVersions, Version}; pub mod helpers; mod action; -mod badge; pub mod category; mod crate_owner_invitation; pub mod dependency; diff --git a/src/models/badge.rs b/src/models/badge.rs deleted file mode 100644 index cc5fe5ad870..00000000000 --- a/src/models/badge.rs +++ /dev/null @@ -1,147 +0,0 @@ -use diesel::associations::HasTable; -use diesel::pg::Pg; -use diesel::prelude::*; -use std::collections::HashMap; - -use crate::models::Crate; -use crate::schema::badges; - -/// A combination of a `Badge` and a crate ID. -/// -/// We don't typically care about the crate ID when dealing with badges. -/// However, when we are eager loading all badges for a group of crates, we need -/// the crate ID to group badges by their owner. -#[derive(Debug, Queryable, Associations)] -#[belongs_to(Crate)] -#[table_name = "badges"] -pub struct CrateBadge { - pub crate_id: i32, - pub badge: Badge, -} - -#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case", tag = "badge_type", content = "attributes")] -pub enum Badge { - TravisCi { - repository: String, - branch: Option, - }, - Appveyor { - repository: String, - id: Option, - branch: Option, - project_name: Option, - service: Option, - }, - AzureDevops { - project: String, - pipeline: String, - build: Option, - }, - #[serde(rename = "gitlab")] - GitLab { - repository: String, - branch: Option, - }, - CircleCi { - repository: String, - branch: Option, - }, - CirrusCi { - repository: String, - branch: Option, - }, - IsItMaintainedIssueResolution { - repository: String, - }, - IsItMaintainedOpenIssues { - repository: String, - }, - Codecov { - repository: String, - branch: Option, - service: Option, - }, - Coveralls { - repository: String, - branch: Option, - service: Option, - }, - BitbucketPipelines { - repository: String, - branch: String, - }, - Maintenance { - status: MaintenanceStatus, - }, -} - -#[derive(Debug, PartialEq, Eq, Clone, Copy, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub enum MaintenanceStatus { - ActivelyDeveloped, - PassivelyMaintained, - AsIs, - None, - Experimental, - LookingForMaintainer, - Deprecated, -} - -// FIXME: Derive this in Diesel 1.4. -impl HasTable for CrateBadge { - type Table = badges::table; - - fn table() -> Self::Table { - badges::table - } -} - -impl Queryable for Badge { - type Row = (i32, String, serde_json::Value); - - fn build((_, badge_type, attributes): Self::Row) -> Self { - let json = json!({"badge_type": badge_type, "attributes": attributes}); - serde_json::from_value(json).expect("Invalid CI badge in the database") - } -} - -impl Badge { - pub fn update_crate( - conn: &PgConnection, - krate: &Crate, - badges: Option<&HashMap>>, - ) -> QueryResult> { - use diesel::{delete, insert_into}; - - let mut invalid_badges = vec![]; - let mut new_badges = vec![]; - - if let Some(badges) = badges { - for (k, v) in badges { - let attributes_json = serde_json::to_value(v).unwrap(); - - let json = json!({"badge_type": k, "attributes": attributes_json}); - if serde_json::from_value::(json).is_ok() { - new_badges.push(( - badges::crate_id.eq(krate.id), - badges::badge_type.eq(k), - badges::attributes.eq(attributes_json), - )); - } else { - invalid_badges.push(k.to_string()); - } - } - } - - conn.transaction(|| { - delete(badges::table) - .filter(badges::crate_id.eq(krate.id)) - .execute(conn)?; - insert_into(badges::table) - .values(&new_badges) - .execute(conn)?; - Ok(invalid_badges) - }) - } -}