rs_starter/services/
user_service.rs

1use crate::{models::user_model::User, repository::mongodb_repo::MongoRepo};
2use actix_web::{ delete, get, post, put, web::{Data, Json, Path}, HttpResponse };
3use mongodb::bson::oid::ObjectId;
4
5#[post("/user")]
6pub async fn create_user(db: Data<MongoRepo>, new_user: Json<User>) -> HttpResponse {
7    let data = User {
8        id: None,
9        name: new_user.name.to_owned(),
10        location: new_user.location.to_owned(),
11        title: new_user.title.to_owned(),
12    };
13
14    let user_detail = db.create_user(data).await;
15
16    match user_detail {
17        Ok(user) => HttpResponse::Ok().json(user),
18        Err(err) => HttpResponse::InternalServerError().body(err.to_string()),
19    }
20}
21
22#[get("/user/{id}")]
23pub async fn get_user(db: Data<MongoRepo>, path: Path<String>) -> HttpResponse {
24    let id = path.into_inner();
25    if id.is_empty() {
26        return HttpResponse::BadRequest().body("invalid ID");
27    }
28    let user_detail = db.get_user(&id).await;
29
30    match user_detail {
31        Ok(user) => HttpResponse::Ok().json(user),
32        Err(err) => HttpResponse::InternalServerError().body(err.to_string()),
33    }
34}
35
36#[put("/user/{id}")]
37pub async fn update_user(
38    db: Data<MongoRepo>,
39    path: Path<String>,
40    new_user: Json<User>,
41) -> HttpResponse {
42    let id = path.into_inner();
43    if id.is_empty() {
44        return HttpResponse::BadRequest().body("invalid ID");
45    };
46    let data = User {
47        id: Some(ObjectId::parse_str(&id).unwrap()),
48        name: new_user.name.to_owned(),
49        location: new_user.location.to_owned(),
50        title: new_user.title.to_owned(),
51    };
52
53    let update_result = db.update_user(&id, data).await;
54
55    match update_result {
56        Ok(update) => {
57            if update.matched_count == 1 {
58                let updated_user_info = db.get_user(&id).await;
59
60                return match updated_user_info {
61                    Ok(user) => HttpResponse::Ok().json(user),
62                    Err(err) => HttpResponse::InternalServerError().body(err.to_string()),
63                };
64            } else {
65                return HttpResponse::NotFound().body("No user found with specified ID");
66            }
67        }
68        Err(err) => HttpResponse::InternalServerError().body(err.to_string()),
69    }
70}
71
72#[delete("/user/{id}")]
73pub async fn delete_user(db: Data<MongoRepo>, path: Path<String>) -> HttpResponse {
74    let id = path.into_inner();
75    if id.is_empty() {
76        return HttpResponse::BadRequest().body("invalid ID");
77    };
78    let result = db.delete_user(&id).await;
79
80    match result {
81        Ok(res) => {
82            if res.deleted_count == 1 {
83                return HttpResponse::Ok().json("User successfully deleted!");
84            } else {
85                return HttpResponse::NotFound().json("User with specified ID not found!");
86            }
87        }
88        Err(err) => HttpResponse::InternalServerError().body(err.to_string()),
89    }
90}
91
92#[get("/users")]
93pub async fn get_all_users(db: Data<MongoRepo>) -> HttpResponse {
94    let users = db.get_all_users().await;
95
96    match users {
97        Ok(users) => HttpResponse::Ok().json(users),
98        Err(err) => HttpResponse::InternalServerError().body(err.to_string()),
99    }
100}