From 3ba76fdb390c7679f7625ad3b528b8a2770335ae Mon Sep 17 00:00:00 2001 From: Chris Jean-Marie Date: Mon, 25 Nov 2024 15:02:21 +0000 Subject: [PATCH] Add functions for delete and return to wishlists --- backend/src/main.rs | 4 +- backend/src/routes.rs | 212 ++++++++++++--------- backend/src/wishlist.rs | 273 ++++++++++++++++++---------- backend/templates/base.html | 2 +- backend/templates/userwishlist.html | 83 +++++---- 5 files changed, 349 insertions(+), 225 deletions(-) diff --git a/backend/src/main.rs b/backend/src/main.rs index dafac27..b45f866 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -19,7 +19,7 @@ use middlewares::inject_user_data; use google_oauth::{login, logout, google_auth_return}; use routes::{about, contact, cottagecalendar, dashboard, index, profile, user_profile, useradmin}; use user::{add_user_role, delete_user_role, UserData}; -use wishlist::{user_wishlist, user_wishlist_add, user_wishlist_add_item, user_wishlist_bought_item, user_wishlist_edit_item, user_wishlist_received_item, user_wishlist_save_item, wishlists}; +use wishlist::{user_wishlist, user_wishlist_add, user_wishlist_add_item, user_wishlist_bought_item, user_wishlist_delete_item, user_wishlist_edit_item, user_wishlist_received_item, user_wishlist_returned_item, user_wishlist_save_item, wishlists}; //use email::send_emails; #[derive(Clone)] @@ -63,6 +63,8 @@ async fn main() { .route("/userwishlist/edit/:item_id", get(user_wishlist_edit_item).post(user_wishlist_save_item)) .route("/userwishlist/bought/:user_id", get(user_wishlist_bought_item)) .route("/userwishlist/received/:user_id", get(user_wishlist_received_item)) + .route("/userwishlist/delete/:item_id", get(user_wishlist_delete_item)) + .route("/userwishlist/returned/:item_id", get(user_wishlist_returned_item)) .nest_service("/assets", ServeDir::new("templates/assets") .fallback(get_service(ServeDir::new("templates/assets")))) .route("/", get(index)) diff --git a/backend/src/routes.rs b/backend/src/routes.rs index d6f5efb..cb4bdf7 100644 --- a/backend/src/routes.rs +++ b/backend/src/routes.rs @@ -17,7 +17,6 @@ use crate::{ #[template(path = "profile.html")] struct ProfileTemplate { logged_in: bool, - name: String, user: UserData, user_roles: Vec, } @@ -26,7 +25,7 @@ struct ProfileTemplate { #[template(path = "user.html")] struct UserProfileTemplate { logged_in: bool, - name: String, + user: UserData, user_roles: Vec, profile: UserData, profile_roles: Vec, @@ -55,14 +54,14 @@ where #[template(path = "index.html")] struct IndexTemplate { logged_in: bool, - name: String, + user: UserData, } #[derive(Template)] #[template(path = "dashboard.html")] struct DashboardTemplate { logged_in: bool, - name: String, + user: UserData, user_roles: Vec, } @@ -70,13 +69,22 @@ pub async fn index( State(db_pool): State, Extension(user_data): Extension>, ) -> impl IntoResponse { - let name = user_data.as_ref().map(|s| s.name.clone()).unwrap_or_default(); + // Is the user logged in? let logged_in = user_data.is_some(); - if is_authorized("/dashboard", user_data, db_pool).await { - Redirect::to("/dashboard").into_response() + if logged_in { + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); + + if is_authorized("/dashboard", user_data, db_pool).await { + Redirect::to("/dashboard").into_response() + } else { + let template = IndexTemplate { logged_in, user }; + HtmlTemplate(template).into_response() + } } else { - let template = IndexTemplate { logged_in, name }; + let template = IndexTemplate { logged_in, user: UserData::default() }; HtmlTemplate(template).into_response() } } @@ -85,16 +93,27 @@ pub async fn dashboard( State(db_pool): State, Extension(user_data): Extension>, ) -> impl IntoResponse { - let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - let name = user_data.as_ref().map(|s| s.name.clone()).unwrap_or_default(); + // Is the user logged in? let logged_in = user_data.is_some(); - if is_authorized("/dashboard", user_data, db_pool.clone()).await { - // Get user roles - let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; + if logged_in { + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - let template = DashboardTemplate { logged_in, name, user_roles }; - HtmlTemplate(template).into_response() + if is_authorized("/dashboard", user_data, db_pool.clone()).await { + // Get user roles + let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; + + let template = DashboardTemplate { + logged_in, + user, + user_roles, + }; + HtmlTemplate(template).into_response() + } else { + Redirect::to("/").into_response() + } } else { Redirect::to("/").into_response() } @@ -105,24 +124,22 @@ pub async fn profile( State(db_pool): State, Extension(user_data): Extension>, ) -> impl IntoResponse { - // Extract the user's name from the user data. - let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - let name = user_data.as_ref().map(|s| s.name.clone()).unwrap_or_default(); + // Is the user logged in? let logged_in = user_data.is_some(); if logged_in { // Extract the user data. let user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); if is_authorized("/profile", user_data, db_pool.clone()).await { - // Get user roles - let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; + // Get user roles + let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; - // Create the profile template. + // Create the profile template. let template = ProfileTemplate { logged_in, - name, - user: user.clone(), + user, user_roles, }; return HtmlTemplate(template).into_response(); @@ -139,37 +156,43 @@ pub async fn user_profile( State(db_pool): State, Extension(user_data): Extension>, ) -> impl IntoResponse { - // Extract the user's name from the user data. - let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - let name = user_data.as_ref().map(|s| s.name.clone()).unwrap_or_default(); + // Is the user logged in? let logged_in = user_data.is_some(); - // Extract the user data. - let user = sqlx::query_as!(UserData, "SELECT * FROM users WHERE id = ?", user_id) - .fetch_one(&db_pool) - .await - .unwrap(); + if logged_in { + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - if is_authorized("/users", user_data, db_pool.clone()).await { - // Get logged in user roles - let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; + // Extract the user data. + let profile = sqlx::query_as!(UserData, "SELECT * FROM users WHERE id = ?", user_id) + .fetch_one(&db_pool) + .await + .unwrap(); - // Get user roles - let profile_roles = get_user_roles_display(user_id, &db_pool.clone()).await; + if is_authorized("/users", user_data, db_pool.clone()).await { + // Get logged in user roles + let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; - // Get roles user does not have - let non_profile_roles = get_other_roles_display(user_id, &db_pool.clone()).await; + // Get user roles + let profile_roles = get_user_roles_display(user_id, &db_pool.clone()).await; - // Create the profile template. - let template = UserProfileTemplate { - logged_in, - name, - user_roles, - profile: user, - profile_roles, - non_profile_roles, - }; - return HtmlTemplate(template).into_response(); + // Get roles user does not have + let non_profile_roles = get_other_roles_display(user_id, &db_pool.clone()).await; + + // Create the profile template. + let template = UserProfileTemplate { + logged_in, + user, + user_roles, + profile, + profile_roles, + non_profile_roles, + }; + return HtmlTemplate(template).into_response(); + } else { + Redirect::to("/").into_response() + } } else { Redirect::to("/").into_response() } @@ -179,37 +202,43 @@ pub async fn user_profile( #[template(path = "useradmin.html")] struct UserAdminTemplate { logged_in: bool, - name: String, - users: Vec, + user: UserData, user_roles: Vec, + users: Vec, } pub async fn useradmin( Extension(user_data): Extension>, State(db_pool): State, ) -> impl IntoResponse { - let user_name = user_data.as_ref().map(|s| s.name.clone()); - let logged_in = user_name.is_some(); - let name = user_name.unwrap_or_default(); + // Is the user logged in? + let logged_in = user_data.is_some(); - let users = sqlx::query_as::<_, UserData>("SELECT * FROM users") + if logged_in { + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); + + let users = sqlx::query_as::<_, UserData>("SELECT * FROM users") .fetch_all(&db_pool) .await .unwrap(); - let user_id = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - if is_authorized("/useradmin", user_data, db_pool.clone()).await { - // Get user roles - let user_roles = get_user_roles_display(user_id, &db_pool.clone()).await; + if is_authorized("/useradmin", user_data, db_pool.clone()).await { + // Get user roles + let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; - let template = UserAdminTemplate { - logged_in, - name, - users, - user_roles, - }; - HtmlTemplate(template).into_response() + let template = UserAdminTemplate { + logged_in, + user, + user_roles, + users, + }; + HtmlTemplate(template).into_response() + } else { + Redirect::to("/").into_response() + } } else { Redirect::to("/").into_response() } @@ -219,15 +248,17 @@ pub async fn useradmin( #[template(path = "about.html")] struct AboutTemplate { logged_in: bool, - name: String, + user: UserData, } pub async fn about(Extension(user_data): Extension>) -> impl IntoResponse { - let user_name = user_data.map(|s| s.name); - let logged_in = user_name.is_some(); - let name = user_name.unwrap_or_default(); + // Is the user logged in? + let logged_in = user_data.is_some(); - let template = AboutTemplate { logged_in, name }; + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + + let template = AboutTemplate { logged_in, user }; HtmlTemplate(template) } @@ -235,15 +266,17 @@ pub async fn about(Extension(user_data): Extension>) -> impl In #[template(path = "contactus.html")] struct ContactTemplate { logged_in: bool, - name: String, + user: UserData, } pub async fn contact(Extension(user_data): Extension>) -> impl IntoResponse { - let user_name = user_data.map(|s| s.name); - let logged_in = user_name.is_some(); - let name = user_name.unwrap_or_default(); + // Is the user logged in? + let logged_in = user_data.is_some(); - let template = ContactTemplate { logged_in, name }; + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + + let template = ContactTemplate { logged_in, user }; HtmlTemplate(template) } @@ -251,7 +284,7 @@ pub async fn contact(Extension(user_data): Extension>) -> impl #[template(path = "cottagecalendar.html")] struct CottageCalendarTemplate { logged_in: bool, - name: String, + user: UserData, user_roles: Vec, } @@ -259,18 +292,27 @@ pub async fn cottagecalendar( Extension(user_data): Extension>, State(db_pool): State, ) -> impl IntoResponse { - let user_name = user_data.as_ref().map(|s| s.name.clone()); - let logged_in = user_name.is_some(); - let name = user_name.unwrap_or_default(); + // Is the user logged in? + let logged_in = user_data.is_some(); - let user_id = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); + if logged_in { + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - if is_authorized("/cottagecalendar", user_data, db_pool.clone()).await { - // Get user roles - let user_roles = get_user_roles_display(user_id, &db_pool.clone()).await; + if is_authorized("/cottagecalendar", user_data, db_pool.clone()).await { + // Get user roles + let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; - let template = CottageCalendarTemplate { logged_in, name, user_roles }; - HtmlTemplate(template).into_response() + let template = CottageCalendarTemplate { + logged_in, + user, + user_roles, + }; + HtmlTemplate(template).into_response() + } else { + Redirect::to("/").into_response() + } } else { Redirect::to("/").into_response() } diff --git a/backend/src/wishlist.rs b/backend/src/wishlist.rs index c09d7a0..25062b9 100644 --- a/backend/src/wishlist.rs +++ b/backend/src/wishlist.rs @@ -1,12 +1,22 @@ use askama_axum::{IntoResponse, Response, Template}; -use axum::{extract::{Path, State}, response::Redirect, Extension, Form}; +use axum::{ + extract::{Path, State}, + response::Redirect, + Extension, Form, +}; use axum_extra::response::Html; use chrono::Utc; use http::StatusCode; use serde::Deserialize; -use sqlx::{SqlitePool, Row}; +use sqlx::{Row, SqlitePool}; -use crate::{middlewares::is_authorized, user::{get_user_roles_display, get_user_wishlist_item_by_id, get_user_wishlist_items, UserData, UserWishlistItem}}; +use crate::{ + middlewares::is_authorized, + user::{ + get_user_roles_display, get_user_wishlist_item_by_id, get_user_wishlist_items, UserData, + UserWishlistItem, + }, +}; struct HtmlTemplate(T); @@ -30,7 +40,7 @@ where #[template(path = "userwishlists.html")] struct WishListsTemplate { logged_in: bool, - name: String, + user: UserData, user_roles: Vec, users: Vec, } @@ -39,28 +49,33 @@ pub async fn wishlists( Extension(user_data): Extension>, State(db_pool): State, ) -> impl IntoResponse { - let user_name = user_data.as_ref().map(|s| s.name.clone()); - let logged_in = user_name.is_some(); - let name = user_name.unwrap_or_default(); - - let users = sqlx::query_as::<_, UserData>("SELECT * FROM users") - .fetch_all(&db_pool) - .await - .unwrap(); + // Is the user logged in? + let logged_in = user_data.is_some(); + if logged_in { + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); + let users = sqlx::query_as::<_, UserData>("SELECT * FROM users") + .fetch_all(&db_pool) + .await + .unwrap(); + if is_authorized("/userwishlists", user_data, db_pool.clone()).await { // Get user roles let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; let template = WishListsTemplate { logged_in, - name, + user, users, user_roles, - }; - HtmlTemplate(template).into_response() + }; + HtmlTemplate(template).into_response() + } else { + Redirect::to("/").into_response() + } } else { Redirect::to("/").into_response() } @@ -70,11 +85,11 @@ pub async fn wishlists( #[template(path = "userwishlist.html")] struct UserWishListTemplate { logged_in: bool, - name: String, - my_wishlist: bool, user: UserData, user_roles: Vec, - user_wishlist_items: Vec, + my_wishlist: bool, + person: UserData, + person_wishlist_items: Vec, } pub async fn user_wishlist( @@ -82,41 +97,43 @@ pub async fn user_wishlist( State(db_pool): State, Extension(user_data): Extension>, ) -> impl IntoResponse { - // Extract the user's name from the user data. - let user_name = user_data.as_ref().map(|s| s.name.clone()); + // Is the user logged in? let logged_in = user_data.is_some(); - let name = user_name.unwrap_or_default(); - // Extract the user's id from the user data - let user_userid = user_data.as_ref().map(|s| s.id.clone()); - let userid = user_userid.unwrap_or_default(); + if logged_in { + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - // Extract the user data. - let user = sqlx::query_as!(UserData, "SELECT * FROM users WHERE id = ?", user_id) - .fetch_one(&db_pool) - .await - .unwrap(); + // Extract the user data. + let person = sqlx::query_as!(UserData, "SELECT * FROM users WHERE id = ?", user_id) + .fetch_one(&db_pool) + .await + .unwrap(); if is_authorized("/wishlist", user_data, db_pool.clone()).await { // Get user roles let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; // Get user wishlist - let user_wishlist_items = get_user_wishlist_items(user_id, &db_pool.clone()).await; + let person_wishlist_items = get_user_wishlist_items(user_id, &db_pool.clone()).await; - // Is viewed and viewing user the same (my wishlist)? - let my_wishlist = user_id == userid; + // Is viewed and viewing user the same (my wishlist)? + let my_wishlist = user_id == userid; - // Create the wishlist template. - let template = UserWishListTemplate { - logged_in, - name, - my_wishlist, - user: user, - user_roles, - user_wishlist_items, - }; - return HtmlTemplate(template).into_response(); + // Create the wishlist template. + let template = UserWishListTemplate { + logged_in, + user, + user_roles, + my_wishlist, + person, + person_wishlist_items, + }; + return HtmlTemplate(template).into_response(); + } else { + Redirect::to("/").into_response() + } } else { Redirect::to("/").into_response() } @@ -126,20 +143,10 @@ pub async fn user_wishlist( #[template(path = "userwishlistadd.html")] struct UserWishListAddTemplate { logged_in: bool, - name: String, user: UserData, user_roles: Vec, - user_wishlist_items: Vec, -} - -#[derive(Template)] -#[template(path = "userwishlistedit.html")] -struct UserWishListEditTemplate { - logged_in: bool, - name: String, - user: UserData, - user_roles: Vec, - user_wishlist_item: crate::user::UserWishlistItem, + person: UserData, + person_wishlist_items: Vec, } pub async fn user_wishlist_add( @@ -147,35 +154,39 @@ pub async fn user_wishlist_add( State(db_pool): State, Extension(user_data): Extension>, ) -> impl IntoResponse { - // Extract the user's name from the user data. - let user_name = user_data.as_ref().map(|s| s.name.clone()); + // Is the user logged in? let logged_in = user_data.is_some(); - let name = user_name.unwrap_or_default(); - // Extract the user data. - let user = sqlx::query_as!(UserData, "SELECT * FROM users WHERE id = ?", user_id) - .fetch_one(&db_pool) - .await - .unwrap(); + if logged_in { + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); + // Extract the user data. + let person = sqlx::query_as!(UserData, "SELECT * FROM users WHERE id = ?", user_id) + .fetch_one(&db_pool) + .await + .unwrap(); - if is_authorized("/wishlist", user_data, db_pool.clone()).await { + if is_authorized("/wishlist", user_data, db_pool.clone()).await { // Get user roles let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; // Get user wishlist items - let user_wishlist_items = get_user_wishlist_items(user_id, &db_pool.clone()).await; + let person_wishlist_items = get_user_wishlist_items(user_id, &db_pool.clone()).await; - // Create the wishlist template. - let template = UserWishListAddTemplate { - logged_in, - name, - user: user, - user_roles, - user_wishlist_items, - }; - return HtmlTemplate(template).into_response(); + // Create the wishlist template. + let template = UserWishListAddTemplate { + logged_in, + user, + user_roles, + person, + person_wishlist_items, + }; + return HtmlTemplate(template).into_response(); + } else { + Redirect::to("/").into_response() + } } else { Redirect::to("/").into_response() } @@ -191,7 +202,7 @@ pub async fn user_wishlist_add_item( Path(user_id): Path, State(db_pool): State, Extension(user_data): Extension>, - Form(item_form): Form + Form(item_form): Form, ) -> impl IntoResponse { if is_authorized("/wishlist", user_data.clone(), db_pool.clone()).await { // Insert new item to database @@ -216,34 +227,49 @@ pub async fn user_wishlist_add_item( } } +#[derive(Template)] +#[template(path = "userwishlistedit.html")] +struct UserWishListEditTemplate { + logged_in: bool, + user: UserData, + user_roles: Vec, + user_wishlist_item: crate::user::UserWishlistItem, +} + pub async fn user_wishlist_edit_item( Path(item_id): Path, State(db_pool): State, Extension(user_data): Extension>, ) -> impl IntoResponse { - // Extract the user's name from the user data. - let user_name = user_data.as_ref().map(|s| s.name.clone()); + // Is the user logged in? let logged_in = user_data.is_some(); - let name = user_name.unwrap_or_default(); - let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); + if logged_in { + // Extract the user data. + let user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); - if is_authorized("/wishlist", user_data.clone(), db_pool.clone()).await { - // Get user roles - let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; + // Extract the user data. - // Get user wishlist items - let user_wishlist_item = get_user_wishlist_item_by_id(item_id, &db_pool.clone()).await; + if is_authorized("/wishlist", user_data.clone(), db_pool.clone()).await { + // Get user roles + let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; - // Create the wishlist template. - let template = UserWishListEditTemplate { - logged_in, - name, - user: user_data.unwrap(), - user_roles, - user_wishlist_item, - }; - return HtmlTemplate(template).into_response(); + // Get user wishlist items + let user_wishlist_item = + get_user_wishlist_item_by_id(item_id, &db_pool.clone()).await; + + // Create the wishlist template. + let template = UserWishListEditTemplate { + logged_in, + user, + user_roles, + user_wishlist_item, + }; + return HtmlTemplate(template).into_response(); + } else { + Redirect::to("/").into_response() + } } else { Redirect::to("/").into_response() } @@ -253,7 +279,7 @@ pub async fn user_wishlist_save_item( Path(item_id): Path, State(db_pool): State, Extension(user_data): Extension>, - Form(item_form): Form + Form(item_form): Form, ) -> impl IntoResponse { if is_authorized("/wishlist", user_data.clone(), db_pool.clone()).await { // Insert new item to database @@ -280,12 +306,12 @@ pub async fn user_wishlist_save_item( pub async fn user_wishlist_bought_item( Path(user_id): Path, State(db_pool): State, - Extension(user_data): Extension> + Extension(user_data): Extension>, ) -> impl IntoResponse { if is_authorized("/wishlist", user_data.clone(), db_pool.clone()).await { // Update item to purchased sqlx::query("update wishlist_items set purchased_by = ? where id = ?") - .bind(user_data.as_ref().unwrap().id)// Created by current user + .bind(user_data.as_ref().unwrap().id) // Created by current user .bind(user_id) .execute(&db_pool) .await @@ -293,7 +319,7 @@ pub async fn user_wishlist_bought_item( // Redirect to user wishlist // Extract the user data. - let row = sqlx::query( "SELECT user_id FROM wishlist_items WHERE id = ?") + let row = sqlx::query("SELECT user_id FROM wishlist_items WHERE id = ?") .bind(user_id) .fetch_one(&db_pool) .await @@ -310,14 +336,14 @@ pub async fn user_wishlist_bought_item( pub async fn user_wishlist_received_item( Path(user_id): Path, State(db_pool): State, - Extension(user_data): Extension> + Extension(user_data): Extension>, ) -> impl IntoResponse { if is_authorized("/wishlist", user_data.clone(), db_pool.clone()).await { // Update item received time let now = Utc::now().timestamp(); sqlx::query("update wishlist_items set received_at = ? where id = ?") - .bind(now)// Received now + .bind(now) // Received now .bind(user_id) .execute(&db_pool) .await @@ -331,3 +357,52 @@ pub async fn user_wishlist_received_item( Redirect::to("/").into_response() } } + +pub async fn user_wishlist_delete_item( + Path(item_id): Path, + State(db_pool): State, + Extension(user_data): Extension>, +) -> impl IntoResponse { + if is_authorized("/wishlist", user_data.clone(), db_pool.clone()).await { + sqlx::query("delete from wishlist_items where id = ?") + .bind(item_id) + .execute(&db_pool) + .await + .unwrap(); + + // Redirect to user wishlist + let userid = user_data.as_ref().unwrap().id; + let redirect_string = format!("/userwishlist/{userid}"); + Redirect::to(&redirect_string).into_response() + } else { + Redirect::to("/").into_response() + } +} + +pub async fn user_wishlist_returned_item( + Path(item_id): Path, + State(db_pool): State, + Extension(user_data): Extension>, +) -> impl IntoResponse { + if is_authorized("/wishlist", user_data.clone(), db_pool.clone()).await { + sqlx::query("update wishlist_items set purchased_by = 0 where id = ?") + .bind(item_id) + .execute(&db_pool) + .await + .unwrap(); + + // Redirect to user wishlist + // Extract the user data. + let row = sqlx::query("SELECT user_id FROM wishlist_items WHERE id = ?") + .bind(item_id) + .fetch_one(&db_pool) + .await + .unwrap(); + + let profileid = row.get::("user_id"); + let redirect_string = format!("/userwishlist/{profileid}"); + Redirect::to(&redirect_string).into_response() + } else { + Redirect::to("/").into_response() + } +} diff --git a/backend/templates/base.html b/backend/templates/base.html index 7583d05..64b151c 100644 --- a/backend/templates/base.html +++ b/backend/templates/base.html @@ -49,7 +49,7 @@ {% if logged_in %} - + {% else %} {% endif %} diff --git a/backend/templates/userwishlist.html b/backend/templates/userwishlist.html index 30cec6f..6ecbe1c 100644 --- a/backend/templates/userwishlist.html +++ b/backend/templates/userwishlist.html @@ -1,56 +1,61 @@ {% extends "authorized.html" %} -{% block title %}User Profile{% endblock %} +{% block title %}User Wishlist{% endblock %} {% block center %} {% if my_wishlist %}

