summaryrefslogtreecommitdiff
path: root/src/types
diff options
context:
space:
mode:
Diffstat (limited to 'src/types')
-rw-r--r--src/types/extract.rs3
-rw-r--r--src/types/post.rs30
-rw-r--r--src/types/response.rs9
-rw-r--r--src/types/session.rs5
-rw-r--r--src/types/user.rs8
5 files changed, 44 insertions, 11 deletions
diff --git a/src/types/extract.rs b/src/types/extract.rs
index 399fe67..69c6ed8 100644
--- a/src/types/extract.rs
+++ b/src/types/extract.rs
@@ -27,6 +27,7 @@ impl<S> FromRequestParts<S> for AuthorizedUser where S: Send + Sync {
};
let Ok(user) = User::from_user_id(session.user_id, true) else {
+ tracing::error!("Valid token but no valid user");
return Err(ResponseCode::InternalServerError.text("Valid token but no valid user"))
};
@@ -84,6 +85,7 @@ impl<T, S, B> FromRequest<S, B> for Json<T> where
async fn from_request(mut req: Request<B>, state: &S) -> Result<Self> {
let Ok(ConnectInfo(info)) = req.extract_parts::<ConnectInfo<SocketAddr>>().await else {
+ tracing::error!("Failed to read connection info");
return Err(ResponseCode::InternalServerError.text("Failed to read connection info"));
};
let method = req.method().clone();
@@ -91,6 +93,7 @@ impl<T, S, B> FromRequest<S, B> for Json<T> where
let uri = req.uri().clone();
let Ok(bytes) = Bytes::from_request(req, state).await else {
+ tracing::error!("Failed to read request body");
return Err(ResponseCode::InternalServerError.text("Failed to read request body"));
};
diff --git a/src/types/post.rs b/src/types/post.rs
index 7805a4e..7ca0a3c 100644
--- a/src/types/post.rs
+++ b/src/types/post.rs
@@ -1,5 +1,7 @@
+use core::fmt;
use std::collections::HashSet;
use serde::Serialize;
+use tracing::instrument;
use crate::database;
use crate::types::response::{Result, ResponseCode};
@@ -14,8 +16,17 @@ pub struct Post {
pub date: u64
}
+impl fmt::Debug for Post {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.debug_struct("Post")
+ .field("post_id", &self.post_id)
+ .finish()
+ }
+}
+
impl Post {
+ #[instrument()]
pub fn from_post_id(post_id: u64) -> Result<Self> {
let Ok(Some(post)) = database::posts::get_post(post_id) else {
return Err(ResponseCode::BadRequest.text("Post does not exist"))
@@ -24,15 +35,7 @@ impl Post {
Ok(post)
}
- // pub fn from_post_ids(post_ids: Vec<u64>) -> Vec<Self> {
- // post_ids.iter().map(|id| {
- // let Ok(post) = Post::from_post_id(*id) else {
- // return None;
- // };
- // Some(post)
- // }).flatten().collect()
- // }
-
+ #[instrument()]
pub fn from_post_page(page: u64) -> Result<Vec<Self>> {
let Ok(posts) = database::posts::get_post_page(page) else {
return Err(ResponseCode::BadRequest.text("Failed to fetch posts"))
@@ -40,6 +43,7 @@ impl Post {
Ok(posts)
}
+ #[instrument()]
pub fn from_user_id(user_id: u64) -> Result<Vec<Self>> {
let Ok(posts) = database::posts::get_users_posts(user_id) else {
return Err(ResponseCode::BadRequest.text("Failed to fetch posts"))
@@ -47,24 +51,29 @@ impl Post {
Ok(posts)
}
+ #[instrument()]
pub fn new(user_id: u64, content: String) -> Result<Self> {
let Ok(post) = database::posts::add_post(user_id, &content) else {
+ tracing::error!("Failed to create post");
return Err(ResponseCode::InternalServerError.text("Failed to create post"))
};
Ok(post)
}
+ #[instrument()]
pub fn comment(&mut self, user_id: u64, content: String) -> Result<()> {
self.comments.push((user_id, content));
if database::posts::update_post(self.post_id, &self.likes, &self.comments).is_err() {
+ tracing::error!("Failed to comment on post");
return Err(ResponseCode::InternalServerError.text("Failed to comment on post"))
}
Ok(())
}
+ #[instrument()]
pub fn like(&mut self, user_id: u64, state: bool) -> Result<()> {
if state {
@@ -74,7 +83,8 @@ impl Post {
}
if database::posts::update_post(self.post_id, &self.likes, &self.comments).is_err() {
- return Err(ResponseCode::InternalServerError.text("Failed to comment on post"))
+ tracing::error!("Failed to change like state on post");
+ return Err(ResponseCode::InternalServerError.text("Failed to change like state on post"))
}
Ok(())
diff --git a/src/types/response.rs b/src/types/response.rs
index 72c1334..de572b2 100644
--- a/src/types/response.rs
+++ b/src/types/response.rs
@@ -1,6 +1,7 @@
use axum::{response::{IntoResponse, Response}, http::{StatusCode, Request, HeaderValue}, body::Body, headers::HeaderName};
use tower::ServiceExt;
use tower_http::services::ServeFile;
+use tracing::instrument;
#[derive(Debug)]
pub enum ResponseCode {
@@ -15,6 +16,7 @@ pub enum ResponseCode {
}
impl ResponseCode {
+
pub fn code(self) -> StatusCode {
match self {
Self::Success => StatusCode::OK,
@@ -28,10 +30,12 @@ impl ResponseCode {
}
}
+ #[instrument()]
pub fn text(self, msg: &str) -> Response {
(self.code(), msg.to_owned()).into_response()
}
+ #[instrument()]
pub fn json(self, json: &str) -> Response {
let mut res = (self.code(), json.to_owned()).into_response();
res.headers_mut().insert(
@@ -40,6 +44,7 @@ impl ResponseCode {
res
}
+ #[instrument()]
pub fn html(self, json: &str) -> Response {
let mut res = (self.code(), json.to_owned()).into_response();
res.headers_mut().insert(
@@ -48,6 +53,7 @@ impl ResponseCode {
res
}
+ #[instrument()]
pub async fn file(self, path: &str) -> Result<Response> {
if path.chars().position(|c| c == '.' ).is_none() {
return Err(ResponseCode::BadRequest.text("Folders cannot be served"));
@@ -55,7 +61,8 @@ impl ResponseCode {
let path = format!("public{}", path);
let svc = ServeFile::new(path);
let Ok(mut res) = svc.oneshot(Request::new(Body::empty())).await else {
- return Err(ResponseCode::InternalServerError.text("Error wile fetching file"));
+ tracing::error!("Error while fetching file");
+ return Err(ResponseCode::InternalServerError.text("Error while fetching file"));
};
if res.status() != StatusCode::OK {
return Err(ResponseCode::NotFound.text("File not found"));
diff --git a/src/types/session.rs b/src/types/session.rs
index 9b949be..e05dc49 100644
--- a/src/types/session.rs
+++ b/src/types/session.rs
@@ -1,5 +1,6 @@
use rand::{distributions::Alphanumeric, Rng};
use serde::Serialize;
+use tracing::instrument;
use crate::database;
use crate::types::response::{Result, ResponseCode};
@@ -12,6 +13,7 @@ pub struct Session {
impl Session {
+ #[instrument()]
pub fn from_token(token: &str) -> Result<Self> {
let Ok(Some(session)) = database::sessions::get_session(token) else {
return Err(ResponseCode::BadRequest.text("Invalid auth token"));
@@ -20,6 +22,7 @@ impl Session {
Ok(session)
}
+ #[instrument()]
pub fn new(user_id: u64) -> Result<Self> {
let token: String = rand::thread_rng().sample_iter(&Alphanumeric).take(32).map(char::from).collect();
match database::sessions::set_session(user_id, &token) {
@@ -28,8 +31,10 @@ impl Session {
};
}
+ #[instrument()]
pub fn delete(user_id: u64) -> Result<()> {
if let Err(_) = database::sessions::delete_session(user_id) {
+ tracing::error!("Failed to logout user");
return Err(ResponseCode::InternalServerError.text("Failed to logout"));
};
Ok(())
diff --git a/src/types/user.rs b/src/types/user.rs
index 56ef467..031946a 100644
--- a/src/types/user.rs
+++ b/src/types/user.rs
@@ -1,4 +1,5 @@
use serde::{Serialize, Deserialize};
+use tracing::instrument;
use crate::database;
use crate::types::response::{Result, ResponseCode};
@@ -20,6 +21,7 @@ pub struct User {
impl User {
+ #[instrument()]
pub fn from_user_id(user_id: u64, hide_password: bool) -> Result<Self> {
let Ok(Some(user)) = database::users::get_user_by_id(user_id, hide_password) else {
return Err(ResponseCode::BadRequest.text("User does not exist"))
@@ -28,6 +30,7 @@ impl User {
Ok(user)
}
+ #[instrument()]
pub fn from_user_ids(user_ids: Vec<u64>) -> Vec<Self> {
user_ids.iter().map(|user_id| {
let Ok(Some(user)) = database::users::get_user_by_id(*user_id, true) else {
@@ -37,6 +40,7 @@ impl User {
}).flatten().collect()
}
+ #[instrument()]
pub fn from_user_page(page: u64) -> Result<Vec<Self>> {
let Ok(users) = database::users::get_user_page(page, true) else {
return Err(ResponseCode::BadRequest.text("Failed to fetch users"))
@@ -44,6 +48,7 @@ impl User {
Ok(users)
}
+ #[instrument()]
pub fn from_email(email: &str) -> Result<Self> {
let Ok(Some(user)) = database::users::get_user_by_email(email, false) else {
return Err(ResponseCode::BadRequest.text("User does not exist"))
@@ -52,6 +57,7 @@ impl User {
Ok(user)
}
+ #[instrument()]
pub fn from_password(password: &str) -> Result<Self> {
let Ok(Some(user)) = database::users::get_user_by_password(password, true) else {
return Err(ResponseCode::BadRequest.text("User does not exist"))
@@ -60,6 +66,7 @@ impl User {
Ok(user)
}
+ #[instrument()]
pub fn new(firstname: String, lastname: String, email: String, password: String, gender: String, day: u8, month: u8, year: u32) -> Result<Self> {
if let Ok(_) = User::from_email(&email) {
return Err(ResponseCode::BadRequest.text(&format!("Email is already in use by {}", &email)))
@@ -70,6 +77,7 @@ impl User {
}
let Ok(user) = database::users::add_user(&firstname, &lastname, &email, &password, &gender, day, month, year) else {
+ tracing::error!("Failed to create new user");
return Err(ResponseCode::InternalServerError.text("Failed to create new uesr"))
};