use crate::diesel::*;
use crate::schema::*;
use diesel::QueryResult;
use serde::{Deserialize, Serialize};
use diesel_async::RunQueryDsl;
type Connection = diesel_async::pooled_connection::deadpool::Object<diesel_async::AsyncPgConnection>;
#[derive(Debug, Serialize, Deserialize, Clone, Queryable, Insertable, AsChangeset, Selectable)]
#[diesel(table_name=todos, primary_key(id))]
pub struct Todo {
pub id: i32,
pub unsigned: u32,
pub text: String,
pub completed: bool,
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Queryable, Insertable, AsChangeset)]
#[diesel(table_name=todos)]
pub struct CreateTodo {
pub unsigned: u32,
pub text: String,
pub completed: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone, Queryable, Insertable, AsChangeset)]
#[diesel(table_name=todos)]
pub struct UpdateTodo {
pub unsigned: Option<u32>,
pub text: Option<String>,
pub completed: Option<bool>,
pub created_at: Option<chrono::DateTime<chrono::Utc>>,
pub updated_at: Option<chrono::DateTime<chrono::Utc>>,
}
#[derive(Debug, Serialize)]
pub struct PaginationResult<T> {
pub items: Vec<T>,
pub total_items: i64,
pub page: i64,
pub page_size: i64,
pub num_pages: i64,
}
impl Todo {
pub async fn create(db: &mut Connection, item: &CreateTodo) -> QueryResult<Self> {
use crate::schema::todos::dsl::*;
insert_into(todos).values(item).get_result::<Self>(db).await
}
pub async fn read(db: &mut Connection, param_id: i32) -> QueryResult<Self> {
use crate::schema::todos::dsl::*;
todos.filter(id.eq(param_id)).first::<Self>(db).await
}
pub async fn paginate(db: &mut Connection, page: i64, page_size: i64) -> QueryResult<PaginationResult<Self>> {
use crate::schema::todos::dsl::*;
let page_size = if page_size < 1 { 1 } else { page_size };
let total_items = todos.count().get_result(db).await?;
let items = todos.limit(page_size).offset(page * page_size).load::<Self>(db).await?;
Ok(PaginationResult {
items,
total_items,
page,
page_size,
num_pages: total_items / page_size + i64::from(total_items % page_size != 0)
})
}
pub async fn update(db: &mut Connection, param_id: i32, item: &UpdateTodo) -> QueryResult<Self> {
use crate::schema::todos::dsl::*;
diesel::update(todos.filter(id.eq(param_id))).set(item).get_result(db).await
}
pub async fn delete(db: &mut Connection, param_id: i32) -> QueryResult<usize> {
use crate::schema::todos::dsl::*;
diesel::delete(todos.filter(id.eq(param_id))).execute(db).await
}
}