My Wishlist

{% else %} -

{{ user.given_name }} Wishlist

+

{{ person.given_name }} Wishlist

{% endif %} -
+

List

{% if my_wishlist %} Add {% endif %}
- - - - - - - - - - - {% for user_wishlist_item in user_wishlist_items %} - - {% if my_wishlist %} - - {% else %} - - {% endif %} - - {% if user_wishlist_item.received_at > 0 %} - - {% else %} - - {% endif %} - {% if my_wishlist %} - {% if user_wishlist_item.received_at > 0 %} +
ItemLinkStateAction
{{ user_wishlist_item.item }}{{ user_wishlist_item.item }}URLGot it!Not yet!
+ + + + + + + + + + {% for person_wishlist_item in person_wishlist_items %} + + {% if my_wishlist %} + + {% else %} + + {% endif %} + + + + {% if person_wishlist_item.received_at > 0 %} {% else %} - + {% endif %} - {% else %} - {% if user_wishlist_item.purchased_by > 0 %} - + + {% if my_wishlist %} + {% if person_wishlist_item.received_at > 0 %} + + {% else %} + + {% endif %} {% else %} - + {% if person_wishlist_item.purchased_by == user.id %} + + {% else if person_wishlist_item.purchased_by > 0 %} + + {% else %} + + {% endif %} {% endif %} - {% endif %} - - {% endfor %} - -
ItemLinkStateAction
{{ person_wishlist_item.item }}{{ person_wishlist_item.item }}URLGot it!ReceivedNot yet!PurchasedDeleteReceivedBoughtReturnPurchasedBought
+ + {% endfor %} + +
-{% endblock center %} +{% endblock center %} \ No newline at end of file