diff --git a/crates/db_schema/src/newtypes.rs b/crates/db_schema/src/newtypes.rs index 5ae029071..3cf8af746 100644 --- a/crates/db_schema/src/newtypes.rs +++ b/crates/db_schema/src/newtypes.rs @@ -180,8 +180,7 @@ pub struct LtreeDef(pub String); pub struct DbUrl(pub(crate) Box); #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Serialize, Deserialize, Default)] -#[cfg_attr(feature = "full", derive(DieselNewType, TS))] -#[cfg_attr(feature = "full", ts(export))] +#[cfg_attr(feature = "full", derive(DieselNewType))] /// The report combined id pub struct ReportCombinedId(i32); diff --git a/crates/db_schema/src/source/combined/report.rs b/crates/db_schema/src/source/combined/report.rs index 4085bddd6..5ea825b83 100644 --- a/crates/db_schema/src/source/combined/report.rs +++ b/crates/db_schema/src/source/combined/report.rs @@ -6,27 +6,21 @@ use chrono::{DateTime, Utc}; use i_love_jesus::CursorKeysModule; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; -#[cfg(feature = "full")] -use ts_rs::TS; #[skip_serializing_none] #[derive(PartialEq, Eq, Serialize, Deserialize, Debug, Clone)] #[cfg_attr( feature = "full", - derive(Identifiable, Queryable, Selectable, TS, CursorKeysModule) + derive(Identifiable, Queryable, Selectable, CursorKeysModule) )] #[cfg_attr(feature = "full", diesel(table_name = report_combined))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] -#[cfg_attr(feature = "full", ts(export))] #[cfg_attr(feature = "full", cursor_keys_module(name = report_combined_keys))] /// A combined reports table. pub struct ReportCombined { pub id: ReportCombinedId, pub published: DateTime, - #[cfg_attr(feature = "full", ts(optional))] pub post_report_id: Option, - #[cfg_attr(feature = "full", ts(optional))] pub comment_report_id: Option, - #[cfg_attr(feature = "full", ts(optional))] pub private_message_report_id: Option, } diff --git a/crates/db_views/src/report_combined_view.rs b/crates/db_views/src/report_combined_view.rs index b38c7841f..46ad9bf48 100644 --- a/crates/db_views/src/report_combined_view.rs +++ b/crates/db_views/src/report_combined_view.rs @@ -16,6 +16,7 @@ use diesel::{ ExpressionMethods, JoinOnDsl, NullableExpressionMethods, + PgExpressionMethods, QueryDsl, SelectableHelper, }; @@ -82,9 +83,12 @@ impl ReportCombinedViewInternal { Some(my_person_id), post::community_id, )) - .filter(post_report::resolved.eq(false)) - .or_filter(comment_report::resolved.eq(false)) - .or_filter(private_message_report::resolved.eq(false)) + .filter( + post_report::resolved + .or(comment_report::resolved) + .or(private_message_report::resolved) + .is_distinct_from(true), + ) .into_boxed(); if let Some(community_id) = community_id { @@ -191,9 +195,7 @@ impl ReportCombinedQuery { .or(comment::post_id.eq(post::id)), ), ) - // The item creator - // You can now use aliases::person1.field(person::id) / item_creator - // for all the item actions + // The item creator (`item_creator` is the id of this person) .inner_join( aliases::person1.on( post::creator_id @@ -312,9 +314,9 @@ impl ReportCombinedQuery { query = query .filter( post_report::resolved - .eq(false) - .or(comment_report::resolved.eq(false)) - .or(private_message_report::resolved.eq(false)), + .or(comment_report::resolved) + .or(private_message_report::resolved) + .is_distinct_from(true), ) // TODO: when a `then_asc` method is added, use it here, make the id sort direction match, // and remove the separate index; unless additional columns are added to this sort diff --git a/migrations/2024-12-02-181601_add_report_combined_table/up.sql b/migrations/2024-12-02-181601_add_report_combined_table/up.sql index 40dd9b277..8425f5d0d 100644 --- a/migrations/2024-12-02-181601_add_report_combined_table/up.sql +++ b/migrations/2024-12-02-181601_add_report_combined_table/up.sql @@ -7,7 +7,7 @@ CREATE TABLE report_combined ( comment_report_id int UNIQUE REFERENCES comment_report ON UPDATE CASCADE ON DELETE CASCADE, private_message_report_id int UNIQUE REFERENCES private_message_report ON UPDATE CASCADE ON DELETE CASCADE, -- Make sure only one of the columns is not null - CHECK ((post_report_id IS NOT NULL)::integer + (comment_report_id IS NOT NULL)::integer + (private_message_report_id IS NOT NULL)::integer = 1) + CHECK (num_nonnulls (post_report_id, comment_report_id, private_message_report_id) = 1) ); CREATE INDEX idx_report_combined_published ON report_combined (published DESC, id DESC); @@ -15,23 +15,27 @@ CREATE INDEX idx_report_combined_published ON report_combined (published DESC, i CREATE INDEX idx_report_combined_published_asc ON report_combined (reverse_timestamp_sort (published) DESC, id DESC); -- Updating the history -INSERT INTO report_combined (published, post_report_id) +INSERT INTO report_combined (published, post_report_id, comment_report_id, private_message_report_id) SELECT published, - id + id, + NULL, + NULL FROM - post_report; - -INSERT INTO report_combined (published, comment_report_id) + post_report +UNION ALL SELECT published, - id + NULL, + id, + NULL FROM - comment_report; - -INSERT INTO report_combined (published, private_message_report_id) + comment_report +UNION ALL SELECT published, + NULL, + NULL, id FROM private_message_report;