Clean up transaction routes

pull/26/head
Miroito 3 years ago
parent 6a52f3c2d1
commit 3976e8ff9b

@ -7,17 +7,18 @@ pub async fn get_transactions(
) -> Result<PaginatedResponse<TransactionCompany>, ()> {
use crate::env::Config;
#[cfg(client)]
{
// TODO: Remove build-time environment variable
let api_url = Config::new().api_url;
let res = reqwasm::http::Request::get(&format!(
"{}transaction{}?page={}&size={}",
let route = &format!(
"{}transaction?{}&page={}&size={}",
api_url,
company_slug.unwrap_or_default(),
company_slug.map_or("".to_string(), |c| format!("company_slug={}", c)),
page,
size,
))
);
// TODO: Remove build-time environment variable
#[cfg(client)]
let res = reqwasm::http::Request::get(route)
.send()
.await
.map_err(|_| ())?
@ -25,18 +26,8 @@ pub async fn get_transactions(
.await
.map_err(|_| ())?;
return Ok(res);
}
#[cfg(engine)]
{
let res = reqwest::get(&format!(
"{}transaction{}?page={}&size={}",
Config::new().api_url,
company_slug.unwrap_or_default(),
page,
size,
))
let res = reqwest::get(route)
.await
.map_err(|_| ())?
.json::<PaginatedResponse<TransactionCompany>>()
@ -45,4 +36,3 @@ pub async fn get_transactions(
return Ok(res);
}
}

@ -17,7 +17,7 @@ pub struct Transaction {
pub instrument: String,
pub volume: i32,
pub unit_price: f32,
pub created_at: NaiveDateTime,
pub created_at_utc: NaiveDateTime,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
@ -33,6 +33,6 @@ pub struct TransactionCompany {
pub instrument: String,
pub volume: i32,
pub unit_price: f32,
pub created_at: NaiveDateTime,
pub created_at_utc: NaiveDateTime,
pub company: Company,
}

@ -16,7 +16,7 @@ use crate::{
#[derive(Serialize, Deserialize, Clone, ReactiveState)]
#[rx(alias = "IndexPageStateRx")]
pub struct IndexPageState {
pub company_slug: String,
pub company_slug: Option<String>,
}
#[auto_scope]
@ -45,11 +45,7 @@ fn index_page<G: Html>(cx: Scope, state: &IndexPageStateRx) -> View<G> {
let paginated_table_state: PaginatedTableStateRx<TransactionCompany, _, _> =
PaginatedTableStateRx {
route: get_transactions,
filter: if (*state.company_slug.get()).is_empty() {
None
} else {
Some((*state.company_slug.get()).clone())
},
filter: (*state.company_slug.get()).clone(),
};
let async_select_prop: AsyncSelectRx<Company> = AsyncSelectRx {
@ -142,11 +138,7 @@ fn head(cx: Scope) -> View<SsrNode> {
async fn get_build_state(
StateGeneratorInfo { path, .. }: StateGeneratorInfo<()>,
) -> Result<IndexPageState, BlamedError<std::io::Error>> {
let company_slug: String = path
.split("transactions")
.nth(1)
.unwrap_or(&("/".to_owned() + &path))
.to_string();
let company_slug = if path.is_empty() { None } else { Some(path) };
Ok(IndexPageState { company_slug })
}

@ -11,7 +11,7 @@ impl MigrationTrait for Migration {
Table::alter()
.table(Transaction::Table)
.add_column(
ColumnDef::new(Transaction::CreatedAt)
ColumnDef::new(Transaction::CreatedAtUtc)
.date_time()
.not_null()
.default(Expr::current_timestamp()),
@ -23,7 +23,7 @@ impl MigrationTrait for Migration {
let query = Query::update()
.table(Transaction::Table)
.value(
Transaction::CreatedAt,
Transaction::CreatedAtUtc,
Expr::col(Transaction::DatePublished),
)
.to_owned();
@ -36,7 +36,7 @@ impl MigrationTrait for Migration {
.alter_table(
Table::alter()
.table(Transaction::Table)
.drop_column(Transaction::CreatedAt)
.drop_column(Transaction::CreatedAtUtc)
.to_owned(),
)
.await
@ -48,5 +48,5 @@ impl MigrationTrait for Migration {
enum Transaction {
Table,
DatePublished,
CreatedAt,
CreatedAtUtc,
}

@ -58,7 +58,7 @@ pub async fn paginate_also_related<E, R, T, K, C>(
size: Option<u64>,
column: Option<C>,
order: Option<Order>,
filter: Option<SimpleExpr>,
filters: Option<Vec<SimpleExpr>>,
) -> Result<PaginatedResponse<(T, Option<K>)>, DbErr>
where
E: EntityTrait + Related<R>,
@ -79,9 +79,11 @@ where
selector = E::find().find_also_related::<R>(R::default());
}
if let Some(fil) = filter {
if let Some(fils) = filters {
for fil in fils {
selector = selector.filter(fil);
}
}
let pages = selector.into_model().paginate(db, s);
let count = pages.num_items().await?;

@ -53,8 +53,7 @@ async fn start_rocket() -> Result<(), sea_orm_rocket::rocket::Error> {
routes![
route::company::get_all,
route::company::get_by_isin,
route::transaction::get_by_company_id,
route::transaction::get_all,
route::transaction::get_transactions,
route::in_process_transaction::get_all,
route::in_process_transaction::retry_failed_transaction,
route::in_process_transaction::retry_all

@ -21,7 +21,7 @@ pub struct Model {
pub instrument: String,
pub volume: i32,
pub unit_price: f32,
pub created_at: DateTime,
pub created_at_utc: DateTime,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]

@ -1,4 +1,4 @@
use chrono::{NaiveDate, NaiveDateTime};
use chrono::{Duration, NaiveDate, NaiveDateTime, Utc};
use rocket::http::Status;
use rocket::response::status::Custom;
use sea_orm::{ColumnTrait, Order};
@ -9,71 +9,45 @@ use serde::{Deserialize, Serialize};
use crate::db::paginate::{paginate_also_related, PaginatedResponse};
use crate::{db::Db, model};
#[get("/transaction?<page>&<size>")]
pub async fn get_all(
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TransactionCompany {
pub id: i32,
pub foreign_id: String,
pub date_published: NaiveDate,
pub date_executed: NaiveDate,
pub person: String,
pub exchange: String,
pub nature: String,
pub isin: Option<String>,
pub instrument: String,
pub volume: i32,
pub unit_price: f32,
pub created_at_utc: NaiveDateTime,
pub company: Option<model::company::Model>,
}
#[get("/transaction?<company_slug>&<page>&<size>&<hours>")]
pub async fn get_transactions(
conn: Connection<'_, Db>,
company_slug: Option<String>,
hours: Option<i64>,
page: Option<u64>,
size: Option<u64>,
) -> Result<Json<PaginatedResponse<TransactionCompany>>, Custom<String>> {
let res = paginate_also_related::<
model::transaction::Entity,
model::company::Entity,
model::transaction::Model,
model::company::Model,
model::transaction::Column,
>(
conn,
page,
size,
Some(model::transaction::Column::DatePublished),
Some(Order::Desc),
None,
)
.await
.map_err(|e| {
Custom(
Status::InternalServerError,
format!("Database error: {}", e),
let mut filters = vec![];
if let Some(c) = company_slug {
filters.push(model::company::Column::Slug.eq(c))
}
if let Some(h) = hours {
filters.push(
model::transaction::Column::CreatedAtUtc.gte(
Utc::now()
.naive_utc()
.checked_sub_signed(Duration::hours(h)),
),
)
})?;
let list = res
.list
.iter()
.map(|t| TransactionCompany {
id: t.0.id,
foreign_id: t.0.foreign_id.to_owned(),
date_published: t.0.date_published,
date_executed: t.0.date_executed,
person: t.0.person.to_owned(),
exchange: t.0.exchange.to_owned(),
nature: t.0.nature.to_owned(),
isin: t.0.isin.clone(),
instrument: t.0.instrument.to_owned(),
volume: t.0.volume,
unit_price: t.0.unit_price,
created_at: t.0.created_at,
company: t.1.to_owned(),
})
.collect();
let res = PaginatedResponse {
count: res.count,
num_pages: res.num_pages,
list,
};
Ok(Json(res))
}
#[get("/transaction/<company_slug>?<page>&<size>")]
pub async fn get_by_company_id(
conn: Connection<'_, Db>,
company_slug: String,
page: Option<u64>,
size: Option<u64>,
) -> Result<Json<PaginatedResponse<TransactionCompany>>, Custom<String>> {
let filter = model::company::Column::Slug.eq(company_slug);
let res = paginate_also_related::<
model::transaction::Entity,
model::company::Entity,
@ -86,7 +60,7 @@ pub async fn get_by_company_id(
size,
Some(model::transaction::Column::DatePublished),
Some(Order::Desc),
Some(filter),
Some(filters),
)
.await
.map_err(|e| {
@ -111,7 +85,7 @@ pub async fn get_by_company_id(
instrument: t.0.instrument.to_owned(),
volume: t.0.volume,
unit_price: t.0.unit_price,
created_at: t.0.created_at,
created_at_utc: t.0.created_at_utc,
company: t.1.to_owned(),
})
.collect();
@ -124,20 +98,3 @@ pub async fn get_by_company_id(
Ok(Json(res))
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TransactionCompany {
pub id: i32,
pub foreign_id: String,
pub date_published: NaiveDate,
pub date_executed: NaiveDate,
pub person: String,
pub exchange: String,
pub nature: String,
pub isin: Option<String>,
pub instrument: String,
pub volume: i32,
pub unit_price: f32,
pub created_at: NaiveDateTime,
pub company: Option<model::company::Model>,
}

Loading…
Cancel
Save