use crate::Crud;
-use diesel::{dsl::*, result::Error, *};
-use lemmy_db_schema::source::activity::*;
+use diesel::{dsl::*, result::Error, sql_types::Text, *};
+use lemmy_db_schema::{source::activity::*, Url};
use log::debug;
use serde::Serialize;
+use serde_json::Value;
use std::{
fmt::Debug,
io::{Error as IoError, ErrorKind},
) -> Result<Activity, IoError>
where
T: Serialize + Debug;
+
fn read_from_apub_id(conn: &PgConnection, object_id: &str) -> Result<Activity, Error>;
+
+ /// Returns up to 20 activities of type `Announce/Create/Page` from the community
+ fn read_community_outbox(
+ conn: &PgConnection,
+ community_actor_id: &Url,
+ ) -> Result<Vec<Value>, Error>;
}
impl Activity_ for Activity {
use lemmy_db_schema::schema::activity::dsl::*;
activity.filter(ap_id.eq(object_id)).first::<Self>(conn)
}
+
+ fn read_community_outbox(
+ conn: &PgConnection,
+ community_actor_id: &Url,
+ ) -> Result<Vec<Value>, Error> {
+ use lemmy_db_schema::schema::activity::dsl::*;
+ let res: Vec<Value> = activity
+ .select(data)
+ .filter(
+ sql("activity.data ->> 'type' = 'Announce'")
+ .sql(" AND activity.data -> 'object' ->> 'type' = 'Create'")
+ .sql(" AND activity.data -> 'object' -> 'object' ->> 'type' = 'Page'")
+ .sql(" AND activity.data ->> 'actor' = ")
+ .bind::<Text, _>(community_actor_id),
+ )
+ .limit(20)
+ .get_results(conn)?;
+ Ok(res)
+ }
}
#[cfg(test)]