diff --git a/src/api.rs b/src/api.rs index 95b811d..e6d685f 100644 --- a/src/api.rs +++ b/src/api.rs @@ -3,7 +3,7 @@ use lootalot_db::{self as db, DbConnection, Update, Value}; pub type ItemListWithMods = Vec<(i32, Option)>; #[derive(Serialize, Deserialize, Debug)] -pub struct SellParams { +pub struct BuySellParams { pub items: ItemListWithMods, players: Option>, global_mod: Option, @@ -64,8 +64,8 @@ pub enum ApiActions { FetchNotifications(i32), FetchLoot(i32), UpdateWealth(i32, f64), - BuyItems(i32, Vec<(i32, Option)>), - SellItems(i32, SellParams), + BuyItems(i32, BuySellParams), + SellItems(i32, BuySellParams), ClaimItem(i32, i32), UnclaimItem(i32, i32), UndoLastAction(i32), @@ -119,19 +119,18 @@ pub fn execute( } ApiActions::BuyItems(id, params) => { // TODO: check that player has enough money ! - let mut cumulated_diff: Vec = Vec::with_capacity(params.len()); - let mut added_items: u16 = 0; - for (item_id, price_mod) in params.into_iter() { + let mut gains: Vec = Vec::with_capacity(params.items.len()); + for (item_id, price_mod) in params.items.into_iter() { if let Ok((item, diff)) = db::buy_item_from_inventory(conn, id, item_id, price_mod) { - cumulated_diff.push(diff); - response.push_update(Update::ItemAdded(item)); - added_items += 1; + response.push_update(item); + gains.push(diff); } else { response.push_error(format!("Error adding {}", item_id)); } } - let total_amount = cumulated_diff + let added_items = gains.len(); + let total_amount = gains .into_iter() .fold(db::Wealth::from_gp(0.0), |acc, i| acc + i); response.notify(format!( @@ -145,20 +144,19 @@ pub fn execute( // Behavior differs if player is group or regular. // Group sells item like players then split the total amount among players. ApiActions::SellItems(id, params) => { - let mut all_results: Vec = Vec::with_capacity(params.items.len()); - let mut sold_items: u16 = 0; + let mut gains: Vec = Vec::with_capacity(params.items.len()); for (loot_id, price_mod) in params.items.iter() { if let Ok((deleted, diff)) = db::sell_item_transaction(conn, id, *loot_id, *price_mod) { - all_results.push(diff); - response.push_update(Update::ItemRemoved(deleted)); - sold_items += 1; + response.push_update(deleted); + gains.push(diff); } else { response.push_error(format!("Erreur lors de la vente (loot_id : {})", loot_id)); } } - let total_amount = all_results + let sold_items = gains.len(); + let total_amount = gains .into_iter() .fold(db::Wealth::from_gp(0.0), |acc, i| acc + i); match id { @@ -214,7 +212,7 @@ pub fn execute( let mut added_items = 0; for item in items.into_iter() { if let Ok(added) = db::LootManager(conn, 0).add_from(&item) { - response.push_update(Update::ItemAdded(added)); + response.push_update(added); added_items += 1; } else { response.push_error(format!("Error adding {:?}", item)); diff --git a/src/server.rs b/src/server.rs index 1839517..b56f21a 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,7 +1,7 @@ use actix_cors::Cors; use actix_files as fs; use actix_web::{web, middleware, App, Error, HttpResponse, HttpServer, Either}; -use futures::{Future, IntoFuture}; +use futures::{Future}; use std::env; use lootalot_db as db; @@ -98,7 +98,7 @@ fn configure_app(config: &mut web::ServiceConfig) { db_call(pool, Q::FetchLoot(*player)) })) .route(web::put().to_async( - move |pool, (player, data): (PlayerId, web::Json)| { + move |pool, (player, data): (PlayerId, web::Json)| { db_call(pool, Q::BuyItems(*player, data.into_inner())) }, )) @@ -108,7 +108,7 @@ fn configure_app(config: &mut web::ServiceConfig) { }, )) .route(web::delete().to_async( - move |pool, (player, data): (PlayerId, web::Json)| { + move |pool, (player, data): (PlayerId, web::Json)| { db_call(pool, Q::SellItems(*player, data.into_inner())) }, )),