83 lines
2.5 KiB
Rust
83 lines
2.5 KiB
Rust
use chrono::prelude::Utc;
|
|
use diesel::pg::PgConnection;
|
|
use diesel::result::Error;
|
|
use diesel::Connection;
|
|
use diesel::ExpressionMethods;
|
|
use diesel::QueryDsl;
|
|
use diesel::RunQueryDsl;
|
|
use std::env;
|
|
use std::vec::Vec;
|
|
|
|
fn establish_connection() -> PgConnection {
|
|
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL not setted");
|
|
|
|
PgConnection::establish(&database_url).expect(&format!("Error connecting to {}", database_url))
|
|
}
|
|
|
|
pub mod posts {
|
|
use crate::controllers::*;
|
|
use crate::models::{NewPost, Post};
|
|
|
|
pub const MAX_POSTS_PER_PAGE: u64 = 10;
|
|
|
|
pub fn get_posts(page: Option<u64>) -> (Vec<Post>, i64) {
|
|
use crate::schema::posts::dsl::*;
|
|
|
|
let connection = establish_connection();
|
|
let visible_posts = posts.order(created_at.desc());
|
|
let visible_posts = match page {
|
|
Some(number_page) => visible_posts
|
|
.filter(published.eq(true))
|
|
.limit(MAX_POSTS_PER_PAGE as i64)
|
|
.offset((MAX_POSTS_PER_PAGE * (number_page - 1)) as i64)
|
|
.load::<Post>(&connection)
|
|
.expect("Error loading posts"),
|
|
None => visible_posts
|
|
.load::<Post>(&connection)
|
|
.expect("Error loading posts"),
|
|
};
|
|
|
|
let number_of_posts: i64 = posts
|
|
.filter(published.eq(true))
|
|
.count()
|
|
.get_result(&connection)
|
|
.expect("Error counting the posts");
|
|
|
|
(visible_posts, number_of_posts)
|
|
}
|
|
|
|
pub fn get_post(id_number: i32) -> Result<Post, Error> {
|
|
use crate::schema::posts::dsl::*;
|
|
|
|
let connection = establish_connection();
|
|
let post = posts.find(id_number).first(&connection);
|
|
|
|
post
|
|
}
|
|
|
|
pub fn add_post(new_post: &NewPost) -> Result<Post, Error> {
|
|
use crate::schema::posts;
|
|
|
|
let connection = establish_connection();
|
|
diesel::insert_into(posts::table)
|
|
.values(new_post)
|
|
.get_result(&connection)
|
|
}
|
|
|
|
pub fn edit_post(updated_id: i32, new_post: &NewPost) -> Result<Post, Error> {
|
|
use crate::schema::posts::dsl::*;
|
|
let connection = establish_connection();
|
|
|
|
let date = Utc::now().naive_utc();
|
|
|
|
diesel::update(posts.filter(id.eq(updated_id)))
|
|
.set((
|
|
title.eq(&new_post.title),
|
|
content.eq(&new_post.content),
|
|
published.eq(&new_post.published),
|
|
updated_at.eq(&date),
|
|
))
|
|
.get_result(&connection)
|
|
}
|
|
}
|