diff options
Diffstat (limited to 'server/lemmy_db/src/lib.rs')
-rw-r--r-- | server/lemmy_db/src/lib.rs | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/server/lemmy_db/src/lib.rs b/server/lemmy_db/src/lib.rs new file mode 100644 index 00000000..b34919cd --- /dev/null +++ b/server/lemmy_db/src/lib.rs @@ -0,0 +1,194 @@ +#[macro_use] +pub extern crate diesel; +#[macro_use] +pub extern crate strum_macros; +pub extern crate bcrypt; +pub extern crate chrono; +pub extern crate log; +pub extern crate serde; +pub extern crate serde_json; +pub extern crate sha2; +pub extern crate strum; + +use chrono::NaiveDateTime; +use diesel::{dsl::*, result::Error, *}; +use serde::{Deserialize, Serialize}; +use std::{env, env::VarError}; + +pub mod activity; +pub mod category; +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 schema; +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<T> { + fn create(conn: &PgConnection, form: &T) -> Result<Self, Error> + where + Self: Sized; + fn read(conn: &PgConnection, id: i32) -> Result<Self, Error> + where + Self: Sized; + fn update(conn: &PgConnection, id: i32, form: &T) -> Result<Self, Error> + where + Self: Sized; + fn delete(conn: &PgConnection, id: i32) -> Result<usize, Error> + where + Self: Sized; +} + +pub trait Followable<T> { + fn follow(conn: &PgConnection, form: &T) -> Result<Self, Error> + where + Self: Sized; + fn unfollow(conn: &PgConnection, form: &T) -> Result<usize, Error> + where + Self: Sized; +} + +pub trait Joinable<T> { + fn join(conn: &PgConnection, form: &T) -> Result<Self, Error> + where + Self: Sized; + fn leave(conn: &PgConnection, form: &T) -> Result<usize, Error> + where + Self: Sized; +} + +pub trait Likeable<T> { + fn read(conn: &PgConnection, id: i32) -> Result<Vec<Self>, Error> + where + Self: Sized; + fn like(conn: &PgConnection, form: &T) -> Result<Self, Error> + where + Self: Sized; + fn remove(conn: &PgConnection, form: &T) -> Result<usize, Error> + where + Self: Sized; +} + +pub trait Bannable<T> { + fn ban(conn: &PgConnection, form: &T) -> Result<Self, Error> + where + Self: Sized; + fn unban(conn: &PgConnection, form: &T) -> Result<usize, Error> + where + Self: Sized; +} + +pub trait Saveable<T> { + fn save(conn: &PgConnection, form: &T) -> Result<Self, Error> + where + Self: Sized; + fn unsave(conn: &PgConnection, form: &T) -> Result<usize, Error> + where + Self: Sized; +} + +pub trait Readable<T> { + fn mark_as_read(conn: &PgConnection, form: &T) -> Result<Self, Error> + where + Self: Sized; + fn mark_as_unread(conn: &PgConnection, form: &T) -> Result<usize, Error> + where + Self: Sized; +} + +pub trait MaybeOptional<T> { + fn get_optional(self) -> Option<T>; +} + +impl<T> MaybeOptional<T> for T { + fn get_optional(self) -> Option<T> { + Some(self) + } +} + +impl<T> MaybeOptional<T> for Option<T> { + fn get_optional(self) -> Option<T> { + self + } +} + +pub fn get_database_url_from_env() -> Result<String, VarError> { + env::var("LEMMY_DATABASE_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<i64>, limit: Option<i64>) -> (i64, i64) { + let page = page.unwrap_or(1); + let limit = limit.unwrap_or(10); + let offset = limit * (page - 1); + (limit, offset) +} + +pub fn naive_now() -> NaiveDateTime { + chrono::prelude::Utc::now().naive_utc() +} + +#[cfg(test)] +mod tests { + use super::fuzzy_search; + use crate::get_database_url_from_env; + use diesel::{Connection, PgConnection}; + + pub fn establish_unpooled_connection() -> PgConnection { + let db_url = match get_database_url_from_env() { + Ok(url) => url, + Err(_) => panic!("Failed to read database URL from env var LEMMY_DATABASE_URL"), + }; + PgConnection::establish(&db_url).unwrap_or_else(|_| panic!("Error connecting to {}", db_url)) + } + + #[test] + fn test_fuzzy_search() { + let test = "This is a fuzzy search"; + assert_eq!(fuzzy_search(test), "%This%is%a%fuzzy%search%".to_string()); + } +} |