history-done
This commit is contained in:
parent
1f414d0a70
commit
4fbbff2c12
5 changed files with 103 additions and 34 deletions
66
src/main.rs
66
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<String>,
|
||||
items: Vec<OrderItem>,
|
||||
}
|
||||
|
||||
#[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<sqlx::PgPool>,
|
||||
) -> Result<HttpResponse, Error> {
|
||||
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"#,
|
||||
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<OrderWithItems> = grouped_orders.into_values().collect();
|
||||
Ok(HttpResponse::Ok().json(result))
|
||||
}
|
||||
|
||||
#[post("/api/checkout")]
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -18,13 +18,36 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
|
||||
orders.forEach(order => {
|
||||
const orderDate = new Date(order.data_zamowienia).toLocaleDateString();
|
||||
const orderHTML = `
|
||||
<div class="card dark-card mb-3">
|
||||
const itemsList = order.items.map(item => `
|
||||
<div class="card dark-card mb-2">
|
||||
<div class="card-body">
|
||||
<h6 class="card-subtitle mb-2 text-muted">${item.tytul}</h6>
|
||||
<p class="card-text">Autor: ${item.autor}</p>
|
||||
<p class="card-text">Ilość: ${item.ilosc} × ${item.cena} PLN</p>
|
||||
</div>
|
||||
</div>
|
||||
`).join('');
|
||||
|
||||
const orderHTML = `
|
||||
<div class="mb-4">
|
||||
<div class="card dark-card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title">Zamówienie #${order.id}</h5>
|
||||
<p class="card-text">Data: ${orderDate}</p>
|
||||
<p class="card-text">Suma: ${order.suma_totalna} PLN</p>
|
||||
<p class="card-text">Status: ${order.status || 'Przyjęto do realizacji'}</p>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h6 class="text-accent">Pozycje:</h6>
|
||||
${itemsList}
|
||||
<hr class="bg-secondary">
|
||||
<div class="d-flex justify-content-between">
|
||||
<p class="fw-bold">Suma całkowita:</p>
|
||||
<p class="fw-bold">${order.suma_totalna} PLN</p>
|
||||
</div>
|
||||
<div class="d-flex justify-content-between">
|
||||
<p>Status:</p>
|
||||
<p class="text-accent">${order.status || 'Przyjęto do realizacji'}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
@ -36,3 +59,4 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
alert('Nie udało się załadować historii zamówień');
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
<button type="submit" class="btn btn-gothic w-100">ZALOGUJ SIĘ</button>
|
||||
</form>
|
||||
<div class="text-center mt-3">
|
||||
<a href="/register.html" class="text-danger">Nie masz konta? Zarejestruj się</a>
|
||||
Nie masz konta? <a href="/register.html" class="text-danger">Zarejestruj się</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -64,8 +64,8 @@
|
|||
</div>
|
||||
<button type="submit" class="btn btn-gothic w-100">ZAREJESTRUJ SIĘ</button>
|
||||
</form>
|
||||
<div class="login-link">
|
||||
Masz już konto? <a href="/login.html" class="text-accent">Zaloguj się</a>
|
||||
<div class="text-center mt-3">
|
||||
Masz już konto? <a href="/login.html" class="text-danger">Zaloguj się</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue