Add contacts to offers
This commit is contained in:
parent
f7da676516
commit
45aee77327
@ -4,20 +4,31 @@
|
||||
<h1>Rzeczy wystawione na sprzedaż</h1>
|
||||
|
||||
{% for offer in offers %}
|
||||
<marketplace-offer
|
||||
offer-id="{{offer.id}}"
|
||||
description="{{offer.description}}"
|
||||
picture-url="{{offer.picture_url}}"
|
||||
{% match offer.price_range %}
|
||||
{% when PriceRange::Free %}
|
||||
price-range="free"
|
||||
{% when PriceRange::Fixed with { value } %}
|
||||
price-range="{{value}}"
|
||||
{% when PriceRange::Range with { min, max } %}
|
||||
price-range-min="{{min}}"
|
||||
price-range-max="{{max}}"
|
||||
{% endmatch %}
|
||||
></marketplace-offer>
|
||||
<marketplace-offer
|
||||
offer-id="{{offer.id}}"
|
||||
description="{{offer.description}}"
|
||||
picture-url="{{offer.picture_url}}"
|
||||
{% match offer.price_range %}
|
||||
{% when PriceRange::Free %}
|
||||
price-range="free"
|
||||
{% when PriceRange::Fixed with { value } %}
|
||||
price-range="{{value}}"
|
||||
{% when PriceRange::Range with { min, max } %}
|
||||
price-range-min="{{min}}"
|
||||
price-range-max="{{max}}"
|
||||
{% endmatch %}
|
||||
>
|
||||
<contact-info-list slot="contacts">
|
||||
{% for contact in offer.contacts %}
|
||||
<contact-info
|
||||
mode="icon"
|
||||
contact-id="{{contact.id}}"
|
||||
content="{{h.render_contact(contact.contact_type.as_str(), contact.content.as_str())}}"
|
||||
contact-type="{{contact.contact_type}}"
|
||||
></contact-info>
|
||||
{% endfor %}
|
||||
</contact-info-list>
|
||||
</marketplace-offer>
|
||||
{% endfor %}
|
||||
</marketplace-offers>
|
||||
{% endblock %}
|
||||
|
@ -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<Arc<ContactInfo>>,
|
||||
pub contacts: Vec<Arc<db::ContactInfo>>,
|
||||
}
|
||||
|
||||
impl From<(db::Offer, &Vec<Arc<db::ContactInfo>>)> for Offer {
|
||||
fn from((offer, contacts): (db::Offer, &Vec<Arc<db::ContactInfo>>)) -> 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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<String>,
|
||||
page: Page,
|
||||
h: Helper,
|
||||
offers: Vec<db::Offer>,
|
||||
offers: Vec<view::Offer>,
|
||||
}
|
||||
|
||||
async fn offers(t: &mut T<'_>, account_id: i32) -> Vec<view::Offer> {
|
||||
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::<Vec<_>>();
|
||||
|
||||
offers
|
||||
.into_iter()
|
||||
.map(|o| view::Offer::from((o, &contacts)))
|
||||
.collect::<Vec<_>>()
|
||||
}
|
||||
|
||||
#[get("/account/offers")]
|
||||
@ -26,9 +46,7 @@ pub async fn account_offers(id: Identity, db: Data<PgPool>) -> Result<HttpRespon
|
||||
let mut t = ok_or_internal!(pool.begin().await);
|
||||
let account = authorize!(&mut t, id);
|
||||
|
||||
let offers = queries::account_offers(&mut t, account.id)
|
||||
.await
|
||||
.unwrap_or_default();
|
||||
let offers = offers(&mut t, account.id).await;
|
||||
|
||||
t.commit().await.ok();
|
||||
|
||||
@ -79,9 +97,9 @@ async fn create_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 {
|
||||
@ -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 {
|
||||
|
@ -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<db::Offer>,
|
||||
offers: Vec<view::Offer>,
|
||||
}
|
||||
|
||||
#[get("")]
|
||||
@ -31,6 +34,17 @@ async fn marketplace(req: HttpRequest, db: Data<PgPool>, 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::<Vec<_>>();
|
||||
|
||||
let offers = offers
|
||||
.into_iter()
|
||||
.map(|o| view::Offer::from((o, &contacts)))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
t.commit().await.ok();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user