From b869181dcff0683a71321653755fdb73d1c42a13 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matou=C5=A1=20Volf?=
 <66163112+matous-volf@users.noreply.github.com>
Date: Sun, 8 Sep 2024 08:21:48 +0200
Subject: [PATCH] feat: create a server function for deleting a project

---
 src/errors/error.rs    |  6 ++++++
 src/server/projects.rs | 14 ++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/src/errors/error.rs b/src/errors/error.rs
index 993dd7e..21e1214 100644
--- a/src/errors/error.rs
+++ b/src/errors/error.rs
@@ -7,6 +7,12 @@ pub enum Error {
     ServerInternal,
 }
 
+impl From<diesel::result::Error> for Error {
+    fn from(_: diesel::result::Error) -> Self { 
+        Self::ServerInternal 
+    }
+}
+
 // has to be implemented for Dioxus server functions
 impl Display for Error {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
diff --git a/src/server/projects.rs b/src/server/projects.rs
index 94ac3f9..0519dcd 100644
--- a/src/server/projects.rs
+++ b/src/server/projects.rs
@@ -71,3 +71,17 @@ pub(crate) async fn edit_project(project_id: i32, new_project: NewProject)
 
     Ok(updated_project)
 }
+
+#[server]
+pub(crate) async fn delete_project(project_id: i32)
+    -> Result<(), ServerFnError<ErrorVec<Error>>> {
+    use crate::schema::projects::dsl::*;
+
+    let mut connection = establish_database_connection()
+        .map_err::<ErrorVec<Error>, _>(|_| vec![Error::ServerInternal].into())?;
+
+    diesel::delete(projects.filter(id.eq(project_id))).execute(&mut connection)
+        .map_err::<ErrorVec<Error>, _>(|error| vec![error.into()].into())?;
+    
+    Ok(())
+}