From 80aef61aed29d25099835ee4769bb8e1e363eb47 Mon Sep 17 00:00:00 2001 From: nutomic Date: Fri, 10 Jul 2020 18:15:41 +0000 Subject: Split code into cargo workspaces (#67) More fixes - fixed docker builds - fixed mentions regex test - fixed DATABASE_URL stuff - change schema path in diesel.toml Address review comments - add jsonb column back into activity table - remove authors field from cargo.toml - adjust LEMMY_DATABASE_URL env var usage - rename all occurences of LEMMY_DATABASE_URL to DATABASE_URL Decouple utils and db Split code into cargo workspaces Co-authored-by: Felix Ableitner Reviewed-on: https://yerbamate.dev/LemmyNet/lemmy/pulls/67 --- server/lemmy_db/src/private_message.rs | 192 +++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 server/lemmy_db/src/private_message.rs (limited to 'server/lemmy_db/src/private_message.rs') diff --git a/server/lemmy_db/src/private_message.rs b/server/lemmy_db/src/private_message.rs new file mode 100644 index 00000000..1c0b455f --- /dev/null +++ b/server/lemmy_db/src/private_message.rs @@ -0,0 +1,192 @@ +use crate::{schema::private_message, Crud}; +use diesel::{dsl::*, result::Error, *}; +use serde::{Deserialize, Serialize}; + +#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] +#[table_name = "private_message"] +pub struct PrivateMessage { + pub id: i32, + pub creator_id: i32, + pub recipient_id: i32, + pub content: String, + pub deleted: bool, + pub read: bool, + pub published: chrono::NaiveDateTime, + pub updated: Option, + pub ap_id: String, + pub local: bool, +} + +#[derive(Insertable, AsChangeset, Clone)] +#[table_name = "private_message"] +pub struct PrivateMessageForm { + pub creator_id: i32, + pub recipient_id: i32, + pub content: String, + pub deleted: Option, + pub read: Option, + pub published: Option, + pub updated: Option, + pub ap_id: String, + pub local: bool, +} + +impl Crud for PrivateMessage { + fn read(conn: &PgConnection, private_message_id: i32) -> Result { + use crate::schema::private_message::dsl::*; + private_message.find(private_message_id).first::(conn) + } + + fn delete(conn: &PgConnection, private_message_id: i32) -> Result { + use crate::schema::private_message::dsl::*; + diesel::delete(private_message.find(private_message_id)).execute(conn) + } + + fn create(conn: &PgConnection, private_message_form: &PrivateMessageForm) -> Result { + use crate::schema::private_message::dsl::*; + insert_into(private_message) + .values(private_message_form) + .get_result::(conn) + } + + fn update( + conn: &PgConnection, + private_message_id: i32, + private_message_form: &PrivateMessageForm, + ) -> Result { + use crate::schema::private_message::dsl::*; + diesel::update(private_message.find(private_message_id)) + .set(private_message_form) + .get_result::(conn) + } +} + +impl PrivateMessage { + pub fn update_ap_id( + conn: &PgConnection, + private_message_id: i32, + apub_id: String, + ) -> Result { + use crate::schema::private_message::dsl::*; + + diesel::update(private_message.find(private_message_id)) + .set(ap_id.eq(apub_id)) + .get_result::(conn) + } + + pub fn read_from_apub_id(conn: &PgConnection, object_id: &str) -> Result { + use crate::schema::private_message::dsl::*; + private_message + .filter(ap_id.eq(object_id)) + .first::(conn) + } +} + +#[cfg(test)] +mod tests { + use crate::{ + private_message::*, + tests::establish_unpooled_connection, + user::*, + ListingType, + SortType, + }; + + #[test] + fn test_crud() { + let conn = establish_unpooled_connection(); + + let creator_form = UserForm { + name: "creator_pm".into(), + preferred_username: None, + password_encrypted: "nope".into(), + email: None, + matrix_user_id: None, + avatar: None, + admin: false, + banned: false, + updated: None, + show_nsfw: false, + theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, + lang: "browser".into(), + show_avatars: true, + send_notifications_to_email: false, + actor_id: "http://fake.com".into(), + bio: None, + local: true, + private_key: None, + public_key: None, + last_refreshed_at: None, + }; + + let inserted_creator = User_::create(&conn, &creator_form).unwrap(); + + let recipient_form = UserForm { + name: "recipient_pm".into(), + preferred_username: None, + password_encrypted: "nope".into(), + email: None, + matrix_user_id: None, + avatar: None, + admin: false, + banned: false, + updated: None, + show_nsfw: false, + theme: "darkly".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, + lang: "browser".into(), + show_avatars: true, + send_notifications_to_email: false, + actor_id: "http://fake.com".into(), + bio: None, + local: true, + private_key: None, + public_key: None, + last_refreshed_at: None, + }; + + let inserted_recipient = User_::create(&conn, &recipient_form).unwrap(); + + let private_message_form = PrivateMessageForm { + content: "A test private message".into(), + creator_id: inserted_creator.id, + recipient_id: inserted_recipient.id, + deleted: None, + read: None, + published: None, + updated: None, + ap_id: "http://fake.com".into(), + local: true, + }; + + let inserted_private_message = PrivateMessage::create(&conn, &private_message_form).unwrap(); + + let expected_private_message = PrivateMessage { + id: inserted_private_message.id, + content: "A test private message".into(), + creator_id: inserted_creator.id, + recipient_id: inserted_recipient.id, + deleted: false, + read: false, + updated: None, + published: inserted_private_message.published, + ap_id: "http://fake.com".into(), + local: true, + }; + + let read_private_message = PrivateMessage::read(&conn, inserted_private_message.id).unwrap(); + let updated_private_message = + PrivateMessage::update(&conn, inserted_private_message.id, &private_message_form).unwrap(); + let num_deleted = PrivateMessage::delete(&conn, inserted_private_message.id).unwrap(); + User_::delete(&conn, inserted_creator.id).unwrap(); + User_::delete(&conn, inserted_recipient.id).unwrap(); + + assert_eq!(expected_private_message, read_private_message); + assert_eq!(expected_private_message, updated_private_message); + assert_eq!(expected_private_message, inserted_private_message); + assert_eq!(1, num_deleted); + } +} -- cgit v1.2.3