X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fdb_schema%2Fsrc%2Flib.rs;h=e3232c402e3feb42ab4ddfbb87700eee47d9f822;hb=9a5a13c734a1792511e1bfef7b9ac4121e0e7371;hp=5388d37c2b8a172d76e7213ddde81a4906d444e1;hpb=166ec196b02d82115ab178588604f4a780d0c135;p=lemmy.git diff --git a/crates/db_schema/src/lib.rs b/crates/db_schema/src/lib.rs index 5388d37c..e3232c40 100644 --- a/crates/db_schema/src/lib.rs +++ b/crates/db_schema/src/lib.rs @@ -1,42 +1,63 @@ +#![recursion_limit = "256"] + +#[cfg(feature = "full")] #[macro_use] extern crate diesel; +#[cfg(feature = "full")] #[macro_use] extern crate diesel_derive_newtype; + +#[cfg(feature = "full")] +#[macro_use] +extern crate diesel_derive_enum; + // this is used in tests -#[allow(unused_imports)] +#[cfg(feature = "full")] #[macro_use] extern crate diesel_migrations; + +#[cfg(feature = "full")] #[macro_use] -extern crate strum_macros; +extern crate async_trait; pub mod aggregates; +#[cfg(feature = "full")] pub mod impls; pub mod newtypes; +#[cfg(feature = "full")] +#[rustfmt::skip] +#[allow(clippy::wildcard_imports)] pub mod schema; +#[cfg(feature = "full")] +pub mod aliases { + use crate::schema::person; + diesel::alias!(person as person1: Person1, person as person2: Person2); +} pub mod source; +#[cfg(feature = "full")] pub mod traits; +#[cfg(feature = "full")] +pub mod utils; -pub type DbPool = diesel::r2d2::Pool>; - -use crate::newtypes::DbUrl; -use chrono::NaiveDateTime; -use diesel::{Connection, PgConnection}; -use lemmy_utils::LemmyError; -use once_cell::sync::Lazy; -use regex::Regex; use serde::{Deserialize, Serialize}; -use std::{env, env::VarError}; -use url::Url; - -pub fn get_database_url_from_env() -> Result { - env::var("LEMMY_DATABASE_URL") -} - -#[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy)] +use strum_macros::{Display, EnumString}; +#[cfg(feature = "full")] +use ts_rs::TS; + +#[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "full", derive(DbEnum, TS))] +#[cfg_attr( + feature = "full", + ExistingTypePath = "crate::schema::sql_types::SortTypeEnum" +)] +#[cfg_attr(feature = "full", DbValueStyle = "verbatim")] +#[cfg_attr(feature = "full", ts(export))] +/// The post sort types. See here for descriptions: https://join-lemmy.org/docs/en/users/03-votes-and-ranking.html pub enum SortType { Active, Hot, New, + Old, TopDay, TopWeek, TopMonth, @@ -44,17 +65,80 @@ pub enum SortType { TopAll, MostComments, NewComments, + TopHour, + TopSixHour, + TopTwelveHour, + TopThreeMonths, + TopSixMonths, + TopNineMonths, + Controversial, } #[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// The comment sort types. See here for descriptions: https://join-lemmy.org/docs/en/users/03-votes-and-ranking.html +pub enum CommentSortType { + Hot, + Top, + New, + Old, + Controversial, +} + +#[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// The person sort types. See here for descriptions: https://join-lemmy.org/docs/en/users/03-votes-and-ranking.html +pub enum PersonSortType { + New, + Old, + MostComments, + CommentScore, + PostScore, + PostCount, +} + +#[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "full", derive(DbEnum, TS))] +#[cfg_attr( + feature = "full", + ExistingTypePath = "crate::schema::sql_types::ListingTypeEnum" +)] +#[cfg_attr(feature = "full", DbValueStyle = "verbatim")] +#[cfg_attr(feature = "full", ts(export))] +/// A listing type for post and comment list fetches. pub enum ListingType { + /// Content from your own site, as well as all connected / federated sites. All, + /// Content from your site only. Local, + /// Content only from communities you've subscribed to. Subscribed, - Community, +} + +#[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "full", derive(DbEnum, TS))] +#[cfg_attr( + feature = "full", + ExistingTypePath = "crate::schema::sql_types::RegistrationModeEnum" +)] +#[cfg_attr(feature = "full", DbValueStyle = "verbatim")] +#[cfg_attr(feature = "full", ts(export))] +/// The registration mode for your site. Determines what happens after a user signs up. +pub enum RegistrationMode { + /// Closed to public. + Closed, + /// Open, but pending approval of a registration application. + RequireApplication, + /// Open to all. + Open, } #[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// The type of content returned from a search. pub enum SearchType { All, Comments, @@ -64,134 +148,49 @@ pub enum SearchType { Url, } -pub fn from_opt_str_to_opt_enum(opt: &Option) -> Option { - opt.as_ref().map(|t| T::from_str(t).ok()).flatten() -} - -pub fn fuzzy_search(q: &str) -> String { - let replaced = q.replace("%", "\\%").replace("_", "\\_").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) -} - -pub fn is_email_regex(test: &str) -> bool { - EMAIL_REGEX.is_match(test) -} - -pub fn diesel_option_overwrite(opt: &Option) -> Option> { - match opt { - // An empty string is an erase - Some(unwrapped) => { - if !unwrapped.eq("") { - Some(Some(unwrapped.to_owned())) - } else { - Some(None) - } - } - None => None, - } -} - -pub fn diesel_option_overwrite_to_url( - opt: &Option, -) -> Result>, LemmyError> { - match opt.as_ref().map(|s| s.as_str()) { - // An empty string is an erase - Some("") => Ok(Some(None)), - Some(str_url) => match Url::parse(str_url) { - Ok(url) => Ok(Some(Some(url.into()))), - Err(e) => Err(LemmyError::from_error_message(e, "invalid_url")), - }, - None => Ok(None), - } -} - -embed_migrations!(); - -pub fn establish_unpooled_connection() -> PgConnection { - let db_url = match get_database_url_from_env() { - Ok(url) => url, - Err(e) => panic!( - "Failed to read database URL from env var LEMMY_DATABASE_URL: {}", - e - ), - }; - let conn = - PgConnection::establish(&db_url).unwrap_or_else(|_| panic!("Error connecting to {}", db_url)); - embedded_migrations::run(&conn).expect("load migrations"); - conn -} - -pub fn naive_now() -> NaiveDateTime { - chrono::prelude::Utc::now().naive_utc() +#[derive(EnumString, Display, Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Copy)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// A type / status for a community subscribe. +pub enum SubscribedType { + Subscribed, + NotSubscribed, + Pending, } -static EMAIL_REGEX: Lazy = Lazy::new(|| { - Regex::new(r"^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$") - .expect("compile email regex") -}); - -pub mod functions { - use diesel::sql_types::*; - - sql_function! { - fn hot_rank(score: BigInt, time: Timestamp) -> Integer; - } - - sql_function!(fn lower(x: Text) -> Text); +#[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// A list of possible types for the various modlog actions. +pub enum ModlogActionType { + All, + ModRemovePost, + ModLockPost, + ModFeaturePost, + ModRemoveComment, + ModRemoveCommunity, + ModBanFromCommunity, + ModAddCommunity, + ModTransferCommunity, + ModAdd, + ModBan, + ModHideCommunity, + AdminPurgePerson, + AdminPurgeCommunity, + AdminPurgePost, + AdminPurgeComment, } -#[cfg(test)] -mod tests { - use super::{fuzzy_search, *}; - use crate::is_email_regex; - - #[test] - fn test_fuzzy_search() { - let test = "This %is% _a_ fuzzy search"; - assert_eq!( - fuzzy_search(test), - "%This%\\%is\\%%\\_a\\_%fuzzy%search%".to_string() - ); - } - - #[test] - fn test_email() { - assert!(is_email_regex("gush@gmail.com")); - assert!(!is_email_regex("nada_neutho")); - } - - #[test] - fn test_diesel_option_overwrite() { - assert_eq!(diesel_option_overwrite(&None), None); - assert_eq!(diesel_option_overwrite(&Some("".to_string())), Some(None)); - assert_eq!( - diesel_option_overwrite(&Some("test".to_string())), - Some(Some("test".to_string())) - ); - } - - #[test] - fn test_diesel_option_overwrite_to_url() { - assert!(matches!(diesel_option_overwrite_to_url(&None), Ok(None))); - assert!(matches!( - diesel_option_overwrite_to_url(&Some("".to_string())), - Ok(Some(None)) - )); - assert!(matches!( - diesel_option_overwrite_to_url(&Some("invalid_url".to_string())), - Err(_) - )); - let example_url = "https://example.com"; - assert!(matches!( - diesel_option_overwrite_to_url(&Some(example_url.to_string())), - Ok(Some(Some(url))) if url == Url::parse(example_url).unwrap().into() - )); - } +#[derive( + EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, +)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +/// The feature type for a post. +pub enum PostFeatureType { + #[default] + /// Features to the top of your site. + Local, + /// Features to the top of the community. + Community, }