summaryrefslogtreecommitdiff
path: root/src/types
diff options
context:
space:
mode:
Diffstat (limited to 'src/types')
-rw-r--r--src/types/comment.rs44
-rw-r--r--src/types/like.rs48
-rw-r--r--src/types/mod.rs2
-rw-r--r--src/types/post.rs38
4 files changed, 99 insertions, 33 deletions
diff --git a/src/types/comment.rs b/src/types/comment.rs
new file mode 100644
index 0000000..cf94bd3
--- /dev/null
+++ b/src/types/comment.rs
@@ -0,0 +1,44 @@
+use serde::Serialize;
+use tracing::instrument;
+
+use crate::{
+ database::{self, comments},
+ types::http::{ResponseCode, Result},
+};
+
+#[derive(Serialize)]
+pub struct Comment {
+ pub comment_id: u64,
+ pub user_id: u64,
+ pub post_id: u64,
+ pub date: u64,
+ pub content: String,
+}
+
+impl Comment {
+ #[instrument()]
+ pub fn new(user_id: u64, post_id: u64, content: &str) -> Result<Self> {
+ let Ok(comment) = comments::add_comment(user_id, post_id, content) else {
+ tracing::error!("Failed to create comment");
+ return Err(ResponseCode::InternalServerError.text("Failed to create post"))
+ };
+
+ Ok(comment)
+ }
+
+ #[instrument()]
+ pub fn from_comment_page(page: u64, post_id: u64) -> Result<Vec<Self>> {
+ let Ok(posts) = database::comments::get_comments_page(page, post_id) else {
+ return Err(ResponseCode::BadRequest.text("Failed to fetch comments"))
+ };
+ Ok(posts)
+ }
+
+ #[instrument()]
+ pub fn reterieve_all() -> Result<Vec<Self>> {
+ let Ok(posts) = database::comments::get_all_comments() else {
+ return Err(ResponseCode::InternalServerError.text("Failed to fetch comments"))
+ };
+ Ok(posts)
+ }
+}
diff --git a/src/types/like.rs b/src/types/like.rs
new file mode 100644
index 0000000..bf10b2d
--- /dev/null
+++ b/src/types/like.rs
@@ -0,0 +1,48 @@
+use serde::Serialize;
+use tracing::instrument;
+
+use crate::database;
+use crate::types::http::{ResponseCode, Result};
+
+#[derive(Serialize)]
+pub struct Like {
+ pub user_id: u64,
+ pub post_id: u64
+}
+
+impl Like {
+ #[instrument()]
+ pub fn add_liked(user_id: u64, post_id: u64) -> Result<()> {
+
+ let Ok(liked) = database::likes::add_liked(user_id, post_id) else {
+ return Err(ResponseCode::BadRequest.text("Failed to add like status"))
+ };
+
+ if !liked {
+ return Err(ResponseCode::InternalServerError.text("Failed to add like status"));
+ }
+
+ Ok(())
+ }
+
+ #[instrument()]
+ pub fn remove_liked(user_id: u64, post_id: u64) -> Result<()> {
+ let Ok(liked) = database::likes::remove_liked(user_id, post_id) else {
+ return Err(ResponseCode::BadRequest.text("Failed to remove like status"))
+ };
+
+ if !liked {
+ return Err(ResponseCode::InternalServerError.text("Failed to remove like status"));
+ }
+
+ Ok(())
+ }
+
+ #[instrument()]
+ pub fn reterieve_all() -> Result<Vec<Self>> {
+ let Ok(likes) = database::likes::get_all_likes() else {
+ return Err(ResponseCode::InternalServerError.text("Failed to fetch likes"))
+ };
+ Ok(likes)
+ }
+}
diff --git a/src/types/mod.rs b/src/types/mod.rs
index 3449d5c..1ee2d08 100644
--- a/src/types/mod.rs
+++ b/src/types/mod.rs
@@ -1,5 +1,7 @@
+pub mod comment;
pub mod extract;
pub mod http;
+pub mod like;
pub mod post;
pub mod session;
pub mod user;
diff --git a/src/types/post.rs b/src/types/post.rs
index ea7cbbf..a067512 100644
--- a/src/types/post.rs
+++ b/src/types/post.rs
@@ -1,19 +1,21 @@
use core::fmt;
use serde::Serialize;
-use std::collections::HashSet;
use tracing::instrument;
use crate::database;
use crate::types::http::{ResponseCode, Result};
+use super::comment::Comment;
+
#[derive(Serialize)]
pub struct Post {
pub post_id: u64,
pub user_id: u64,
pub content: String,
- pub likes: HashSet<u64>,
- pub comments: Vec<(u64, String)>,
pub date: u64,
+ pub likes: u64,
+ pub liked: bool,
+ pub comments: Vec<Comment>,
}
impl fmt::Debug for Post {
@@ -67,34 +69,4 @@ impl 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 {
- self.likes.insert(user_id);
- } else {
- self.likes.remove(&user_id);
- }
-
- if database::posts::update_post(self.post_id, &self.likes, &self.comments).is_err() {
- tracing::error!("Failed to change like state on post");
- return Err(
- ResponseCode::InternalServerError.text("Failed to change like state on post")
- );
- }
-
- Ok(())
- }
}