浏览代码

Create logout route.

Lee Morgan 1 年之前
父节点
当前提交
e5522c4240
共有 3 个文件被更改,包括 29 次插入5 次删除
  1. 11 0
      bruno/Suma/User/Logout.bru
  2. 15 4
      src/controllers/user.rs
  3. 3 1
      src/routes/user.rs

+ 11 - 0
bruno/Suma/User/Logout.bru

@@ -0,0 +1,11 @@
+meta {
+  name: Logout
+  type: http
+  seq: 3
+}
+
+get {
+  url: http://localhost:8000/api/user/logout
+  body: none
+  auth: inherit
+}

+ 15 - 4
src/controllers/user.rs

@@ -1,4 +1,4 @@
-use actix_web::{post, web, HttpResponse, cookie::Cookie};
+use actix_web::{get, post, web, HttpResponse, cookie::Cookie};
 use mongodb::{bson::doc, Database, Collection};
 use crate::models::user::{User, NewUserInput};
 use regex::Regex;
@@ -28,10 +28,16 @@ pub async fn login_route(
     let email = payload.email.to_lowercase();
     let user = User::find_by_email(&user_collection, &email).await?;
     validate_password(&user, &payload.password_hash, &payload.password_salt)?;
-    let cookie = create_user_cookie(user._id.unwrap().to_string());
+    let cookie = create_user_cookie(Some(user._id.unwrap().to_string()));
     Ok(HttpResponse::Ok().cookie(cookie).json(response_user(user)))
 }
 
+#[get("/api/user/logout")]
+pub async fn logout_route() -> Result<HttpResponse, AppError> {
+    let cookie = create_user_cookie(None);
+    Ok(HttpResponse::Ok().cookie(cookie).json(json!({"success": true})))
+}
+
 fn valid_email(email: &str) -> Result<(), AppError> {
     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();
 
@@ -57,8 +63,13 @@ fn validate_password(user: &User, hash: &str, salt: &str) -> Result<(), AppError
     Ok(())
 }
 
-fn create_user_cookie(id: String) -> Cookie<'static> {
-    Cookie::build("user", id)
+fn create_user_cookie(id: Option<String>) -> Cookie<'static> {
+    let id_string = match id {
+        Some(i) => i,
+        None => "".to_string()
+    };
+
+    Cookie::build("user", id_string)
         .path("/")
         .http_only(true)
         .finish()

+ 3 - 1
src/routes/user.rs

@@ -1,10 +1,12 @@
 use actix_web::web;
 use crate::controllers::user::{
     create_route,
-    login_route
+    login_route,
+    logout_route
 };
 
 pub fn config(cfg: &mut web::ServiceConfig) {
     cfg.service(create_route);
     cfg.service(login_route);
+    cfg.service(logout_route);
 }