From aa9001e7d16d4917d705dfb8ae2c42adcdadbd28 Mon Sep 17 00:00:00 2001 From: Aidan Westphal Date: Fri, 29 Nov 2024 22:40:50 +0000 Subject: [PATCH] UserRow and deliberately structuring API query output --- src/api/profile.rs | 23 ++++++++++++----------- src/components.rs | 3 ++- src/components/user_row.rs | 21 +++++++++++++++++++++ src/frienddata.rs | 17 +++++++++++++++++ src/lib.rs | 1 + 5 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 src/components/user_row.rs create mode 100644 src/frienddata.rs diff --git a/src/api/profile.rs b/src/api/profile.rs index dda4473..9bf900f 100644 --- a/src/api/profile.rs +++ b/src/api/profile.rs @@ -5,7 +5,7 @@ use cfg_if::cfg_if; use crate::songdata::SongData; use crate::artistdata::ArtistData; -use crate::models::User; +use crate::frienddata::FriendData; use chrono::NaiveDateTime; @@ -303,7 +303,7 @@ pub async fn top_artists(for_user_id: i32, start_date: NaiveDateTime, end_date: /// Get a user's list of friends from the database #[server(endpoint = "/profile/friends")] pub async fn friends(for_user_id: i32) - -> Result, ServerFnError> + -> Result, ServerFnError> { let mut db_con = get_db_conn(); @@ -311,25 +311,26 @@ pub async fn friends(for_user_id: i32) .filter(friendships::friend_1_id.eq(for_user_id)) .filter(friendships::friend_1_id.ne(friendships::friend_2_id)) .inner_join(users::table.on(users::id.eq(friendships::friend_2_id))) - .select(users::all_columns) + .select((users::all_columns, friendships::created_at)) + .order(friendships::created_at.desc()) + .order(users::username.asc()) .union( friendships::table .filter(friendships::friend_2_id.eq(for_user_id)) .filter(friendships::friend_1_id.ne(friendships::friend_2_id)) .inner_join(users::table.on(users::id.eq(friendships::friend_1_id))) - .select(users::all_columns) + .select((users::all_columns, friendships::created_at)) + .order(friendships::created_at.desc()) + .order(users::username.asc()) ) .load(&mut db_con)?; // leave out the password field for security - let friend_list: Vec = friends.into_iter().map(|user: User| { - User { - id: user.id, + let friend_list: Vec = friends.into_iter().map(|(user, created_at): (User, NaiveDateTime)| { + FriendData { username: user.username, - email: user.email, - password: None, - created_at: user.created_at, - admin: user.admin + created_at: created_at.into(), + user_id: user.id.unwrap() } }).collect(); diff --git a/src/components.rs b/src/components.rs index de281a7..646510e 100644 --- a/src/components.rs +++ b/src/components.rs @@ -8,4 +8,5 @@ pub mod upload; pub mod song_list; pub mod loading; pub mod error; -pub mod album_info; \ No newline at end of file +pub mod album_info; +pub mod user_row; \ No newline at end of file diff --git a/src/components/user_row.rs b/src/components/user_row.rs new file mode 100644 index 0000000..5269b26 --- /dev/null +++ b/src/components/user_row.rs @@ -0,0 +1,21 @@ +use leptos::leptos_dom::*; +use leptos::*; +use leptos_icons::*; +use crate::frienddata::FriendData; + + +#[component] +pub fn UserRow(user: FriendData) -> impl IntoView { + + view! { +
+
+ }> + Profile Photo + +
+ {user.username} +

{user.created_at.format("%m/%d/%Y").to_string()}

+
+ }.into_view() +} diff --git a/src/frienddata.rs b/src/frienddata.rs new file mode 100644 index 0000000..cadeb07 --- /dev/null +++ b/src/frienddata.rs @@ -0,0 +1,17 @@ +use serde::{Serialize, Deserialize}; + +use chrono::NaiveDate; + +/// Holds information about an album +/// +/// Intended to be used in the front-end + +#[derive(Serialize, Deserialize, Clone)] +pub struct FriendData { + /// Username + pub username: String, + /// Date which the friend was added + pub created_at: NaiveDate, + /// User's id to be used to locate their profile image + pub user_id: i32 +} diff --git a/src/lib.rs b/src/lib.rs index 95ac8ca..b2486a0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ pub mod auth; pub mod songdata; pub mod albumdata; pub mod artistdata; +pub mod frienddata; pub mod playstatus; pub mod playbar; pub mod database;