|
|
|
@ -1,3 +1,9 @@
|
|
|
|
|
use crate::{
|
|
|
|
|
ap_url, blocklisted_emails::BlocklistedEmail, blogs::Blog, db_conn::DbConn, follows::Follow,
|
|
|
|
|
instance::*, medias::Media, notifications::Notification, post_authors::PostAuthor, posts::Post,
|
|
|
|
|
safe_string::SafeString, schema::users, search::Searcher, timeline::Timeline, Connection,
|
|
|
|
|
Error, PlumeRocket, Result, ITEMS_PER_PAGE,
|
|
|
|
|
};
|
|
|
|
|
use activitypub::{
|
|
|
|
|
activity::Delete,
|
|
|
|
|
actor::Person,
|
|
|
|
@ -14,13 +20,15 @@ use openssl::{
|
|
|
|
|
rsa::Rsa,
|
|
|
|
|
sign,
|
|
|
|
|
};
|
|
|
|
|
use plume_common::activity_pub::{
|
|
|
|
|
use plume_common::{
|
|
|
|
|
activity_pub::{
|
|
|
|
|
ap_accept_header,
|
|
|
|
|
inbox::{AsActor, AsObject, FromId},
|
|
|
|
|
sign::{gen_keypair, Signer},
|
|
|
|
|
ActivityStream, ApSignature, Id, IntoId, PublicKey, PUBLIC_VISIBILITY,
|
|
|
|
|
},
|
|
|
|
|
utils,
|
|
|
|
|
};
|
|
|
|
|
use plume_common::utils;
|
|
|
|
|
use reqwest::{
|
|
|
|
|
header::{HeaderValue, ACCEPT},
|
|
|
|
|
ClientBuilder,
|
|
|
|
@ -37,23 +45,6 @@ use std::{
|
|
|
|
|
use url::Url;
|
|
|
|
|
use webfinger::*;
|
|
|
|
|
|
|
|
|
|
use blogs::Blog;
|
|
|
|
|
use db_conn::DbConn;
|
|
|
|
|
use follows::Follow;
|
|
|
|
|
use instance::*;
|
|
|
|
|
use medias::Media;
|
|
|
|
|
use notifications::Notification;
|
|
|
|
|
use post_authors::PostAuthor;
|
|
|
|
|
use posts::Post;
|
|
|
|
|
use safe_string::SafeString;
|
|
|
|
|
use schema::users;
|
|
|
|
|
use search::Searcher;
|
|
|
|
|
use timeline::Timeline;
|
|
|
|
|
use {
|
|
|
|
|
ap_url, blocklisted_emails::BlocklistedEmail, Connection, Error, PlumeRocket, Result,
|
|
|
|
|
ITEMS_PER_PAGE,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
pub type CustomPerson = CustomObject<ApSignature, Person>;
|
|
|
|
|
|
|
|
|
|
pub enum Role {
|
|
|
|
@ -139,7 +130,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn delete(&self, conn: &Connection, searcher: &Searcher) -> Result<()> {
|
|
|
|
|
use schema::post_authors;
|
|
|
|
|
use crate::schema::post_authors;
|
|
|
|
|
|
|
|
|
|
for blog in Blog::find_for_author(conn, self)?
|
|
|
|
|
.iter()
|
|
|
|
@ -464,8 +455,8 @@ impl User {
|
|
|
|
|
.collect::<Vec<String>>())
|
|
|
|
|
}
|
|
|
|
|
fn get_activities_count(&self, conn: &Connection) -> i64 {
|
|
|
|
|
use schema::post_authors;
|
|
|
|
|
use schema::posts;
|
|
|
|
|
use crate::schema::post_authors;
|
|
|
|
|
use crate::schema::posts;
|
|
|
|
|
let posts_by_self = PostAuthor::belonging_to(self).select(post_authors::post_id);
|
|
|
|
|
posts::table
|
|
|
|
|
.filter(posts::published.eq(true))
|
|
|
|
@ -479,8 +470,8 @@ impl User {
|
|
|
|
|
conn: &Connection,
|
|
|
|
|
(min, max): (i32, i32),
|
|
|
|
|
) -> Result<Vec<serde_json::Value>> {
|
|
|
|
|
use schema::post_authors;
|
|
|
|
|
use schema::posts;
|
|
|
|
|
use crate::schema::post_authors;
|
|
|
|
|
use crate::schema::posts;
|
|
|
|
|
let posts_by_self = PostAuthor::belonging_to(self).select(post_authors::post_id);
|
|
|
|
|
let posts = posts::table
|
|
|
|
|
.filter(posts::published.eq(true))
|
|
|
|
@ -500,7 +491,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn get_followers(&self, conn: &Connection) -> Result<Vec<User>> {
|
|
|
|
|
use schema::follows;
|
|
|
|
|
use crate::schema::follows;
|
|
|
|
|
let follows = Follow::belonging_to(self).select(follows::follower_id);
|
|
|
|
|
users::table
|
|
|
|
|
.filter(users::id.eq_any(follows))
|
|
|
|
@ -509,7 +500,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn count_followers(&self, conn: &Connection) -> Result<i64> {
|
|
|
|
|
use schema::follows;
|
|
|
|
|
use crate::schema::follows;
|
|
|
|
|
let follows = Follow::belonging_to(self).select(follows::follower_id);
|
|
|
|
|
users::table
|
|
|
|
|
.filter(users::id.eq_any(follows))
|
|
|
|
@ -523,7 +514,7 @@ impl User {
|
|
|
|
|
conn: &Connection,
|
|
|
|
|
(min, max): (i32, i32),
|
|
|
|
|
) -> Result<Vec<User>> {
|
|
|
|
|
use schema::follows;
|
|
|
|
|
use crate::schema::follows;
|
|
|
|
|
let follows = Follow::belonging_to(self).select(follows::follower_id);
|
|
|
|
|
users::table
|
|
|
|
|
.filter(users::id.eq_any(follows))
|
|
|
|
@ -534,7 +525,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn get_followed(&self, conn: &Connection) -> Result<Vec<User>> {
|
|
|
|
|
use schema::follows::dsl::*;
|
|
|
|
|
use crate::schema::follows::dsl::*;
|
|
|
|
|
let f = follows.filter(follower_id.eq(self.id)).select(following_id);
|
|
|
|
|
users::table
|
|
|
|
|
.filter(users::id.eq_any(f))
|
|
|
|
@ -543,7 +534,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn count_followed(&self, conn: &Connection) -> Result<i64> {
|
|
|
|
|
use schema::follows;
|
|
|
|
|
use crate::schema::follows;
|
|
|
|
|
follows::table
|
|
|
|
|
.filter(follows::follower_id.eq(self.id))
|
|
|
|
|
.count()
|
|
|
|
@ -556,7 +547,7 @@ impl User {
|
|
|
|
|
conn: &Connection,
|
|
|
|
|
(min, max): (i32, i32),
|
|
|
|
|
) -> Result<Vec<User>> {
|
|
|
|
|
use schema::follows;
|
|
|
|
|
use crate::schema::follows;
|
|
|
|
|
let follows = follows::table
|
|
|
|
|
.filter(follows::follower_id.eq(self.id))
|
|
|
|
|
.select(follows::following_id)
|
|
|
|
@ -569,7 +560,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn is_followed_by(&self, conn: &Connection, other_id: i32) -> Result<bool> {
|
|
|
|
|
use schema::follows;
|
|
|
|
|
use crate::schema::follows;
|
|
|
|
|
follows::table
|
|
|
|
|
.filter(follows::follower_id.eq(other_id))
|
|
|
|
|
.filter(follows::following_id.eq(self.id))
|
|
|
|
@ -580,7 +571,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn is_following(&self, conn: &Connection, other_id: i32) -> Result<bool> {
|
|
|
|
|
use schema::follows;
|
|
|
|
|
use crate::schema::follows;
|
|
|
|
|
follows::table
|
|
|
|
|
.filter(follows::follower_id.eq(self.id))
|
|
|
|
|
.filter(follows::following_id.eq(other_id))
|
|
|
|
@ -591,7 +582,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn has_liked(&self, conn: &Connection, post: &Post) -> Result<bool> {
|
|
|
|
|
use schema::likes;
|
|
|
|
|
use crate::schema::likes;
|
|
|
|
|
likes::table
|
|
|
|
|
.filter(likes::post_id.eq(post.id))
|
|
|
|
|
.filter(likes::user_id.eq(self.id))
|
|
|
|
@ -602,7 +593,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn has_reshared(&self, conn: &Connection, post: &Post) -> Result<bool> {
|
|
|
|
|
use schema::reshares;
|
|
|
|
|
use crate::schema::reshares;
|
|
|
|
|
reshares::table
|
|
|
|
|
.filter(reshares::post_id.eq(post.id))
|
|
|
|
|
.filter(reshares::user_id.eq(self.id))
|
|
|
|
@ -613,7 +604,7 @@ impl User {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn is_author_in(&self, conn: &Connection, blog: &Blog) -> Result<bool> {
|
|
|
|
|
use schema::blog_authors;
|
|
|
|
|
use crate::schema::blog_authors;
|
|
|
|
|
blog_authors::table
|
|
|
|
|
.filter(blog_authors::author_id.eq(self.id))
|
|
|
|
|
.filter(blog_authors::blog_id.eq(blog.id))
|
|
|
|
@ -1033,11 +1024,13 @@ impl NewUser {
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
pub(crate) mod tests {
|
|
|
|
|
use super::*;
|
|
|
|
|
use crate::{
|
|
|
|
|
instance::{tests as instance_tests, Instance},
|
|
|
|
|
search::tests::get_searcher,
|
|
|
|
|
tests::{db, rockets},
|
|
|
|
|
Connection as Conn,
|
|
|
|
|
};
|
|
|
|
|
use diesel::Connection;
|
|
|
|
|
use instance::{tests as instance_tests, Instance};
|
|
|
|
|
use search::tests::get_searcher;
|
|
|
|
|
use tests::{db, rockets};
|
|
|
|
|
use Connection as Conn;
|
|
|
|
|
|
|
|
|
|
pub(crate) fn fill_database(conn: &Conn) -> Vec<User> {
|
|
|
|
|
instance_tests::fill_database(conn);
|
|
|
|
|