use crate::settings::Settings; use diesel::dsl::*; use diesel::result::Error; use diesel::*; use serde::{Deserialize, Serialize}; pub mod activity; pub mod category; pub mod code_migrations; pub mod comment; pub mod comment_view; pub mod community; pub mod community_view; pub mod moderator; pub mod moderator_views; pub mod password_reset_request; pub mod post; pub mod post_view; pub mod private_message; pub mod private_message_view; pub mod site; pub mod site_view; pub mod user; pub mod user_mention; pub mod user_mention_view; pub mod user_view; pub trait Crud { fn create(conn: &PgConnection, form: &T) -> Result where Self: Sized; fn read(conn: &PgConnection, id: i32) -> Result where Self: Sized; fn update(conn: &PgConnection, id: i32, form: &T) -> Result where Self: Sized; fn delete(conn: &PgConnection, id: i32) -> Result where Self: Sized; } pub trait Followable { fn follow(conn: &PgConnection, form: &T) -> Result where Self: Sized; fn ignore(conn: &PgConnection, form: &T) -> Result where Self: Sized; } pub trait Joinable { fn join(conn: &PgConnection, form: &T) -> Result where Self: Sized; fn leave(conn: &PgConnection, form: &T) -> Result where Self: Sized; } pub trait Likeable { fn read(conn: &PgConnection, id: i32) -> Result, Error> where Self: Sized; fn like(conn: &PgConnection, form: &T) -> Result where Self: Sized; fn remove(conn: &PgConnection, form: &T) -> Result where Self: Sized; } pub trait Bannable { fn ban(conn: &PgConnection, form: &T) -> Result where Self: Sized; fn unban(conn: &PgConnection, form: &T) -> Result where Self: Sized; } pub trait Saveable { fn save(conn: &PgConnection, form: &T) -> Result where Self: Sized; fn unsave(conn: &PgConnection, form: &T) -> Result where Self: Sized; } pub trait Readable { fn mark_as_read(conn: &PgConnection, form: &T) -> Result where Self: Sized; fn mark_as_unread(conn: &PgConnection, form: &T) -> Result where Self: Sized; } pub trait MaybeOptional { fn get_optional(self) -> Option; } impl MaybeOptional for T { fn get_optional(self) -> Option { Some(self) } } impl MaybeOptional for Option { fn get_optional(self) -> Option { self } } pub fn establish_unpooled_connection() -> PgConnection { let db_url = Settings::get().get_database_url(); PgConnection::establish(&db_url).unwrap_or_else(|_| panic!("Error connecting to {}", db_url)) } #[derive(EnumString, ToString, Debug, Serialize, Deserialize)] pub enum SortType { Hot, New, TopDay, TopWeek, TopMonth, TopYear, TopAll, } #[derive(EnumString, ToString, Debug, Serialize, Deserialize)] pub enum ListingType { All, Subscribed, Community, } #[derive(EnumString, ToString, Debug, Serialize, Deserialize)] pub enum SearchType { All, Comments, Posts, Communities, Users, Url, } pub fn fuzzy_search(q: &str) -> String { let replaced = q.replace(" ", "%"); format!("%{}%", replaced) } pub fn limit_and_offset(page: Option, limit: Option) -> (i64, i64) { let page = page.unwrap_or(1); let limit = limit.unwrap_or(10); let offset = limit * (page - 1); (limit, offset) } #[cfg(test)] mod tests { use super::fuzzy_search; #[test] fn test_fuzzy_search() { let test = "This is a fuzzy search"; assert_eq!(fuzzy_search(test), "%This%is%a%fuzzy%search%".to_string()); } }