rs_starter/services/
user_service.rs1use 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}