use crate::errors::error::Error; use crate::errors::error_vec::ErrorVec; use crate::errors::project_error::ProjectError; use crate::models::project::{NewProject, Project}; #[cfg(feature = "server")] use crate::server::database_connection::establish_database_connection; #[cfg(feature = "server")] use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper}; use dioxus::prelude::*; #[cfg(feature = "server")] use validator::Validate; #[server] pub(crate) async fn create_project( new_project: NewProject, ) -> Result>> { use crate::schema::projects; // TODO: replace with model sanitization (https://github.com/matous-volf/todo-baggins/issues/13) let mut new_project = new_project; new_project.title = new_project.title.trim().to_owned(); new_project .validate() .map_err::, _>(|errors| errors.into())?; let mut connection = establish_database_connection().map_err::, _>(|_| { vec![ProjectError::Error(Error::ServerInternal)].into() })?; let new_project = diesel::insert_into(projects::table) .values(&new_project) .returning(Project::as_returning()) .get_result(&mut connection) .map_err::, _>(|error| vec![error.into()].into())?; Ok(new_project) } #[server] pub(crate) async fn get_projects() -> Result, ServerFnError>> { use crate::schema::projects::dsl::*; let mut connection = establish_database_connection() .map_err::, _>(|_| vec![Error::ServerInternal].into())?; let results = projects .select(Project::as_select()) .load::(&mut connection) .map_err::, _>(|_| vec![Error::ServerInternal].into())?; Ok(results) } #[server] pub(crate) async fn edit_project( project_id: i32, new_project: NewProject, ) -> Result>> { use crate::schema::projects::dsl::*; // TODO: replace with model sanitization (https://github.com/matous-volf/todo-baggins/issues/13) let mut new_project = new_project; new_project.title = new_project.title.trim().to_owned(); new_project .validate() .map_err::, _>(|errors| errors.into())?; let mut connection = establish_database_connection().map_err::, _>(|_| { vec![ProjectError::Error(Error::ServerInternal)].into() })?; let updated_project = diesel::update(projects) .filter(id.eq(project_id)) .set(title.eq(new_project.title)) .returning(Project::as_returning()) .get_result(&mut connection) .map_err::, _>(|error| vec![error.into()].into())?; Ok(updated_project) } // TODO: Get rid of this suppression. //noinspection DuplicatedCode #[server] pub(crate) async fn delete_project(project_id: i32) -> Result<(), ServerFnError>> { use crate::schema::projects::dsl::*; let mut connection = establish_database_connection() .map_err::, _>(|_| vec![Error::ServerInternal].into())?; diesel::delete(projects.filter(id.eq(project_id))) .execute(&mut connection) .map_err::, _>(|error| vec![error.into()].into())?; Ok(()) }