use schema::{community, community_moderator, community_follower, community_user_ban, site}; use super::*; #[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] #[table_name="community"] pub struct Community { pub id: i32, pub name: String, pub title: String, pub description: Option, pub category_id: i32, pub creator_id: i32, pub removed: bool, pub published: chrono::NaiveDateTime, pub updated: Option, pub deleted: bool, } #[derive(Insertable, AsChangeset, Clone, Serialize, Deserialize)] #[table_name="community"] pub struct CommunityForm { pub name: String, pub title: String, pub description: Option, pub category_id: i32, pub creator_id: i32, pub removed: Option, pub updated: Option, pub deleted: Option, } impl Crud for Community { fn read(conn: &PgConnection, community_id: i32) -> Result { use schema::community::dsl::*; community.find(community_id) .first::(conn) } fn delete(conn: &PgConnection, community_id: i32) -> Result { use schema::community::dsl::*; diesel::delete(community.find(community_id)) .execute(conn) } fn create(conn: &PgConnection, new_community: &CommunityForm) -> Result { use schema::community::dsl::*; insert_into(community) .values(new_community) .get_result::(conn) } fn update(conn: &PgConnection, community_id: i32, new_community: &CommunityForm) -> Result { use schema::community::dsl::*; diesel::update(community.find(community_id)) .set(new_community) .get_result::(conn) } } impl Community { pub fn read_from_name(conn: &PgConnection, community_name: String) -> Result { use schema::community::dsl::*; community.filter(name.eq(community_name)) .first::(conn) } } #[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] #[belongs_to(Community)] #[table_name = "community_moderator"] pub struct CommunityModerator { pub id: i32, pub community_id: i32, pub user_id: i32, pub published: chrono::NaiveDateTime, } #[derive(Insertable, AsChangeset, Clone)] #[table_name="community_moderator"] pub struct CommunityModeratorForm { pub community_id: i32, pub user_id: i32, } impl Joinable for CommunityModerator { fn join(conn: &PgConnection, community_user_form: &CommunityModeratorForm) -> Result { use schema::community_moderator::dsl::*; insert_into(community_moderator) .values(community_user_form) .get_result::(conn) } fn leave(conn: &PgConnection, community_user_form: &CommunityModeratorForm) -> Result { use schema::community_moderator::dsl::*; diesel::delete(community_moderator .filter(community_id.eq(community_user_form.community_id)) .filter(user_id.eq(community_user_form.user_id))) .execute(conn) } } #[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] #[belongs_to(Community)] #[table_name = "community_user_ban"] pub struct CommunityUserBan { pub id: i32, pub community_id: i32, pub user_id: i32, pub published: chrono::NaiveDateTime, } #[derive(Insertable, AsChangeset, Clone)] #[table_name="community_user_ban"] pub struct CommunityUserBanForm { pub community_id: i32, pub user_id: i32, } impl Bannable for CommunityUserBan { fn ban(conn: &PgConnection, community_user_ban_form: &CommunityUserBanForm) -> Result { use schema::community_user_ban::dsl::*; insert_into(community_user_ban) .values(community_user_ban_form) .get_result::(conn) } fn unban(conn: &PgConnection, community_user_ban_form: &CommunityUserBanForm) -> Result { use schema::community_user_ban::dsl::*; diesel::delete(community_user_ban .filter(community_id.eq(community_user_ban_form.community_id)) .filter(user_id.eq(community_user_ban_form.user_id))) .execute(conn) } } #[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] #[belongs_to(Community)] #[table_name = "community_follower"] pub struct CommunityFollower { pub id: i32, pub community_id: i32, pub user_id: i32, pub published: chrono::NaiveDateTime, } #[derive(Insertable, AsChangeset, Clone)] #[table_name="community_follower"] pub struct CommunityFollowerForm { pub community_id: i32, pub user_id: i32, } impl Followable for CommunityFollower { fn follow(conn: &PgConnection, community_follower_form: &CommunityFollowerForm) -> Result { use schema::community_follower::dsl::*; insert_into(community_follower) .values(community_follower_form) .get_result::(conn) } fn ignore(conn: &PgConnection, community_follower_form: &CommunityFollowerForm) -> Result { use schema::community_follower::dsl::*; diesel::delete(community_follower .filter(community_id.eq(&community_follower_form.community_id)) .filter(user_id.eq(&community_follower_form.user_id))) .execute(conn) } } #[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] #[table_name="site"] pub struct Site { pub id: i32, pub name: String, pub description: Option, pub creator_id: i32, pub published: chrono::NaiveDateTime, pub updated: Option } #[derive(Insertable, AsChangeset, Clone, Serialize, Deserialize)] #[table_name="site"] pub struct SiteForm { pub name: String, pub description: Option, pub creator_id: i32, pub updated: Option } impl Crud for Site { fn read(conn: &PgConnection, _site_id: i32) -> Result { use schema::site::dsl::*; site.first::(conn) } fn delete(conn: &PgConnection, site_id: i32) -> Result { use schema::site::dsl::*; diesel::delete(site.find(site_id)) .execute(conn) } fn create(conn: &PgConnection, new_site: &SiteForm) -> Result { use schema::site::dsl::*; insert_into(site) .values(new_site) .get_result::(conn) } fn update(conn: &PgConnection, site_id: i32, new_site: &SiteForm) -> Result { use schema::site::dsl::*; diesel::update(site.find(site_id)) .set(new_site) .get_result::(conn) } } #[cfg(test)] mod tests { use super::*; use super::super::user::*; #[test] fn test_crud() { let conn = establish_connection(); let new_user = UserForm { name: "bobbee".into(), fedi_name: "rrf".into(), preferred_username: None, password_encrypted: "nope".into(), email: None, admin: false, banned: false, updated: None }; let inserted_user = User_::create(&conn, &new_user).unwrap(); let new_community = CommunityForm { name: "TIL".into(), creator_id: inserted_user.id, title: "nada".to_owned(), description: None, category_id: 1, removed: None, deleted: None, updated: None, }; let inserted_community = Community::create(&conn, &new_community).unwrap(); let expected_community = Community { id: inserted_community.id, creator_id: inserted_user.id, name: "TIL".into(), title: "nada".to_owned(), description: None, category_id: 1, removed: false, deleted: false, published: inserted_community.published, updated: None }; let community_follower_form = CommunityFollowerForm { community_id: inserted_community.id, user_id: inserted_user.id }; let inserted_community_follower = CommunityFollower::follow(&conn, &community_follower_form).unwrap(); let expected_community_follower = CommunityFollower { id: inserted_community_follower.id, community_id: inserted_community.id, user_id: inserted_user.id, published: inserted_community_follower.published }; let community_user_form = CommunityModeratorForm { community_id: inserted_community.id, user_id: inserted_user.id }; let inserted_community_user = CommunityModerator::join(&conn, &community_user_form).unwrap(); let expected_community_user = CommunityModerator { id: inserted_community_user.id, community_id: inserted_community.id, user_id: inserted_user.id, published: inserted_community_user.published }; let community_user_ban_form = CommunityUserBanForm { community_id: inserted_community.id, user_id: inserted_user.id }; let inserted_community_user_ban = CommunityUserBan::ban(&conn, &community_user_ban_form).unwrap(); let expected_community_user_ban = CommunityUserBan { id: inserted_community_user_ban.id, community_id: inserted_community.id, user_id: inserted_user.id, published: inserted_community_user_ban.published }; let read_community = Community::read(&conn, inserted_community.id).unwrap(); let updated_community = Community::update(&conn, inserted_community.id, &new_community).unwrap(); let ignored_community = CommunityFollower::ignore(&conn, &community_follower_form).unwrap(); let left_community = CommunityModerator::leave(&conn, &community_user_form).unwrap(); let unban = CommunityUserBan::unban(&conn, &community_user_ban_form).unwrap(); let num_deleted = Community::delete(&conn, inserted_community.id).unwrap(); User_::delete(&conn, inserted_user.id).unwrap(); assert_eq!(expected_community, read_community); assert_eq!(expected_community, inserted_community); assert_eq!(expected_community, updated_community); assert_eq!(expected_community_follower, inserted_community_follower); assert_eq!(expected_community_user, inserted_community_user); assert_eq!(expected_community_user_ban, inserted_community_user_ban); assert_eq!(1, ignored_community); assert_eq!(1, left_community); assert_eq!(1, unban); // assert_eq!(2, loaded_count); assert_eq!(1, num_deleted); } }