diff --git a/assets/templates/marketplace/index.html b/assets/templates/marketplace/index.html index d9ba644..8f509ec 100644 --- a/assets/templates/marketplace/index.html +++ b/assets/templates/marketplace/index.html @@ -4,20 +4,31 @@

Rzeczy wystawione na sprzedaż

{% for offer in offers %} - + + + {% for contact in offer.contacts %} + + {% endfor %} + + {% endfor %} {% endblock %} diff --git a/src/model/view.rs b/src/model/view.rs index 2d500cd..ed6251c 100644 --- a/src/model/view.rs +++ b/src/model/view.rs @@ -4,7 +4,6 @@ use chrono::NaiveDateTime; use serde::{Deserialize, Serialize}; use crate::model::db; -use crate::model::db::ContactInfo; #[derive(Debug, Default, Serialize)] pub enum Page { @@ -261,5 +260,33 @@ pub struct Offer { pub picture_url: String, pub state: db::OfferState, pub created_at: NaiveDateTime, - pub contacts: Vec>, + pub contacts: Vec>, +} + +impl From<(db::Offer, &Vec>)> for Offer { + fn from((offer, contacts): (db::Offer, &Vec>)) -> Self { + let db::Offer { + id, + owner_id, + price_range, + description, + picture_url, + state, + created_at, + } = offer; + Self { + id, + owner_id, + price_range, + description, + picture_url, + state, + created_at, + contacts: contacts + .iter() + .filter(|contact| contact.owner_id == owner_id) + .cloned() + .collect(), + } + } } diff --git a/src/routes/restricted/offers.rs b/src/routes/restricted/offers.rs index cf4c7f7..198d044 100644 --- a/src/routes/restricted/offers.rs +++ b/src/routes/restricted/offers.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use actix_web::web::{Data, Form, ServiceConfig}; use actix_web::{get, post, web, HttpResponse}; use askama::*; @@ -6,6 +8,7 @@ use sqlx::PgPool; use crate::model::db::{self, OfferState, PriceRange}; use crate::model::view; use crate::model::view::Page; +use crate::queries::T; use crate::routes::{Identity, Result}; use crate::view::Helper; use crate::{authorize, not_xss, ok_or_internal, queries}; @@ -17,7 +20,24 @@ struct AccountOffersTemplate { error: Option, page: Page, h: Helper, - offers: Vec, + offers: Vec, +} + +async fn offers(t: &mut T<'_>, account_id: i32) -> Vec { + let offers = queries::account_offers(t, account_id) + .await + .unwrap_or_default(); + let contacts = queries::all_contacts(t) + .await + .unwrap_or_default() + .into_iter() + .map(Arc::new) + .collect::>(); + + offers + .into_iter() + .map(|o| view::Offer::from((o, &contacts))) + .collect::>() } #[get("/account/offers")] @@ -26,9 +46,7 @@ pub async fn account_offers(id: Identity, db: Data) -> Result { dbg!(e); - let offers = queries::account_offers(&mut t, account.id) - .await - .unwrap_or_default(); + + let offers = offers(&mut t, account.id).await; + t.rollback().await.ok(); Ok(HttpResponse::Ok().content_type("text/html").body( AccountOffersTemplate { @@ -133,9 +151,9 @@ async fn update_offer( } Err(e) => { dbg!(e); - let offers = queries::account_offers(&mut t, account.id) - .await - .unwrap_or_default(); + + let offers = offers(&mut t, account.id).await; + t.rollback().await.ok(); Ok(HttpResponse::Ok().content_type("text/html").body( AccountOffersTemplate { diff --git a/src/routes/unrestricted/marketplace.rs b/src/routes/unrestricted/marketplace.rs index ae1a854..5c0c966 100644 --- a/src/routes/unrestricted/marketplace.rs +++ b/src/routes/unrestricted/marketplace.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use actix_web::web::{self, Data, ServiceConfig}; use actix_web::{get, HttpRequest, HttpResponse}; use askama::*; @@ -5,6 +7,7 @@ use serde::Serialize; use sqlx::PgPool; use crate::model::db::{self, PriceRange}; +use crate::model::view; use crate::model::view::Page; use crate::queries; use crate::routes::{Identity, Result}; @@ -18,7 +21,7 @@ struct MarketplaceTemplate { page: Page, #[serde(skip)] h: Helper, - offers: Vec, + offers: Vec, } #[get("")] @@ -31,6 +34,17 @@ async fn marketplace(req: HttpRequest, db: Data, id: Identity) -> Result }; let offers = queries::visible_offers(&mut t).await.unwrap_or_default(); + let contacts = queries::all_contacts(&mut t) + .await + .unwrap_or_default() + .into_iter() + .map(Arc::new) + .collect::>(); + + let offers = offers + .into_iter() + .map(|o| view::Offer::from((o, &contacts))) + .collect::>(); t.commit().await.ok();