From 791d32d0d844f9c3f8217ce296a114a30eddb4a4 Mon Sep 17 00:00:00 2001 From: eraden Date: Sun, 1 May 2022 18:25:27 +0200 Subject: [PATCH] Admin get all orders --- api/src/actors/database/account_orders.rs | 1 + api/src/actors/database/order_items.rs | 1 + api/src/main.rs | 2 ++ api/src/model.rs | 8 +++-- api/src/model/api.rs | 44 +++++++++++++++++++++++ api/src/routes/admin/api_v1.rs | 4 ++- api/src/routes/admin/api_v1/orders.rs | 24 +++++++++++++ 7 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 api/src/model/api.rs create mode 100644 api/src/routes/admin/api_v1/orders.rs diff --git a/api/src/actors/database/account_orders.rs b/api/src/actors/database/account_orders.rs index a29f248..e2c6adf 100644 --- a/api/src/actors/database/account_orders.rs +++ b/api/src/actors/database/account_orders.rs @@ -33,6 +33,7 @@ pub(crate) async fn all_account_orders( r#" SELECT id, buyer_id, status, order_id, order_ext_id FROM account_orders +ORDER BY id DESC "#, ) .fetch_all(&pool) diff --git a/api/src/actors/database/order_items.rs b/api/src/actors/database/order_items.rs index ecf4339..f767884 100644 --- a/api/src/actors/database/order_items.rs +++ b/api/src/actors/database/order_items.rs @@ -28,6 +28,7 @@ pub(crate) async fn all_order_items(_msg: AllOrderItems, pool: PgPool) -> Result r#" SELECT id, product_id, order_id, quantity, quantity_unit FROM order_items +ORDER BY id DESC "#, ) .fetch_all(&pool) diff --git a/api/src/main.rs b/api/src/main.rs index 4b306b9..7c0eb10 100644 --- a/api/src/main.rs +++ b/api/src/main.rs @@ -1,3 +1,5 @@ +#![feature(drain_filter)] + use std::io::Write; use actix::Actor; diff --git a/api/src/model.rs b/api/src/model.rs index c7b7969..f3acd6c 100644 --- a/api/src/model.rs +++ b/api/src/model.rs @@ -1,3 +1,5 @@ +pub mod api; + use std::fmt::Formatter; use std::str::FromStr; @@ -503,12 +505,12 @@ pub struct Stock { pub quantity_unit: QuantityUnit, } -#[derive(sqlx::Type, Serialize, Deserialize, Copy, Clone, Debug, Display, Deref)] +#[derive(sqlx::Type, Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Display, Deref)] #[sqlx(transparent)] #[serde(transparent)] pub struct AccountOrderId(RecordId); -#[derive(sqlx::Type, Serialize, Deserialize, Display, Deref)] +#[derive(sqlx::Type, Serialize, Deserialize, Clone, Debug, PartialEq, Display, Deref)] #[sqlx(transparent)] #[serde(transparent)] pub struct OrderId(String); @@ -554,7 +556,7 @@ impl From for PublicAccountOrder { #[serde(transparent)] pub struct OrderItemId(pub RecordId); -#[derive(sqlx::FromRow, Serialize, Deserialize)] +#[derive(sqlx::FromRow, Serialize, Deserialize, Debug)] pub struct OrderItem { pub id: OrderItemId, pub product_id: ProductId, diff --git a/api/src/model/api.rs b/api/src/model/api.rs new file mode 100644 index 0000000..6ff669f --- /dev/null +++ b/api/src/model/api.rs @@ -0,0 +1,44 @@ +use serde::Serialize; + +use crate::model; +use crate::model::{AccountId, AccountOrderId, OrderId, OrderItem, OrderStatus}; + +#[derive(Serialize, Debug)] +#[serde(transparent)] +pub struct AccountOrders(pub Vec); + +impl From<(Vec, Vec)> for AccountOrders { + fn from((orders, mut items): (Vec, Vec)) -> Self { + Self( + orders + .into_iter() + .map( + |model::AccountOrder { + id, + buyer_id, + status, + order_id, + order_ext_id: _, + }| { + AccountOrder { + id, + buyer_id, + status, + order_id, + items: items.drain_filter(|item| item.order_id == id).collect(), + } + }, + ) + .collect(), + ) + } +} + +#[derive(Serialize, Debug)] +pub struct AccountOrder { + pub id: AccountOrderId, + pub buyer_id: AccountId, + pub status: OrderStatus, + pub order_id: Option, + pub items: Vec, +} diff --git a/api/src/routes/admin/api_v1.rs b/api/src/routes/admin/api_v1.rs index 616b022..6b82988 100644 --- a/api/src/routes/admin/api_v1.rs +++ b/api/src/routes/admin/api_v1.rs @@ -1,4 +1,5 @@ mod accounts; +mod orders; mod products; mod stocks; @@ -9,6 +10,7 @@ pub fn configure(config: &mut ServiceConfig) { scope("/api/v1") .configure(products::configure) .configure(stocks::configure) - .configure(accounts::configure), + .configure(accounts::configure) + .configure(orders::configure), ); } diff --git a/api/src/routes/admin/api_v1/orders.rs b/api/src/routes/admin/api_v1/orders.rs new file mode 100644 index 0000000..847c851 --- /dev/null +++ b/api/src/routes/admin/api_v1/orders.rs @@ -0,0 +1,24 @@ +use actix::Addr; +use actix_session::Session; +use actix_web::web::{Data, Json, ServiceConfig}; +use actix_web::{delete, get, patch, post}; + +use crate::database::Database; +use crate::model::api::AccountOrders; +use crate::routes::admin::Error; +use crate::routes::RequireLogin; +use crate::{admin_send_db, database, model, routes}; + +#[get("/orders")] +async fn orders(session: Session, db: Data>) -> routes::Result> { + session.require_admin()?; + + let orders: Vec = admin_send_db!(&db, database::AllAccountOrders); + let items: Vec = admin_send_db!(db, database::AllOrderItems); + + Ok(Json((orders, items).into())) +} + +pub fn configure(config: &mut ServiceConfig) { + config.service(orders); +}