From 3067b6e3f3b356382a5fe8ccb39fc7e324cc9ca4 Mon Sep 17 00:00:00 2001 From: Chris Jean-Marie Date: Fri, 1 Nov 2024 23:30:29 +0000 Subject: [PATCH] Initial wishlist editor --- backend/src/main.rs | 3 +- backend/src/user.rs | 14 +++++ backend/src/wishlist.rs | 73 ++++++++++++++++++++++++- backend/templates/userwishlist.html | 8 ++- backend/templates/userwishlistedit.html | 17 ++++++ 5 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 backend/templates/userwishlistedit.html diff --git a/backend/src/main.rs b/backend/src/main.rs index ca6db55..dafac27 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_received_item, wishlists}; +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 email::send_emails; #[derive(Clone)] @@ -60,6 +60,7 @@ 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/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)) .nest_service("/assets", ServeDir::new("templates/assets") diff --git a/backend/src/user.rs b/backend/src/user.rs index b35347b..73c68f5 100644 --- a/backend/src/user.rs +++ b/backend/src/user.rs @@ -162,6 +162,20 @@ pub async fn delete_user_role( } } +pub async fn get_user_wishlist_item_by_id(item_id: i64, db_pool: &SqlitePool) -> UserWishlistItem { + // Get wish list items for the user + let user_wishlist_item = sqlx::query_as( + r#"select id, created_at, created_by, updated_at, updated_by, user_id, item, item_url, purchased_by, received_at + from wishlist_items where id = ?"# + ) + .bind(item_id) + .fetch_one(db_pool) + .await + .unwrap(); + + user_wishlist_item +} + 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( diff --git a/backend/src/wishlist.rs b/backend/src/wishlist.rs index b42fa6c..c09d7a0 100644 --- a/backend/src/wishlist.rs +++ b/backend/src/wishlist.rs @@ -6,7 +6,7 @@ use http::StatusCode; use serde::Deserialize; use sqlx::{SqlitePool, Row}; -use crate::{middlewares::is_authorized, user::{get_user_roles_display, 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); @@ -132,6 +132,16 @@ struct UserWishListAddTemplate { 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, +} + pub async fn user_wishlist_add( Path(user_id): Path, State(db_pool): State, @@ -206,6 +216,67 @@ pub async fn user_wishlist_add_item( } } +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()); + 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 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; + + // 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, + name, + user: user_data.unwrap(), + user_roles, + user_wishlist_item, + }; + return HtmlTemplate(template).into_response(); + } else { + Redirect::to("/").into_response() + } +} + +pub async fn user_wishlist_save_item( + Path(item_id): Path, + State(db_pool): State, + Extension(user_data): Extension>, + Form(item_form): Form +) -> impl IntoResponse { + if is_authorized("/wishlist", user_data.clone(), db_pool.clone()).await { + // Insert new item to database + let now = Utc::now().timestamp(); + + sqlx::query("update wishlist_items set updated_at = ?, updated_by = ?, item = ?, item_url = ? where id = ?") + .bind(now) // Updated now + .bind(user_data.as_ref().unwrap().id) // Updated by current user + .bind(item_form.item) + .bind(item_form.item_url) + .bind(item_id) + .execute(&db_pool) + .await + .unwrap(); + + let user_id = user_data.as_ref().unwrap().id; + let redirect_string = format!("/userwishlist/{user_id}"); + Redirect::to(&redirect_string).into_response() + } else { + Redirect::to("/").into_response() + } +} + pub async fn user_wishlist_bought_item( Path(user_id): Path, State(db_pool): State, diff --git a/backend/templates/userwishlist.html b/backend/templates/userwishlist.html index 85e76d7..30cec6f 100644 --- a/backend/templates/userwishlist.html +++ b/backend/templates/userwishlist.html @@ -16,6 +16,7 @@ Item + Link State Action @@ -23,7 +24,12 @@ {% for user_wishlist_item in user_wishlist_items %} - {{ user_wishlist_item.item }} + {% if my_wishlist %} + {{ user_wishlist_item.item }} + {% else %} + {{ user_wishlist_item.item }} + {% endif %} + URL {% if user_wishlist_item.received_at > 0 %} Got it! {% else %} diff --git a/backend/templates/userwishlistedit.html b/backend/templates/userwishlistedit.html new file mode 100644 index 0000000..e67aad2 --- /dev/null +++ b/backend/templates/userwishlistedit.html @@ -0,0 +1,17 @@ +{% extends "authorized.html" %} +{% block title %}Edit item in {{ user.given_name }} Wishlist{% endblock %} +{% block center %} +

Add Item to Wishlist

+
+
+ + +
+
+ + +
+ +
+
+{% endblock center %}