|
|
@ -1,9 +1,9 @@ |
|
|
|
extern crate diesel; |
|
|
|
use schema::{post, post_like}; |
|
|
|
use schema::{post, post_like, post_saved, post_read}; |
|
|
|
use diesel::*; |
|
|
|
use diesel::result::Error; |
|
|
|
use serde::{Deserialize, Serialize}; |
|
|
|
use {Crud, Likeable}; |
|
|
|
use {Crud, Likeable, Saveable, Readable}; |
|
|
|
|
|
|
|
#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] |
|
|
|
#[table_name="post"] |
|
|
@ -14,8 +14,8 @@ pub struct Post { |
|
|
|
pub body: Option<String>, |
|
|
|
pub creator_id: i32, |
|
|
|
pub community_id: i32, |
|
|
|
pub removed: Option<bool>, |
|
|
|
pub locked: Option<bool>, |
|
|
|
pub removed: bool, |
|
|
|
pub locked: bool, |
|
|
|
pub published: chrono::NaiveDateTime, |
|
|
|
pub updated: Option<chrono::NaiveDateTime> |
|
|
|
} |
|
|
@ -28,30 +28,11 @@ pub struct PostForm { |
|
|
|
pub body: Option<String>, |
|
|
|
pub creator_id: i32, |
|
|
|
pub community_id: i32, |
|
|
|
pub removed: Option<bool>, |
|
|
|
pub locked: Option<bool>, |
|
|
|
pub removed: bool, |
|
|
|
pub locked: bool, |
|
|
|
pub updated: Option<chrono::NaiveDateTime> |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] |
|
|
|
#[belongs_to(Post)] |
|
|
|
#[table_name = "post_like"] |
|
|
|
pub struct PostLike { |
|
|
|
pub id: i32, |
|
|
|
pub post_id: i32, |
|
|
|
pub user_id: i32, |
|
|
|
pub score: i16, |
|
|
|
pub published: chrono::NaiveDateTime, |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Insertable, AsChangeset, Clone)] |
|
|
|
#[table_name="post_like"] |
|
|
|
pub struct PostLikeForm { |
|
|
|
pub post_id: i32, |
|
|
|
pub user_id: i32, |
|
|
|
pub score: i16 |
|
|
|
} |
|
|
|
|
|
|
|
impl Crud<PostForm> for Post { |
|
|
|
fn read(conn: &PgConnection, post_id: i32) -> Result<Self, Error> { |
|
|
|
use schema::post::dsl::*; |
|
|
@ -80,6 +61,25 @@ impl Crud<PostForm> for Post { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] |
|
|
|
#[belongs_to(Post)] |
|
|
|
#[table_name = "post_like"] |
|
|
|
pub struct PostLike { |
|
|
|
pub id: i32, |
|
|
|
pub post_id: i32, |
|
|
|
pub user_id: i32, |
|
|
|
pub score: i16, |
|
|
|
pub published: chrono::NaiveDateTime, |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Insertable, AsChangeset, Clone)] |
|
|
|
#[table_name="post_like"] |
|
|
|
pub struct PostLikeForm { |
|
|
|
pub post_id: i32, |
|
|
|
pub user_id: i32, |
|
|
|
pub score: i16 |
|
|
|
} |
|
|
|
|
|
|
|
impl Likeable <PostLikeForm> for PostLike { |
|
|
|
fn read(conn: &PgConnection, post_id_from: i32) -> Result<Vec<Self>, Error> { |
|
|
|
use schema::post_like::dsl::*; |
|
|
@ -102,6 +102,72 @@ impl Likeable <PostLikeForm> for PostLike { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] |
|
|
|
#[belongs_to(Post)] |
|
|
|
#[table_name = "post_saved"] |
|
|
|
pub struct PostSaved { |
|
|
|
pub id: i32, |
|
|
|
pub post_id: i32, |
|
|
|
pub user_id: i32, |
|
|
|
pub published: chrono::NaiveDateTime, |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Insertable, AsChangeset, Clone)] |
|
|
|
#[table_name="post_saved"] |
|
|
|
pub struct PostSavedForm { |
|
|
|
pub post_id: i32, |
|
|
|
pub user_id: i32, |
|
|
|
} |
|
|
|
|
|
|
|
impl Saveable <PostSavedForm> for PostSaved { |
|
|
|
fn save(conn: &PgConnection, post_saved_form: &PostSavedForm) -> Result<Self, Error> { |
|
|
|
use schema::post_saved::dsl::*; |
|
|
|
insert_into(post_saved) |
|
|
|
.values(post_saved_form) |
|
|
|
.get_result::<Self>(conn) |
|
|
|
} |
|
|
|
fn unsave(conn: &PgConnection, post_saved_form: &PostSavedForm) -> Result<usize, Error> { |
|
|
|
use schema::post_saved::dsl::*; |
|
|
|
diesel::delete(post_saved |
|
|
|
.filter(post_id.eq(post_saved_form.post_id)) |
|
|
|
.filter(user_id.eq(post_saved_form.user_id))) |
|
|
|
.execute(conn) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] |
|
|
|
#[belongs_to(Post)] |
|
|
|
#[table_name = "post_read"] |
|
|
|
pub struct PostRead { |
|
|
|
pub id: i32, |
|
|
|
pub post_id: i32, |
|
|
|
pub user_id: i32, |
|
|
|
pub published: chrono::NaiveDateTime, |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Insertable, AsChangeset, Clone)] |
|
|
|
#[table_name="post_read"] |
|
|
|
pub struct PostReadForm { |
|
|
|
pub post_id: i32, |
|
|
|
pub user_id: i32, |
|
|
|
} |
|
|
|
|
|
|
|
impl Readable <PostReadForm> for PostRead { |
|
|
|
fn mark_as_read(conn: &PgConnection, post_read_form: &PostReadForm) -> Result<Self, Error> { |
|
|
|
use schema::post_read::dsl::*; |
|
|
|
insert_into(post_read) |
|
|
|
.values(post_read_form) |
|
|
|
.get_result::<Self>(conn) |
|
|
|
} |
|
|
|
fn mark_as_unread(conn: &PgConnection, post_read_form: &PostReadForm) -> Result<usize, Error> { |
|
|
|
use schema::post_read::dsl::*; |
|
|
|
diesel::delete(post_read |
|
|
|
.filter(post_id.eq(post_read_form.post_id)) |
|
|
|
.filter(user_id.eq(post_read_form.user_id))) |
|
|
|
.execute(conn) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#[cfg(test)] |
|
|
|
mod tests { |
|
|
|
use establish_connection; |
|
|
@ -132,7 +198,7 @@ mod tests { |
|
|
|
description: None, |
|
|
|
category_id: 1, |
|
|
|
creator_id: inserted_user.id, |
|
|
|
removed: None, |
|
|
|
removed: false, |
|
|
|
updated: None |
|
|
|
}; |
|
|
|
|
|
|
@ -144,8 +210,8 @@ mod tests { |
|
|
|
body: None, |
|
|
|
creator_id: inserted_user.id, |
|
|
|
community_id: inserted_community.id, |
|
|
|
removed: None, |
|
|
|
locked: None, |
|
|
|
removed: false, |
|
|
|
locked: false, |
|
|
|
updated: None |
|
|
|
}; |
|
|
|
|
|
|
@ -159,11 +225,12 @@ mod tests { |
|
|
|
creator_id: inserted_user.id, |
|
|
|
community_id: inserted_community.id, |
|
|
|
published: inserted_post.published, |
|
|
|
removed: Some(false), |
|
|
|
locked: Some(false), |
|
|
|
removed: false, |
|
|
|
locked: false, |
|
|
|
updated: None |
|
|
|
}; |
|
|
|
|
|
|
|
// Post Like
|
|
|
|
let post_like_form = PostLikeForm { |
|
|
|
post_id: inserted_post.id, |
|
|
|
user_id: inserted_user.id, |
|
|
@ -179,10 +246,42 @@ mod tests { |
|
|
|
published: inserted_post_like.published, |
|
|
|
score: 1 |
|
|
|
}; |
|
|
|
|
|
|
|
// Post Save
|
|
|
|
let post_saved_form = PostSavedForm { |
|
|
|
post_id: inserted_post.id, |
|
|
|
user_id: inserted_user.id, |
|
|
|
}; |
|
|
|
|
|
|
|
let inserted_post_saved = PostSaved::save(&conn, &post_saved_form).unwrap(); |
|
|
|
|
|
|
|
let expected_post_saved = PostSaved { |
|
|
|
id: inserted_post_saved.id, |
|
|
|
post_id: inserted_post.id, |
|
|
|
user_id: inserted_user.id, |
|
|
|
published: inserted_post_saved.published, |
|
|
|
}; |
|
|
|
|
|
|
|
// Post Read
|
|
|
|
let post_read_form = PostReadForm { |
|
|
|
post_id: inserted_post.id, |
|
|
|
user_id: inserted_user.id, |
|
|
|
}; |
|
|
|
|
|
|
|
let inserted_post_read = PostRead::mark_as_read(&conn, &post_read_form).unwrap(); |
|
|
|
|
|
|
|
let expected_post_read = PostRead { |
|
|
|
id: inserted_post_read.id, |
|
|
|
post_id: inserted_post.id, |
|
|
|
user_id: inserted_user.id, |
|
|
|
published: inserted_post_read.published, |
|
|
|
}; |
|
|
|
|
|
|
|
let read_post = Post::read(&conn, inserted_post.id).unwrap(); |
|
|
|
let updated_post = Post::update(&conn, inserted_post.id, &new_post).unwrap(); |
|
|
|
let like_removed = PostLike::remove(&conn, &post_like_form).unwrap(); |
|
|
|
let saved_removed = PostSaved::unsave(&conn, &post_saved_form).unwrap(); |
|
|
|
let read_removed = PostRead::mark_as_unread(&conn, &post_read_form).unwrap(); |
|
|
|
let num_deleted = Post::delete(&conn, inserted_post.id).unwrap(); |
|
|
|
Community::delete(&conn, inserted_community.id).unwrap(); |
|
|
|
User_::delete(&conn, inserted_user.id).unwrap(); |
|
|
@ -191,7 +290,11 @@ mod tests { |
|
|
|
assert_eq!(expected_post, inserted_post); |
|
|
|
assert_eq!(expected_post, updated_post); |
|
|
|
assert_eq!(expected_post_like, inserted_post_like); |
|
|
|
assert_eq!(expected_post_saved, inserted_post_saved); |
|
|
|
assert_eq!(expected_post_read, inserted_post_read); |
|
|
|
assert_eq!(1, like_removed); |
|
|
|
assert_eq!(1, saved_removed); |
|
|
|
assert_eq!(1, read_removed); |
|
|
|
assert_eq!(1, num_deleted); |
|
|
|
|
|
|
|
} |
|
|
|