Add contacts to offers
This commit is contained in:
parent
f7da676516
commit
45aee77327
@ -4,20 +4,31 @@
|
|||||||
<h1>Rzeczy wystawione na sprzedaż</h1>
|
<h1>Rzeczy wystawione na sprzedaż</h1>
|
||||||
|
|
||||||
{% for offer in offers %}
|
{% for offer in offers %}
|
||||||
<marketplace-offer
|
<marketplace-offer
|
||||||
offer-id="{{offer.id}}"
|
offer-id="{{offer.id}}"
|
||||||
description="{{offer.description}}"
|
description="{{offer.description}}"
|
||||||
picture-url="{{offer.picture_url}}"
|
picture-url="{{offer.picture_url}}"
|
||||||
{% match offer.price_range %}
|
{% match offer.price_range %}
|
||||||
{% when PriceRange::Free %}
|
{% when PriceRange::Free %}
|
||||||
price-range="free"
|
price-range="free"
|
||||||
{% when PriceRange::Fixed with { value } %}
|
{% when PriceRange::Fixed with { value } %}
|
||||||
price-range="{{value}}"
|
price-range="{{value}}"
|
||||||
{% when PriceRange::Range with { min, max } %}
|
{% when PriceRange::Range with { min, max } %}
|
||||||
price-range-min="{{min}}"
|
price-range-min="{{min}}"
|
||||||
price-range-max="{{max}}"
|
price-range-max="{{max}}"
|
||||||
{% endmatch %}
|
{% endmatch %}
|
||||||
></marketplace-offer>
|
>
|
||||||
|
<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 %}
|
{% endfor %}
|
||||||
</marketplace-offers>
|
</marketplace-offers>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -4,7 +4,6 @@ use chrono::NaiveDateTime;
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::model::db;
|
use crate::model::db;
|
||||||
use crate::model::db::ContactInfo;
|
|
||||||
|
|
||||||
#[derive(Debug, Default, Serialize)]
|
#[derive(Debug, Default, Serialize)]
|
||||||
pub enum Page {
|
pub enum Page {
|
||||||
@ -261,5 +260,33 @@ pub struct Offer {
|
|||||||
pub picture_url: String,
|
pub picture_url: String,
|
||||||
pub state: db::OfferState,
|
pub state: db::OfferState,
|
||||||
pub created_at: NaiveDateTime,
|
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::web::{Data, Form, ServiceConfig};
|
||||||
use actix_web::{get, post, web, HttpResponse};
|
use actix_web::{get, post, web, HttpResponse};
|
||||||
use askama::*;
|
use askama::*;
|
||||||
@ -6,6 +8,7 @@ use sqlx::PgPool;
|
|||||||
use crate::model::db::{self, OfferState, PriceRange};
|
use crate::model::db::{self, OfferState, PriceRange};
|
||||||
use crate::model::view;
|
use crate::model::view;
|
||||||
use crate::model::view::Page;
|
use crate::model::view::Page;
|
||||||
|
use crate::queries::T;
|
||||||
use crate::routes::{Identity, Result};
|
use crate::routes::{Identity, Result};
|
||||||
use crate::view::Helper;
|
use crate::view::Helper;
|
||||||
use crate::{authorize, not_xss, ok_or_internal, queries};
|
use crate::{authorize, not_xss, ok_or_internal, queries};
|
||||||
@ -17,7 +20,24 @@ struct AccountOffersTemplate {
|
|||||||
error: Option<String>,
|
error: Option<String>,
|
||||||
page: Page,
|
page: Page,
|
||||||
h: Helper,
|
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")]
|
#[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 mut t = ok_or_internal!(pool.begin().await);
|
||||||
let account = authorize!(&mut t, id);
|
let account = authorize!(&mut t, id);
|
||||||
|
|
||||||
let offers = queries::account_offers(&mut t, account.id)
|
let offers = offers(&mut t, account.id).await;
|
||||||
.await
|
|
||||||
.unwrap_or_default();
|
|
||||||
|
|
||||||
t.commit().await.ok();
|
t.commit().await.ok();
|
||||||
|
|
||||||
@ -79,9 +97,9 @@ async fn create_offer(
|
|||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
dbg!(e);
|
dbg!(e);
|
||||||
let offers = queries::account_offers(&mut t, account.id)
|
|
||||||
.await
|
let offers = offers(&mut t, account.id).await;
|
||||||
.unwrap_or_default();
|
|
||||||
t.rollback().await.ok();
|
t.rollback().await.ok();
|
||||||
Ok(HttpResponse::Ok().content_type("text/html").body(
|
Ok(HttpResponse::Ok().content_type("text/html").body(
|
||||||
AccountOffersTemplate {
|
AccountOffersTemplate {
|
||||||
@ -133,9 +151,9 @@ async fn update_offer(
|
|||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
dbg!(e);
|
dbg!(e);
|
||||||
let offers = queries::account_offers(&mut t, account.id)
|
|
||||||
.await
|
let offers = offers(&mut t, account.id).await;
|
||||||
.unwrap_or_default();
|
|
||||||
t.rollback().await.ok();
|
t.rollback().await.ok();
|
||||||
Ok(HttpResponse::Ok().content_type("text/html").body(
|
Ok(HttpResponse::Ok().content_type("text/html").body(
|
||||||
AccountOffersTemplate {
|
AccountOffersTemplate {
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
use actix_web::web::{self, Data, ServiceConfig};
|
use actix_web::web::{self, Data, ServiceConfig};
|
||||||
use actix_web::{get, HttpRequest, HttpResponse};
|
use actix_web::{get, HttpRequest, HttpResponse};
|
||||||
use askama::*;
|
use askama::*;
|
||||||
@ -5,6 +7,7 @@ use serde::Serialize;
|
|||||||
use sqlx::PgPool;
|
use sqlx::PgPool;
|
||||||
|
|
||||||
use crate::model::db::{self, PriceRange};
|
use crate::model::db::{self, PriceRange};
|
||||||
|
use crate::model::view;
|
||||||
use crate::model::view::Page;
|
use crate::model::view::Page;
|
||||||
use crate::queries;
|
use crate::queries;
|
||||||
use crate::routes::{Identity, Result};
|
use crate::routes::{Identity, Result};
|
||||||
@ -18,7 +21,7 @@ struct MarketplaceTemplate {
|
|||||||
page: Page,
|
page: Page,
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
h: Helper,
|
h: Helper,
|
||||||
offers: Vec<db::Offer>,
|
offers: Vec<view::Offer>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("")]
|
#[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 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();
|
t.commit().await.ok();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user