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

@ -17,7 +17,18 @@
price-range-min="{{min}}"
price-range-max="{{max}}"
{% 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 %}
</marketplace-offers>
{% endblock %}

View File

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

View File

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

View File

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