use crate::structs::PrivateMessageReportView;
-use diesel::{result::Error, ExpressionMethods, JoinOnDsl, NullableExpressionMethods, QueryDsl};
+use diesel::{
+ pg::Pg,
+ result::Error,
+ ExpressionMethods,
+ JoinOnDsl,
+ NullableExpressionMethods,
+ QueryDsl,
+};
use diesel_async::RunQueryDsl;
use lemmy_db_schema::{
+ aliases,
newtypes::PrivateMessageReportId,
schema::{person, private_message, private_message_report},
source::{
private_message_report::PrivateMessageReport,
},
traits::JoinView,
- utils::{get_conn, limit_and_offset, DbPool},
+ utils::{get_conn, limit_and_offset, DbConn, DbPool, ListFn, Queries, ReadFn},
};
-use typed_builder::TypedBuilder;
type PrivateMessageReportViewTuple = (
PrivateMessageReport,
Option<Person>,
);
-impl PrivateMessageReportView {
- /// returns the PrivateMessageReportView for the provided report_id
- ///
- /// * `report_id` - the report id to obtain
- pub async fn read(
- pool: &mut DbPool<'_>,
- report_id: PrivateMessageReportId,
- ) -> Result<Self, Error> {
- let conn = &mut get_conn(pool).await?;
- let (person_alias_1, person_alias_2) = diesel::alias!(person as person1, person as person2);
-
- let (private_message_report, private_message, private_message_creator, creator, resolver) =
- private_message_report::table
- .find(report_id)
+fn queries<'a>() -> Queries<
+ impl ReadFn<'a, PrivateMessageReportView, PrivateMessageReportId>,
+ impl ListFn<'a, PrivateMessageReportView, PrivateMessageReportQuery>,
+> {
+ let all_joins =
+ |query: private_message_report::BoxedQuery<'a, Pg>| {
+ query
.inner_join(private_message::table)
.inner_join(person::table.on(private_message::creator_id.eq(person::id)))
.inner_join(
- person_alias_1
- .on(private_message_report::creator_id.eq(person_alias_1.field(person::id))),
- )
- .left_join(
- person_alias_2.on(
- private_message_report::resolver_id.eq(person_alias_2.field(person::id).nullable()),
- ),
+ aliases::person1
+ .on(private_message_report::creator_id.eq(aliases::person1.field(person::id))),
)
+ .left_join(aliases::person2.on(
+ private_message_report::resolver_id.eq(aliases::person2.field(person::id).nullable()),
+ ))
.select((
private_message_report::all_columns,
private_message::all_columns,
person::all_columns,
- person_alias_1.fields(person::all_columns),
- person_alias_2.fields(person::all_columns).nullable(),
+ aliases::person1.fields(person::all_columns),
+ aliases::person2.fields(person::all_columns).nullable(),
))
- .first::<PrivateMessageReportViewTuple>(conn)
- .await?;
-
- Ok(Self {
- private_message_report,
- private_message,
- private_message_creator,
- creator,
- resolver,
- })
+ };
+
+ let read = move |mut conn: DbConn<'a>, report_id: PrivateMessageReportId| async move {
+ all_joins(private_message_report::table.find(report_id).into_boxed())
+ .first::<PrivateMessageReportViewTuple>(&mut conn)
+ .await
+ };
+
+ let list = move |mut conn: DbConn<'a>, options: PrivateMessageReportQuery| async move {
+ let mut query = all_joins(private_message_report::table.into_boxed());
+
+ if options.unresolved_only {
+ query = query.filter(private_message_report::resolved.eq(false));
+ }
+
+ let (limit, offset) = limit_and_offset(options.page, options.limit)?;
+
+ query
+ .order_by(private_message::published.desc())
+ .limit(limit)
+ .offset(offset)
+ .load::<PrivateMessageReportViewTuple>(&mut conn)
+ .await
+ };
+
+ Queries::new(read, list)
+}
+
+impl PrivateMessageReportView {
+ /// returns the PrivateMessageReportView for the provided report_id
+ ///
+ /// * `report_id` - the report id to obtain
+ pub async fn read(
+ pool: &mut DbPool<'_>,
+ report_id: PrivateMessageReportId,
+ ) -> Result<Self, Error> {
+ queries().read(pool, report_id).await
}
/// Returns the current unresolved post report count for the communities you mod
}
}
-#[derive(TypedBuilder)]
-#[builder(field_defaults(default))]
-pub struct PrivateMessageReportQuery<'a, 'b: 'a> {
- #[builder(!default)]
- pool: &'a mut DbPool<'b>,
- page: Option<i64>,
- limit: Option<i64>,
- unresolved_only: Option<bool>,
+#[derive(Default)]
+pub struct PrivateMessageReportQuery {
+ pub page: Option<i64>,
+ pub limit: Option<i64>,
+ pub unresolved_only: bool,
}
-impl<'a, 'b: 'a> PrivateMessageReportQuery<'a, 'b> {
- pub async fn list(self) -> Result<Vec<PrivateMessageReportView>, Error> {
- let conn = &mut get_conn(self.pool).await?;
- let (person_alias_1, person_alias_2) = diesel::alias!(person as person1, person as person2);
-
- let mut query = private_message_report::table
- .inner_join(private_message::table)
- .inner_join(person::table.on(private_message::creator_id.eq(person::id)))
- .inner_join(
- person_alias_1.on(private_message_report::creator_id.eq(person_alias_1.field(person::id))),
- )
- .left_join(
- person_alias_2
- .on(private_message_report::resolver_id.eq(person_alias_2.field(person::id).nullable())),
- )
- .select((
- private_message_report::all_columns,
- private_message::all_columns,
- person::all_columns,
- person_alias_1.fields(person::all_columns),
- person_alias_2.fields(person::all_columns).nullable(),
- ))
- .into_boxed();
-
- if self.unresolved_only.unwrap_or(false) {
- query = query.filter(private_message_report::resolved.eq(false));
- }
-
- let (limit, offset) = limit_and_offset(self.page, self.limit)?;
-
- query = query
- .order_by(private_message::published.desc())
- .limit(limit)
- .offset(offset);
-
- let res = query.load::<PrivateMessageReportViewTuple>(conn).await?;
-
- Ok(
- res
- .into_iter()
- .map(PrivateMessageReportView::from_tuple)
- .collect(),
- )
+impl PrivateMessageReportQuery {
+ pub async fn list(self, pool: &mut DbPool<'_>) -> Result<Vec<PrivateMessageReportView>, Error> {
+ queries().list(pool, self).await
}
}
#[cfg(test)]
mod tests {
+ #![allow(clippy::unwrap_used)]
+ #![allow(clippy::indexing_slicing)]
+
use crate::private_message_report_view::PrivateMessageReportQuery;
use lemmy_db_schema::{
source::{
.await
.unwrap();
- let reports = PrivateMessageReportQuery::builder()
- .pool(pool)
- .build()
- .list()
+ let reports = PrivateMessageReportQuery::default()
+ .list(pool)
.await
.unwrap();
assert_eq!(1, reports.len());
.await
.unwrap();
- let reports = PrivateMessageReportQuery::builder()
- .pool(pool)
- .unresolved_only(Some(false))
- .build()
- .list()
- .await
- .unwrap();
+ let reports = PrivateMessageReportQuery {
+ unresolved_only: (false),
+ ..Default::default()
+ }
+ .list(pool)
+ .await
+ .unwrap();
assert_eq!(1, reports.len());
assert!(reports[0].private_message_report.resolved);
assert!(reports[0].resolver.is_some());