refactor: make the serverside error handling more robust
This commit is contained in:
		| @@ -3,10 +3,10 @@ use diesel::prelude::*; | ||||
| use dotenvy::dotenv; | ||||
| use std::env; | ||||
|  | ||||
| pub(crate) fn establish_database_connection() -> PgConnection { | ||||
| pub(crate) fn establish_database_connection() -> ConnectionResult<PgConnection> { | ||||
|     dotenv().ok(); | ||||
|  | ||||
|     let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); | ||||
|     let database_url = | ||||
|         env::var("DATABASE_URL").expect("The environment variable DATABASE_URL must be set."); | ||||
|     PgConnection::establish(&database_url) | ||||
|         .unwrap_or_else(|_| panic!("error connecting to {}", database_url)) | ||||
| } | ||||
|   | ||||
| @@ -1,21 +1,33 @@ | ||||
| use crate::errors::error::Error; | ||||
| use crate::errors::error_vec::ErrorVec; | ||||
| use crate::errors::project_create_error::ProjectCreateError; | ||||
| use crate::models::project::{NewProject, Project}; | ||||
| use crate::server::database_connection::establish_database_connection; | ||||
| use diesel::{RunQueryDsl, SelectableHelper}; | ||||
| use dioxus::prelude::*; | ||||
| use validator::Validate; | ||||
|  | ||||
| #[server] | ||||
| pub(crate) async fn create_project(title: String) -> Result<Project, ServerFnError> { | ||||
| pub(crate) async fn create_project( | ||||
|     new_project: NewProject, | ||||
| ) -> Result<Project, ServerFnError<ErrorVec<ProjectCreateError>>> { | ||||
|     use crate::schema::projects; | ||||
|  | ||||
|     let mut connection = establish_database_connection(); | ||||
|     new_project | ||||
|         .validate() | ||||
|         .map_err::<ErrorVec<ProjectCreateError>, _>(|errors| errors.into())?; | ||||
|  | ||||
|     let new_project = NewProject { | ||||
|         title: title.as_str(), | ||||
|     }; | ||||
|     let mut connection = | ||||
|         establish_database_connection().or::<ErrorVec<ProjectCreateError>>(Err(vec![ | ||||
|             ProjectCreateError::Error(Error::ServerInternal), | ||||
|         ] | ||||
|         .into()))?; | ||||
|  | ||||
|     Ok(diesel::insert_into(projects::table) | ||||
|     let new_project = diesel::insert_into(projects::table) | ||||
|         .values(&new_project) | ||||
|         .returning(Project::as_returning()) | ||||
|         .get_result(&mut connection) | ||||
|         .expect("error saving a new project")) | ||||
|         .expect("error saving a new project"); | ||||
|  | ||||
|     Ok(new_project) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user