summaryrefslogtreecommitdiffstats
path: root/server/src/db/mod.rs
blob: e0b7c8567c24399a407817380eb6a4d26c6778b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use diesel::*;
use diesel::dsl::*;
use diesel::result::Error;
use crate::{Settings};
use serde::{Deserialize, Serialize};

pub mod user;
pub mod community;
pub mod post;
pub mod comment;
pub mod post_view;
pub mod comment_view;
pub mod category;
pub mod community_view;
pub mod user_view;
pub mod moderator;
pub mod moderator_views;

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 ignore(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 fn establish_connection() -> PgConnection {
  let db_url = Settings::get().db_url;
  PgConnection::establish(&db_url)
    .expect(&format!("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 SearchType {
  Both, Comments, Posts
}

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)
}
#[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());
  }
}