Add contacts to offers

This commit is contained in:
Adrian Woźniak 2022-07-21 15:58:37 +02:00
parent f7da676516
commit 45aee77327
No known key found for this signature in database
GPG Key ID: 0012845A89C7352B
4 changed files with 97 additions and 27 deletions

View File

@ -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 %}

View File

@ -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(),
}
}
} }

View File

@ -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 {

View File

@ -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();