aboutsummaryrefslogtreecommitdiff
path: root/src/handlers/users.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/handlers/users.rs')
-rw-r--r--src/handlers/users.rs106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/handlers/users.rs b/src/handlers/users.rs
new file mode 100644
index 0000000..e6b0415
--- /dev/null
+++ b/src/handlers/users.rs
@@ -0,0 +1,106 @@
1use crate::models::{Member, NewMember};
2use crate::schema::members::dsl::*;
3use crate::TPool;
4
5use actix_identity::Identity;
6use actix_web::{web, HttpResponse, Responder};
7use bcrypt::{hash, verify, DEFAULT_COST};
8use diesel::prelude::*;
9use log::{error, info};
10use serde::Deserialize;
11
12pub async fn new_user(
13 pool: web::Data<TPool>,
14 item: web::Json<NewMember>,
15) -> impl Responder {
16 let conn = pool.get().unwrap();
17 let hashed_item = NewMember {
18 password: hash(&item.password, DEFAULT_COST).unwrap(),
19 ..(item.into_inner())
20 };
21 diesel::insert_into(members)
22 .values(hashed_item)
23 .execute(&conn)
24 .expect("Coundn't connect to DB");
25 HttpResponse::Ok().body("Inserted successfully!")
26}
27
28pub async fn name_exists(
29 pool: web::Data<TPool>,
30 item: String,
31) -> impl Responder {
32 let conn = pool.get().unwrap();
33 info!("target: {:?}", item);
34 if (members
35 .filter(username.eq(&item))
36 .limit(1)
37 .load::<Member>(&conn)
38 .expect("Coundn't connect to DB"))
39 .len()
40 > 0
41 {
42 HttpResponse::Ok().body("true")
43 } else {
44 HttpResponse::Ok().body("false")
45 }
46}
47
48#[derive(Deserialize)]
49pub struct Login {
50 username: String,
51 password: String,
52}
53
54pub async fn login(
55 pool: web::Data<TPool>,
56 cookie: Identity,
57 login_details: web::Json<Login>,
58) -> impl Responder {
59 info!("Login hit");
60 let conn = pool.get().unwrap();
61 let entered_pass = &login_details.password;
62 let selected_user = members
63 .filter(username.eq(&login_details.username))
64 .limit(1)
65 .first::<Member>(&conn)
66 .expect("Couldn't connect to DB");
67 let hashed_pass = selected_user.password;
68 if verify(entered_pass, &hashed_pass).unwrap() {
69 cookie.remember(login_details.username.clone());
70 info!(
71 "Successful login: {} {}",
72 selected_user.username, selected_user.email_id
73 );
74 HttpResponse::Ok().finish()
75 } else {
76 HttpResponse::Unauthorized().finish()
77 }
78}
79
80pub async fn logout(cookie: Identity) -> impl Responder {
81 cookie.forget();
82 HttpResponse::Found().header("location", "/").finish()
83}
84
85pub async fn user_details(
86 uname: web::Path<String>,
87 pool: web::Data<TPool>,
88) -> impl Responder {
89 let conn = pool.get().unwrap();
90 let uname = uname.into_inner();
91 info!("Fetching info for: \"{}\"", uname);
92 let selected_user = members
93 .filter(username.eq(&uname))
94 .limit(1)
95 .first::<Member>(&conn);
96 match selected_user {
97 Ok(m) => {
98 info!("Found user: {}", uname);
99 HttpResponse::Ok().json(m)
100 }
101 Err(_) => {
102 error!("User not found: {}", uname);
103 HttpResponse::NotFound().finish()
104 }
105 }
106}