Browse Source

Create helper function for handling http errors.

Lee Morgan 1 year ago
parent
commit
fd75ef52c8
4 changed files with 33 additions and 8 deletions
  1. 1 1
      bruno/Suma/User/Create.bru
  2. 7 7
      src/controllers/user.rs
  3. 24 0
      src/http_error.rs
  4. 1 0
      src/main.rs

+ 1 - 1
bruno/Suma/User/Create.bru

@@ -12,7 +12,7 @@ post {
 
 body:json {
   {
-    "email": "lee.morgan@blacklist.aero",
+    "email": "lee@leemorgan.dev",
     "password_hash": "something",
     "password_salt": "Something else"
   }

+ 7 - 7
src/controllers/user.rs

@@ -1,7 +1,8 @@
-use actix_web::{post, web, HttpResponse, Responder};
+use actix_web::{post, web, HttpResponse, Responder, http::StatusCode};
 use mongodb::{bson::doc, Database};
 use crate::models::user::{User, NewUserInput};
 use regex::Regex;
+use crate::http_error::http_error;
 
 #[post("/api/user")]
 pub async fn create(
@@ -13,20 +14,19 @@ pub async fn create(
     let email_regex: Regex = Regex::new(r#"^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}(\.[0-9]{1,3}){3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$"#).unwrap();
 
     if !email_regex.is_match(&email) {
-        return HttpResponse::BadRequest().body("Invalid email");
+        return http_error(StatusCode::BAD_REQUEST, "Invalid email");
     }
 
     match user_collection.find_one(doc!{"email": email}, None).await {
         Ok(None) => {},
-        Ok(Some(_)) => return HttpResponse::BadRequest().body("User with this email already exists"),
-        Err(_) => return HttpResponse::InternalServerError().body("Internal server error")
-    }
+        Ok(Some(_)) => return http_error(StatusCode::BAD_REQUEST, "User with this email already exists"),
+        Err(_) => return http_error(StatusCode::INTERNAL_SERVER_ERROR, "Unable to verify email")
+    };
 
     match User::insert(&user_collection, payload.into_inner()).await {
         Ok(_) => HttpResponse::Ok().body("{'success': 'true'}"),
         Err(e) => {
-            eprintln!("Error: {:?}", e);
-            HttpResponse::InternalServerError().body("Failed to create user")
+            http_error(StatusCode::INTERNAL_SERVER_ERROR, "Failed to create user")
         }
     }
 }

+ 24 - 0
src/http_error.rs

@@ -0,0 +1,24 @@
+use actix_web::{HttpResponse, http::StatusCode};
+use serde::Serialize;
+
+#[derive(Serialize)]
+struct Error {
+    code: u16,
+    message: String
+}
+
+#[derive(Serialize)]
+struct HttpError {
+    error: Error
+}
+
+pub fn http_error(status: StatusCode, message: &str) -> HttpResponse {
+    let body = HttpError {
+        error: Error {
+            code: status.as_u16(),
+            message: message.to_string()
+        }
+    };
+
+    HttpResponse::build(status).json(body)
+}

+ 1 - 0
src/main.rs

@@ -5,6 +5,7 @@ use mongodb::{Client, Database};
 mod routes;
 mod models;
 mod controllers;
+mod http_error;
 
 pub static HTML: OnceLock<String> = OnceLock::new();