UserRow and deliberately structuring API query output

This commit is contained in:
Aidan Westphal 2024-11-29 22:40:50 +00:00
parent 25391863f6
commit aa9001e7d1
5 changed files with 53 additions and 12 deletions

View File

@ -5,7 +5,7 @@ use cfg_if::cfg_if;
use crate::songdata::SongData; use crate::songdata::SongData;
use crate::artistdata::ArtistData; use crate::artistdata::ArtistData;
use crate::models::User; use crate::frienddata::FriendData;
use chrono::NaiveDateTime; 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 /// Get a user's list of friends from the database
#[server(endpoint = "/profile/friends")] #[server(endpoint = "/profile/friends")]
pub async fn friends(for_user_id: i32) pub async fn friends(for_user_id: i32)
-> Result<Vec<User>, ServerFnError> -> Result<Vec<FriendData>, ServerFnError>
{ {
let mut db_con = get_db_conn(); 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.eq(for_user_id))
.filter(friendships::friend_1_id.ne(friendships::friend_2_id)) .filter(friendships::friend_1_id.ne(friendships::friend_2_id))
.inner_join(users::table.on(users::id.eq(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( .union(
friendships::table friendships::table
.filter(friendships::friend_2_id.eq(for_user_id)) .filter(friendships::friend_2_id.eq(for_user_id))
.filter(friendships::friend_1_id.ne(friendships::friend_2_id)) .filter(friendships::friend_1_id.ne(friendships::friend_2_id))
.inner_join(users::table.on(users::id.eq(friendships::friend_1_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)?; .load(&mut db_con)?;
// leave out the password field for security // leave out the password field for security
let friend_list: Vec<User> = friends.into_iter().map(|user: User| { let friend_list: Vec<FriendData> = friends.into_iter().map(|(user, created_at): (User, NaiveDateTime)| {
User { FriendData {
id: user.id,
username: user.username, username: user.username,
email: user.email, created_at: created_at.into(),
password: None, user_id: user.id.unwrap()
created_at: user.created_at,
admin: user.admin
} }
}).collect(); }).collect();

View File

@ -9,3 +9,4 @@ pub mod song_list;
pub mod loading; pub mod loading;
pub mod error; pub mod error;
pub mod album_info; pub mod album_info;
pub mod user_row;

View File

@ -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! {
<div class="friend-row">
<div class="friend-item">
<Suspense fallback=|| view! { <Icon class="friend-image" icon=icondata::CgProfile/> }>
<img class="friend-image" src={format!("/assets/images/profile/{}.webp", user.user_id)} alt="Profile Photo" />
</Suspense>
</div>
<a class="friend-item" href={format!("user/{}",user.user_id)}>{user.username}</a>
<p class="friend-item friend-created-date">{user.created_at.format("%m/%d/%Y").to_string()}</p>
</div>
}.into_view()
}

17
src/frienddata.rs Normal file
View File

@ -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
}

View File

@ -3,6 +3,7 @@ pub mod auth;
pub mod songdata; pub mod songdata;
pub mod albumdata; pub mod albumdata;
pub mod artistdata; pub mod artistdata;
pub mod frienddata;
pub mod playstatus; pub mod playstatus;
pub mod playbar; pub mod playbar;
pub mod database; pub mod database;