1 use diesel::{result::Error, *};
2 use lemmy_db_queries::{limit_and_offset, MaybeOptional, ToSafe, ViewToVec};
4 schema::{community, person, person_alias_1, person_alias_2, post, post_report},
6 community::{Community, CommunitySafe},
7 person::{Person, PersonAlias1, PersonAlias2, PersonSafe, PersonSafeAlias1, PersonSafeAlias2},
9 post_report::PostReport,
14 #[derive(Debug, PartialEq, Serialize, Clone)]
15 pub struct PostReportView {
16 pub post_report: PostReport,
18 pub community: CommunitySafe,
19 pub creator: PersonSafe,
20 pub post_creator: PersonSafeAlias1,
21 pub resolver: Option<PersonSafeAlias2>,
24 type PostReportViewTuple = (
30 Option<PersonSafeAlias2>,
34 /// returns the PostReportView for the provided report_id
36 /// * `report_id` - the report id to obtain
37 pub fn read(conn: &PgConnection, report_id: i32) -> Result<Self, Error> {
38 let (post_report, post, community, creator, post_creator, resolver) = post_report::table
40 .inner_join(post::table)
41 .inner_join(community::table.on(post::community_id.eq(community::id)))
42 .inner_join(person::table.on(post_report::creator_id.eq(person::id)))
43 .inner_join(person_alias_1::table.on(post::creator_id.eq(person_alias_1::id)))
45 person_alias_2::table.on(post_report::resolver_id.eq(person_alias_2::id.nullable())),
48 post_report::all_columns,
50 Community::safe_columns_tuple(),
51 Person::safe_columns_tuple(),
52 PersonAlias1::safe_columns_tuple(),
53 PersonAlias2::safe_columns_tuple().nullable(),
55 .first::<PostReportViewTuple>(conn)?;
67 /// returns the current unresolved post report count for the supplied community ids
69 /// * `community_ids` - a Vec<i32> of community_ids to get a count for
70 /// TODO this eq_any is a bad way to do this, would be better to join to communitymoderator
72 pub fn get_report_count(conn: &PgConnection, community_ids: &[i32]) -> Result<i64, Error> {
75 .inner_join(post::table)
79 .and(post::community_id.eq_any(community_ids)),
81 .select(count(post_report::id))
86 pub struct PostReportQueryBuilder<'a> {
87 conn: &'a PgConnection,
88 community_ids: Option<Vec<i32>>, // TODO bad way to do this
91 resolved: Option<bool>,
94 impl<'a> PostReportQueryBuilder<'a> {
95 pub fn create(conn: &'a PgConnection) -> Self {
96 PostReportQueryBuilder {
101 resolved: Some(false),
105 pub fn community_ids<T: MaybeOptional<Vec<i32>>>(mut self, community_ids: T) -> Self {
106 self.community_ids = community_ids.get_optional();
110 pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
111 self.page = page.get_optional();
115 pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
116 self.limit = limit.get_optional();
120 pub fn resolved<T: MaybeOptional<bool>>(mut self, resolved: T) -> Self {
121 self.resolved = resolved.get_optional();
125 pub fn list(self) -> Result<Vec<PostReportView>, Error> {
126 let mut query = post_report::table
127 .inner_join(post::table)
128 .inner_join(community::table.on(post::community_id.eq(community::id)))
129 .inner_join(person::table.on(post_report::creator_id.eq(person::id)))
130 .inner_join(person_alias_1::table.on(post::creator_id.eq(person_alias_1::id)))
132 person_alias_2::table.on(post_report::resolver_id.eq(person_alias_2::id.nullable())),
135 post_report::all_columns,
137 Community::safe_columns_tuple(),
138 Person::safe_columns_tuple(),
139 PersonAlias1::safe_columns_tuple(),
140 PersonAlias2::safe_columns_tuple().nullable(),
144 if let Some(comm_ids) = self.community_ids {
145 query = query.filter(post::community_id.eq_any(comm_ids));
148 if let Some(resolved_flag) = self.resolved {
149 query = query.filter(post_report::resolved.eq(resolved_flag));
152 let (limit, offset) = limit_and_offset(self.page, self.limit);
155 .order_by(post_report::published.asc())
158 .load::<PostReportViewTuple>(self.conn)?;
160 Ok(PostReportView::from_tuple_to_vec(res))
164 impl ViewToVec for PostReportView {
165 type DbTuple = PostReportViewTuple;
166 fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
170 post_report: a.0.to_owned(),
171 post: a.1.to_owned(),
172 community: a.2.to_owned(),
173 creator: a.3.to_owned(),
174 post_creator: a.4.to_owned(),
175 resolver: a.5.to_owned(),
177 .collect::<Vec<Self>>()