summaryrefslogtreecommitdiff
path: root/src/api/auth.rs
diff options
context:
space:
mode:
authorTyler Murphy <tylermurphy534@gmail.com>2023-01-26 17:29:16 -0500
committerTyler Murphy <tylermurphy534@gmail.com>2023-01-26 17:29:16 -0500
commit88209d88236c3d865a9f5174a0dced31920859bf (patch)
tree89a9985927393005cf632950b585a6a227b1c679 /src/api/auth.rs
downloadxssbook-88209d88236c3d865a9f5174a0dced31920859bf.tar.gz
xssbook-88209d88236c3d865a9f5174a0dced31920859bf.tar.bz2
xssbook-88209d88236c3d865a9f5174a0dced31920859bf.zip
i did things
Diffstat (limited to 'src/api/auth.rs')
-rw-r--r--src/api/auth.rs98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/api/auth.rs b/src/api/auth.rs
new file mode 100644
index 0000000..d60483f
--- /dev/null
+++ b/src/api/auth.rs
@@ -0,0 +1,98 @@
+use axum::{Router, routing::post, response::Response};
+use serde::Deserialize;
+use time::{OffsetDateTime, Duration};
+use tower_cookies::{Cookies, Cookie};
+
+use crate::types::{user::User, response::ResponseCode, session::Session, extract::{Json, AuthorizedUser}};
+
+#[derive(Deserialize)]
+struct RegistrationRequet {
+ firstname: String,
+ lastname: String,
+ email: String,
+ password: String,
+ gender: String,
+ day: u8,
+ month: u8,
+ year: u32
+}
+
+
+async fn register(cookies: Cookies, Json(body): Json<RegistrationRequet>) -> Response {
+
+ let user = match User::new(body.firstname, body.lastname, body.email, body.password, body.gender, body.day, body.month, body.year) {
+ Ok(user) => user,
+ Err(err) => return err
+ };
+
+ let session = match Session::new(user.user_id) {
+ Ok(session) => session,
+ Err(err) => return err
+ };
+
+ let mut now = OffsetDateTime::now_utc();
+ now += Duration::weeks(52);
+
+ let mut cookie = Cookie::new("auth", session.token);
+ cookie.set_secure(false);
+ cookie.set_http_only(false);
+ cookie.set_expires(now);
+ cookie.set_path("/");
+
+ cookies.add(cookie);
+
+ ResponseCode::Created.msg("Successfully created new user")
+}
+
+#[derive(Deserialize)]
+struct LoginRequest {
+ email: String,
+ password: String,
+}
+
+async fn login(cookies: Cookies, Json(body): Json<LoginRequest>) -> Response {
+
+ let Ok(user) = User::from_email(&body.email) else {
+ return ResponseCode::BadRequest.msg("Email is not registered")
+ };
+
+ if user.password != body.password {
+ return ResponseCode::BadRequest.msg("Password is not correct")
+ }
+
+ let session = match Session::new(user.user_id) {
+ Ok(session) => session,
+ Err(err) => return err
+ };
+
+ let mut now = OffsetDateTime::now_utc();
+ now += Duration::weeks(52);
+
+ let mut cookie = Cookie::new("auth", session.token);
+ cookie.set_secure(false);
+ cookie.set_http_only(false);
+ cookie.set_expires(now);
+ cookie.set_path("/");
+
+ cookies.add(cookie);
+
+ ResponseCode::Success.msg("Successfully logged in")
+}
+
+async fn logout(cookies: Cookies, AuthorizedUser(user): AuthorizedUser) -> Response {
+
+ cookies.remove(Cookie::new("auth", ""));
+
+ if let Err(err) = Session::delete(user.user_id) {
+ return err
+ }
+
+ ResponseCode::Success.msg("Successfully logged out")
+}
+
+pub fn router() -> Router {
+ Router::new()
+ .route("/register", post(register))
+ .route("/login", post(login))
+ .route("/logout", post(logout))
+} \ No newline at end of file