Fix wishlist code to allow for marking purchased and received

This commit is contained in:
Chris Jean-Marie 2024-10-28 18:17:11 +00:00
parent 7c79e6ea06
commit f47543efd9
5 changed files with 73 additions and 7 deletions

View File

@ -1,6 +1,6 @@
cargo build --release cargo build --release
ssh chris@192.168.59.31 'pkill jean-marie' ssh chris@192.168.59.31 'pkill jean-marie'
scp target/release/jean-marie chris@192.168.59.31:/opt/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 scp -r templates chris@192.168.59.31:/opt/jean-marie
ssh chris@192.168.59.31 'cd /opt/jean-marie && ./jean-marie&' ssh chris@192.168.59.31 'cd /opt/jean-marie && ./jean-marie&'

View File

@ -18,7 +18,7 @@ use middlewares::inject_user_data;
use google_oauth::{login, logout, google_auth_return}; use google_oauth::{login, logout, google_auth_return};
use routes::{about, contact, cottagecalendar, dashboard, index, profile, user_profile, useradmin}; use routes::{about, contact, cottagecalendar, dashboard, index, profile, user_profile, useradmin};
use user::{add_user_role, delete_user_role, UserData}; 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)] #[derive(Clone)]
pub struct AppState { pub struct AppState {
@ -58,6 +58,8 @@ async fn main() {
.route("/wishlists", get(wishlists)) .route("/wishlists", get(wishlists))
.route("/userwishlist/:user_id", get(user_wishlist)) .route("/userwishlist/:user_id", get(user_wishlist))
.route("/userwishlist/add/:user_id", get(user_wishlist_add).post(user_wishlist_add_item)) .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") .nest_service("/assets", ServeDir::new("templates/assets")
.fallback(get_service(ServeDir::new("templates/assets")))) .fallback(get_service(ServeDir::new("templates/assets"))))
.route("/", get(index)) .route("/", get(index))

View File

@ -71,6 +71,7 @@ pub struct UserWishlistItem {
pub item: String, pub item: String,
pub item_url: String, pub item_url: String,
pub purchased_by: i64, 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<UserWishlistItem> { pub async fn get_user_wishlist_items(user_id: i64, db_pool: &SqlitePool) -> Vec<UserWishlistItem> {
// Get wish list items for the user // Get wish list items for the user
let user_wishlist_items = sqlx::query_as( 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) .bind(user_id)
.fetch_all(db_pool) .fetch_all(db_pool)

View File

@ -4,9 +4,9 @@ use axum_extra::response::Html;
use chrono::Utc; use chrono::Utc;
use http::StatusCode; use http::StatusCode;
use serde::Deserialize; 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>(T); struct HtmlTemplate<T>(T);
@ -186,3 +186,58 @@ pub async fn user_wishlist_add_item(
Redirect::to("/").into_response() Redirect::to("/").into_response()
} }
} }
pub async fn user_wishlist_bought_item(
Path(user_id): Path<i64>,
State(db_pool): State<SqlitePool>,
Extension(user_data): Extension<Option<UserData>>
) -> 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::<i64, _>("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<i64>,
State(db_pool): State<SqlitePool>,
Extension(user_data): Extension<Option<UserData>>
) -> 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()
}
}

View File

@ -23,9 +23,17 @@
<tr> <tr>
<td><a href="{{ user_wishlist_item.item_url }}">{{ user_wishlist_item.item }}</a></td> <td><a href="{{ user_wishlist_item.item_url }}">{{ user_wishlist_item.item }}</a></td>
{% if my_wishlist %} {% if my_wishlist %}
<td><a href="/userwishlist/received/{{ user_wishlist_item.id }}">Received</a></td> {% if user_wishlist_item.received_at > 0 %}
<td>Got it!</td>
{% else %}
<td><a href="/userwishlist/received/{{ user_wishlist_item.id }}">Received</a></td>
{% endif %}
{% else %} {% else %}
<td><a href="/userwishlist/bought/{{ user_wishlist_item.id }}">Bought</a></td> {% if user_wishlist_item.purchased_by > 0 %}
<td>Purchased</td>
{% else %}
<td><a href="/userwishlist/bought/{{ user_wishlist_item.id }}">Bought</a></td>
{% endif %}
{% endif %} {% endif %}
</tr> </tr>
{% endfor %} {% endfor %}