use diesel::prelude::*; use serde::{Deserialize, Serialize}; use validator::Validate; use crate::models::category::Category; use crate::schema::tasks; const TITLE_LENGTH_MIN: u64 = 1; const TITLE_LENGTH_MAX: u64 = 255; #[derive(Queryable, Selectable, Serialize, Deserialize, Clone, Debug)] #[diesel(table_name = crate::schema::tasks)] #[diesel(check_for_backend(diesel::pg::Pg))] pub struct Task { id: i32, title: String, deadline: Option, category: Category, project_id: Option, } impl Task { pub fn id(&self) -> i32 { self.id } pub fn title(&self) -> &str { &self.title } pub fn deadline(&self) -> Option { self.deadline } pub fn category(&self) -> &Category { &self.category } pub fn project_id(&self) -> Option { self.project_id } } #[derive(Insertable, Serialize, Deserialize, Validate, Clone, Debug)] #[diesel(table_name = tasks)] pub struct NewTask { #[validate(length(min = "TITLE_LENGTH_MIN", max = "TITLE_LENGTH_MAX", code = "title_length"))] pub title: String, pub deadline: Option, pub category: Category, pub project_id: Option, } impl NewTask { pub fn new( title: String, deadline: Option, category: Category, project_id: Option, ) -> Self { Self { title, deadline, category, project_id } } }