diff options
Diffstat (limited to 'src/handlers/users.rs')
-rw-r--r-- | src/handlers/users.rs | 106 |
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 @@ | |||
1 | use crate::models::{Member, NewMember}; | ||
2 | use crate::schema::members::dsl::*; | ||
3 | use crate::TPool; | ||
4 | |||
5 | use actix_identity::Identity; | ||
6 | use actix_web::{web, HttpResponse, Responder}; | ||
7 | use bcrypt::{hash, verify, DEFAULT_COST}; | ||
8 | use diesel::prelude::*; | ||
9 | use log::{error, info}; | ||
10 | use serde::Deserialize; | ||
11 | |||
12 | pub 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 | |||
28 | pub 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)] | ||
49 | pub struct Login { | ||
50 | username: String, | ||
51 | password: String, | ||
52 | } | ||
53 | |||
54 | pub 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 | |||
80 | pub async fn logout(cookie: Identity) -> impl Responder { | ||
81 | cookie.forget(); | ||
82 | HttpResponse::Found().header("location", "/").finish() | ||
83 | } | ||
84 | |||
85 | pub 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 | } | ||