From 36c72cee4a8bf02ff62a080b9daee6dba170ff89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Sun, 1 Dec 2024 22:17:38 +0300 Subject: [PATCH] user database operations --- src/database.rs | 6 +++++- src/database/interaction.rs | 2 ++ src/database/message.rs | 0 src/database/post.rs | 1 + src/database/user.rs | 33 +++++++++++++++++++++++++++++---- src/feature.rs | 4 ++++ src/feature/interaction.rs | 16 ++++++++++++++++ src/feature/message.rs | 15 +++++++++++++++ src/feature/post.rs | 0 src/feature/user.rs | 37 +++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 11 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 src/database/message.rs create mode 100644 src/feature.rs create mode 100644 src/feature/interaction.rs create mode 100644 src/feature/message.rs create mode 100644 src/feature/post.rs create mode 100644 src/feature/user.rs diff --git a/src/database.rs b/src/database.rs index 1a90ba1..4d32204 100644 --- a/src/database.rs +++ b/src/database.rs @@ -2,6 +2,9 @@ pub mod interaction; pub mod post; pub mod user; +pub type SurrealUserReturn = Result, surrealdb::Error>; +pub type SurrealCountReturn = Result, surrealdb::Error>; + use std::{sync::LazyLock, time::Duration}; use surrealdb::{ @@ -11,7 +14,7 @@ use surrealdb::{ }; use tokio::time::sleep; -use crate::DatabaseConfig; +use crate::{feature::user::User, DatabaseConfig}; static DB: LazyLock> = LazyLock::new(Surreal::init); @@ -27,6 +30,7 @@ pub async fn establish_connection() { .unwrap(); DB.use_ns(database_config.namespace).await.unwrap(); DB.use_db(database_config.database).await.unwrap(); + DB.query("DEFINE INDEX email ON TABLE user FIELDS email UNIQUE;").await.unwrap(); } pub async fn is_alive() -> bool { diff --git a/src/database/interaction.rs b/src/database/interaction.rs index 27785c6..e52e629 100644 --- a/src/database/interaction.rs +++ b/src/database/interaction.rs @@ -2,3 +2,5 @@ async fn create_interaction() {} async fn read_interaction() {} async fn update_interaction() {} async fn delete_interaction() {} +async fn count_interactions_of_a_user() {} +async fn count_interactions_of_a_post() {} \ No newline at end of file diff --git a/src/database/message.rs b/src/database/message.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/database/post.rs b/src/database/post.rs index c017687..9120766 100644 --- a/src/database/post.rs +++ b/src/database/post.rs @@ -2,3 +2,4 @@ async fn create_post() {} async fn read_post() {} async fn update_post() {} async fn delete_post() {} +async fn count_posts_of_a_user() {} diff --git a/src/database/user.rs b/src/database/user.rs index 49a8bbd..0b315e6 100644 --- a/src/database/user.rs +++ b/src/database/user.rs @@ -1,4 +1,29 @@ -async fn create_user() {} -async fn read_user() {} -async fn update_user() {} -async fn delete_user() {} + +use crate::feature::user::User; + +use super::{SurrealCountReturn, SurrealUserReturn, DB}; + + +pub async fn create_user(user:User) -> SurrealUserReturn { + DB.create("user").content(user).await +} + +pub async fn read_user(email: &String) -> SurrealUserReturn{ + DB.select(("user", email)).await +} + +pub async fn update_user(target_user_email: &String, user: User) -> SurrealUserReturn{ + DB.update(("user", target_user_email)).content(user).await +} +pub async fn delete_user(email: &String) -> SurrealUserReturn { + DB.delete(("user", email)).await +} +pub async fn count_users() -> SurrealCountReturn{ + DB.query("SELECT count() FROM user GROUP BY count;").await?.take("count") +} +pub async fn count_male_users() -> SurrealCountReturn{ + DB.query("SELECT count() FROM user WHERE gender = true GROUP BY count;").await?.take("count") +} +pub async fn count_female_users() -> SurrealCountReturn{ + DB.query("SELECT count() FROM user WHERE gender = false GROUP BY count;").await?.take("count") +} \ No newline at end of file diff --git a/src/feature.rs b/src/feature.rs new file mode 100644 index 0000000..f1bfc73 --- /dev/null +++ b/src/feature.rs @@ -0,0 +1,4 @@ +pub mod user; +pub mod message; +pub mod post; +pub mod interaction; \ No newline at end of file diff --git a/src/feature/interaction.rs b/src/feature/interaction.rs new file mode 100644 index 0000000..700da59 --- /dev/null +++ b/src/feature/interaction.rs @@ -0,0 +1,16 @@ +enum InteractionType { + Like, + Dislike, + Heart, + Confetti, + Plus, + Minus, + Rocket, + Smile, + Laugh, +} +struct Interaction { + post_id:String, + user_id:String, + interaction_type: InteractionType, +} \ No newline at end of file diff --git a/src/feature/message.rs b/src/feature/message.rs new file mode 100644 index 0000000..3a90109 --- /dev/null +++ b/src/feature/message.rs @@ -0,0 +1,15 @@ +pub struct Message { + pub sender_email: String, + pub receiver_email: String, + pub message: String, +} + +impl Message { + pub async fn new(sender_email: String, receiver_email: String, message: String) -> Self{ + Message { + sender_email, + receiver_email, + message, + } + } +} \ No newline at end of file diff --git a/src/feature/post.rs b/src/feature/post.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/feature/user.rs b/src/feature/user.rs new file mode 100644 index 0000000..9072467 --- /dev/null +++ b/src/feature/user.rs @@ -0,0 +1,37 @@ +use chrono::NaiveDate; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct Contact { + pub email: String, + pub phone: String, + pub website: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum Role { + User, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct User { + pub name: Vec, + pub surname: Vec, + pub gender: bool, + pub birth_date: NaiveDate, + pub email: String, + pub role: Role, +} + +impl User { + pub async fn new(name: Vec, surname: Vec, gender: bool, birth_date: NaiveDate, email: String) -> Self { + Self { + name, + surname, + gender, + birth_date, + email, + role: Role::User, + } + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 52ea8b6..99fb3d8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +pub mod feature; pub mod database; pub mod utils;