Federate comments
This commit is contained in:
parent
a3d73cb2c4
commit
a436f2da4b
2
migrations/2018-05-10-101553_posts_add_ap_url/down.sql
Normal file
2
migrations/2018-05-10-101553_posts_add_ap_url/down.sql
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
-- This file should undo anything in `up.sql`
|
||||||
|
ALTER TABLE posts DROP COLUMN ap_url;
|
2
migrations/2018-05-10-101553_posts_add_ap_url/up.sql
Normal file
2
migrations/2018-05-10-101553_posts_add_ap_url/up.sql
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
-- Your SQL goes here
|
||||||
|
ALTER TABLE posts ADD COLUMN ap_url VARCHAR NOT NULL DEFAULT '';
|
@ -5,6 +5,7 @@ use activity_pub::activity;
|
|||||||
use activity_pub::actor::Actor;
|
use activity_pub::actor::Actor;
|
||||||
use activity_pub::sign::*;
|
use activity_pub::sign::*;
|
||||||
use models::blogs::Blog;
|
use models::blogs::Blog;
|
||||||
|
use models::comments::*;
|
||||||
use models::follows::{Follow, NewFollow};
|
use models::follows::{Follow, NewFollow};
|
||||||
use models::posts::{Post, NewPost};
|
use models::posts::{Post, NewPost};
|
||||||
use models::users::User;
|
use models::users::User;
|
||||||
@ -18,14 +19,29 @@ pub trait Inbox: Actor + Sized {
|
|||||||
match act["object"]["type"].as_str().unwrap() {
|
match act["object"]["type"].as_str().unwrap() {
|
||||||
"Article" => {
|
"Article" => {
|
||||||
Post::insert(conn, NewPost {
|
Post::insert(conn, NewPost {
|
||||||
blog_id: 0,
|
blog_id: 0, // TODO
|
||||||
slug: String::from(""),
|
slug: String::from(""), // TODO
|
||||||
title: String::from(""),
|
title: String::from(""), // TODO
|
||||||
content: act["object"]["content"].as_str().unwrap().to_string(),
|
content: act["object"]["content"].as_str().unwrap().to_string(),
|
||||||
published: true,
|
published: true,
|
||||||
license: String::from("CC-0")
|
license: String::from("CC-0"),
|
||||||
|
ap_url: act["object"]["url"].as_str().unwrap().to_string()
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
"Note" => {
|
||||||
|
let previous_comment = Comment::get_by_ap_url(conn, act["object"]["inReplyTo"].as_str().unwrap().to_string());
|
||||||
|
Comment::insert(conn, NewComment {
|
||||||
|
content: act["object"]["content"].as_str().unwrap().to_string(),
|
||||||
|
spoiler_text: act["object"]["summary"].as_str().unwrap_or("").to_string(),
|
||||||
|
ap_url: Some(act["object"]["id"].as_str().unwrap().to_string()),
|
||||||
|
in_response_to_id: previous_comment.clone().map(|c| c.id),
|
||||||
|
post_id: previous_comment
|
||||||
|
.map(|c| c.post_id)
|
||||||
|
.unwrap_or(Post::get_by_ap_url(conn, act["object"]["inReplyTo"].as_str().unwrap().to_string()).unwrap().id),
|
||||||
|
author_id: User::from_url(conn, act["actor"].as_str().unwrap().to_string()).unwrap().id,
|
||||||
|
sensitive: act["object"]["sensitive"].as_bool().unwrap_or(false)
|
||||||
|
});
|
||||||
|
}
|
||||||
x => println!("Received a new {}, but didn't saved it", x)
|
x => println!("Received a new {}, but didn't saved it", x)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -4,7 +4,7 @@ use diesel::{self, PgConnection, RunQueryDsl, QueryDsl, ExpressionMethods};
|
|||||||
use models::users::User;
|
use models::users::User;
|
||||||
use schema::comments;
|
use schema::comments;
|
||||||
|
|
||||||
#[derive(Queryable, Identifiable, Serialize)]
|
#[derive(Queryable, Identifiable, Serialize, Clone)]
|
||||||
pub struct Comment {
|
pub struct Comment {
|
||||||
pub id: i32,
|
pub id: i32,
|
||||||
pub content: String,
|
pub content: String,
|
||||||
@ -51,6 +51,14 @@ impl Comment {
|
|||||||
.expect("Error loading comment by post id")
|
.expect("Error loading comment by post id")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_by_ap_url(conn: &PgConnection, ap_url: String) -> Option<Comment> {
|
||||||
|
comments::table.filter(comments::ap_url.eq(ap_url))
|
||||||
|
.limit(1)
|
||||||
|
.load::<Comment>(conn)
|
||||||
|
.expect("Error loading comment by AP URL")
|
||||||
|
.into_iter().nth(0)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_author(&self, conn: &PgConnection) -> User {
|
pub fn get_author(&self, conn: &PgConnection) -> User {
|
||||||
User::get(conn, self.author_id).unwrap()
|
User::get(conn, self.author_id).unwrap()
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,8 @@ pub struct Post {
|
|||||||
pub content: String,
|
pub content: String,
|
||||||
pub published: bool,
|
pub published: bool,
|
||||||
pub license: String,
|
pub license: String,
|
||||||
pub creation_date: NaiveDateTime
|
pub creation_date: NaiveDateTime,
|
||||||
|
pub ap_url: String
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Insertable)]
|
#[derive(Insertable)]
|
||||||
@ -32,7 +33,8 @@ pub struct NewPost {
|
|||||||
pub title: String,
|
pub title: String,
|
||||||
pub content: String,
|
pub content: String,
|
||||||
pub published: bool,
|
pub published: bool,
|
||||||
pub license: String
|
pub license: String,
|
||||||
|
pub ap_url: String
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Post {
|
impl Post {
|
||||||
@ -59,6 +61,14 @@ impl Post {
|
|||||||
.into_iter().nth(0)
|
.into_iter().nth(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_by_ap_url(conn: &PgConnection, ap_url: String) -> Option<Post> {
|
||||||
|
posts::table.filter(posts::ap_url.eq(ap_url))
|
||||||
|
.limit(1)
|
||||||
|
.load::<Post>(conn)
|
||||||
|
.expect("Error loading post by AP URL")
|
||||||
|
.into_iter().nth(0)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_authors(&self, conn: &PgConnection) -> Vec<User> {
|
pub fn get_authors(&self, conn: &PgConnection) -> Vec<User> {
|
||||||
use schema::users;
|
use schema::users;
|
||||||
use schema::post_authors;
|
use schema::post_authors;
|
||||||
@ -74,6 +84,14 @@ impl Post {
|
|||||||
.expect("Couldn't load blog associted to post")
|
.expect("Couldn't load blog associted to post")
|
||||||
.into_iter().nth(0).unwrap()
|
.into_iter().nth(0).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn update_ap_url(&self, conn: &PgConnection) {
|
||||||
|
if self.ap_url.len() == 0 {
|
||||||
|
diesel::update(self)
|
||||||
|
.set(posts::ap_url.eq(self.compute_id(conn)))
|
||||||
|
.get_result::<Post>(conn).expect("Couldn't update AP URL");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Object for Post {
|
impl Object for Post {
|
||||||
|
@ -72,8 +72,10 @@ fn create(blog_name: String, data: Form<NewPostForm>, user: User, conn: DbConn)
|
|||||||
title: form.title.to_string(),
|
title: form.title.to_string(),
|
||||||
content: form.content.to_string(),
|
content: form.content.to_string(),
|
||||||
published: true,
|
published: true,
|
||||||
license: form.license.to_string()
|
license: form.license.to_string(),
|
||||||
|
ap_url: "".to_string()
|
||||||
});
|
});
|
||||||
|
post.update_ap_url(&*conn);
|
||||||
PostAuthor::insert(&*conn, NewPostAuthor {
|
PostAuthor::insert(&*conn, NewPostAuthor {
|
||||||
post_id: post.id,
|
post_id: post.id,
|
||||||
author_id: user.id
|
author_id: user.id
|
||||||
|
@ -74,6 +74,7 @@ table! {
|
|||||||
published -> Bool,
|
published -> Bool,
|
||||||
license -> Varchar,
|
license -> Varchar,
|
||||||
creation_date -> Timestamp,
|
creation_date -> Timestamp,
|
||||||
|
ap_url -> Varchar,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user