diff --git a/src/main.rs b/src/main.rs index 31f118a..3224d22 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,12 +54,21 @@ struct CartItem { quantity: i32, } -#[derive(sqlx::FromRow, Serialize)] -struct Order { +#[derive(Serialize)] +struct OrderWithItems { id: i32, - data_zamowienia: chrono::NaiveDateTime, // Zmiana na obowiązkowy typ + data_zamowienia: NaiveDateTime, suma_totalna: BigDecimal, status: Option, + items: Vec, +} + +#[derive(sqlx::FromRow, Serialize)] +struct OrderItem { + tytul: String, + autor: String, + ilosc: i32, + cena: BigDecimal, } #[derive(Deserialize)] @@ -333,26 +342,51 @@ async fn get_order_history( req: HttpRequest, pool: web::Data, ) -> Result { - let token = req.headers().get("Authorization") - .and_then(|h| h.to_str().ok()); + let user_id = validate_token(get_token(&req)).await?; - let user_id = validate_token(token).await?; - - let orders = sqlx::query_as!( - Order, - r#"SELECT - id, - data_zamowienia as "data_zamowienia!", - suma_totalna, - status - FROM zamowienia WHERE user_id = $1"#, - user_id - ) + let orders = sqlx::query!( + r#" + SELECT + z.id as "id!", + z.data_zamowienia as "data_zamowienia!", + z.suma_totalna as "suma_totalna!", + z.status, + pz.ilosc as "ilosc!", + pz.cena as "item_price!", + k.tytul as "tytul!", + k.autor as "autor!" + FROM zamowienia z + JOIN pozycje_zamowienia pz ON z.id = pz.zamowienie_id + JOIN ksiazki k ON pz.book_id = k.id + WHERE z.user_id = $1 + ORDER BY z.data_zamowienia DESC + "#, + user_id + ) .fetch_all(pool.get_ref()) .await .map_err(|e| actix_web::error::ErrorInternalServerError(e))?; - Ok(HttpResponse::Ok().json(orders)) + let mut grouped_orders = HashMap::new(); + for record in orders { + let entry = grouped_orders.entry(record.id).or_insert(OrderWithItems { + id: record.id, + data_zamowienia: record.data_zamowienia, + suma_totalna: record.suma_totalna, + status: record.status, + items: Vec::new(), + }); + + entry.items.push(OrderItem { + tytul: record.tytul, + autor: record.autor, + ilosc: record.ilosc, + cena: record.item_price, + }); + } + + let result: Vec = grouped_orders.into_values().collect(); + Ok(HttpResponse::Ok().json(result)) } #[post("/api/checkout")] diff --git a/static/css/styles.css b/static/css/styles.css index 9e6e50f..f6269e3 100644 --- a/static/css/styles.css +++ b/static/css/styles.css @@ -250,3 +250,14 @@ footer a { color: #0ff; text-shadow: 0 0 10px rgba(0, 255, 255, 0.5); } + +.order-item { + background-color: #2a2a2a; + border-radius: 5px; + padding: 10px; + margin-bottom: 10px; +} + +.order-item:last-child { + margin-bottom: 0; +} diff --git a/static/js/profile.js b/static/js/profile.js index bf0fc2f..c1f872b 100644 --- a/static/js/profile.js +++ b/static/js/profile.js @@ -17,22 +17,46 @@ document.addEventListener('DOMContentLoaded', async () => { container.innerHTML = ''; orders.forEach(order => { - const orderDate = new Date(order.data_zamowienia).toLocaleDateString(); - const orderHTML = ` -
-
-
Zamówienie #${order.id}
-

Data: ${orderDate}

-

Suma: ${order.suma_totalna} PLN

-

Status: ${order.status || 'Przyjęto do realizacji'}

-
-
- `; - container.insertAdjacentHTML('beforeend', orderHTML); - }); + const orderDate = new Date(order.data_zamowienia).toLocaleDateString(); + const itemsList = order.items.map(item => ` +
+
+
${item.tytul}
+

Autor: ${item.autor}

+

Ilość: ${item.ilosc} × ${item.cena} PLN

+
+
+ `).join(''); + + const orderHTML = ` +
+
+
+
Zamówienie #${order.id}
+

Data: ${orderDate}

+
+
+
Pozycje:
+ ${itemsList} +
+
+

Suma całkowita:

+

${order.suma_totalna} PLN

+
+
+

Status:

+

${order.status || 'Przyjęto do realizacji'}

+
+
+
+
+ `; + container.insertAdjacentHTML('beforeend', orderHTML); + }); } catch (error) { console.error('Error:', error); alert('Nie udało się załadować historii zamówień'); } }); + diff --git a/static/login.html b/static/login.html index 3e2344c..5fe2bb6 100644 --- a/static/login.html +++ b/static/login.html @@ -58,7 +58,7 @@ diff --git a/static/register.html b/static/register.html index 272f313..74b36de 100644 --- a/static/register.html +++ b/static/register.html @@ -64,8 +64,8 @@ -