From f47543efd9e44d92b3f1c3f363e3b77e2fb67a74 Mon Sep 17 00:00:00 2001 From: Chris Jean-Marie Date: Mon, 28 Oct 2024 18:17:11 +0000 Subject: [PATCH] Fix wishlist code to allow for marking purchased and received --- backend/promote.sh | 2 +- backend/src/main.rs | 4 +- backend/src/user.rs | 3 +- backend/src/wishlist.rs | 59 ++++++++++++++++++++++++++++- backend/templates/userwishlist.html | 12 +++++- 5 files changed, 73 insertions(+), 7 deletions(-) diff --git a/backend/promote.sh b/backend/promote.sh index 7093a95..214f7ff 100755 --- a/backend/promote.sh +++ b/backend/promote.sh @@ -1,6 +1,6 @@ cargo build --release ssh chris@192.168.59.31 'pkill jean-marie' scp target/release/jean-marie chris@192.168.59.31:/opt/jean-marie -scp .env www@192.168.59.31:/opt/jean-marie +scp .env chris@192.168.59.31:/opt/jean-marie scp -r templates chris@192.168.59.31:/opt/jean-marie ssh chris@192.168.59.31 'cd /opt/jean-marie && ./jean-marie&' diff --git a/backend/src/main.rs b/backend/src/main.rs index 0b56a91..3a9a53b 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -18,7 +18,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, wishlists}; +use wishlist::{user_wishlist, user_wishlist_add, user_wishlist_add_item, user_wishlist_bought_item, user_wishlist_received_item, wishlists}; #[derive(Clone)] pub struct AppState { @@ -58,6 +58,8 @@ async fn main() { .route("/wishlists", get(wishlists)) .route("/userwishlist/:user_id", get(user_wishlist)) .route("/userwishlist/add/:user_id", get(user_wishlist_add).post(user_wishlist_add_item)) + .route("/userwishlist/bought/:user_id", get(user_wishlist_bought_item)) + .route("/userwishlist/received/:user_id", get(user_wishlist_received_item)) .nest_service("/assets", ServeDir::new("templates/assets") .fallback(get_service(ServeDir::new("templates/assets")))) .route("/", get(index)) diff --git a/backend/src/user.rs b/backend/src/user.rs index 37581d8..e3b0057 100644 --- a/backend/src/user.rs +++ b/backend/src/user.rs @@ -71,6 +71,7 @@ pub struct UserWishlistItem { pub item: String, pub item_url: String, pub purchased_by: i64, + pub received_at: i64, } /* @@ -158,7 +159,7 @@ pub async fn delete_user_role( pub async fn get_user_wishlist_items(user_id: i64, db_pool: &SqlitePool) -> Vec { // Get wish list items for the user let user_wishlist_items = sqlx::query_as( - r#"select id, created_at, created_by, updated_at, updated_by, user_id, item, item_url, purchased_by from wishlist_items where user_id = ?"# + r#"select id, created_at, created_by, updated_at, updated_by, user_id, item, item_url, purchased_by, received_at from wishlist_items where user_id = ?"# ) .bind(user_id) .fetch_all(db_pool) diff --git a/backend/src/wishlist.rs b/backend/src/wishlist.rs index fd9a685..9e6a2cf 100644 --- a/backend/src/wishlist.rs +++ b/backend/src/wishlist.rs @@ -4,9 +4,9 @@ use axum_extra::response::Html; use chrono::Utc; use http::StatusCode; use serde::Deserialize; -use sqlx::SqlitePool; +use sqlx::{SqlitePool, Row}; -use crate::{middlewares::is_authorized, user::{get_user_wishlist_items, UserData}}; +use crate::{middlewares::is_authorized, user::{get_user_wishlist_items, UserData, UserWishlistItem}}; struct HtmlTemplate(T); @@ -186,3 +186,58 @@ pub async fn user_wishlist_add_item( Redirect::to("/").into_response() } } + +pub async fn user_wishlist_bought_item( + Path(user_id): Path, + State(db_pool): State, + 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_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(user_id) + .fetch_one(&db_pool) + .await + .unwrap(); + + let userid = row.get::("user_id"); + let redirect_string = format!("/userwishlist/{userid}"); + Redirect::to(&redirect_string).into_response() + } else { + Redirect::to("/").into_response() + } +} + +pub async fn user_wishlist_received_item( + Path(user_id): Path, + State(db_pool): State, + 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(user_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() + } +} diff --git a/backend/templates/userwishlist.html b/backend/templates/userwishlist.html index e4668d5..014e1d7 100644 --- a/backend/templates/userwishlist.html +++ b/backend/templates/userwishlist.html @@ -23,9 +23,17 @@ {{ user_wishlist_item.item }} {% if my_wishlist %} - Received + {% if user_wishlist_item.received_at > 0 %} + Got it! + {% else %} + Received + {% endif %} {% else %} - Bought + {% if user_wishlist_item.purchased_by > 0 %} + Purchased + {% else %} + Bought + {% endif %} {% endif %} {% endfor %}