Prevent race conditions

- This is a massive cope, I don't know how to code

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2024-01-17 17:16:37 +00:00
parent 36ee6030ce
commit 7200447bc5
23 changed files with 510 additions and 311 deletions

View File

@@ -1,12 +1,14 @@
use crate::config::{Config, ALPACA_ASSET_API_URL};
use crate::database;
use crate::types::{
alpaca::api::incoming::{self, asset::Status},
asset, Asset, BroadcastMessage,
use crate::{
config::{Config, ALPACA_ASSET_API_URL},
database,
state::{self, BroadcastMessage},
types::{
alpaca::api::incoming::{self, asset::Status},
Asset,
},
};
use axum::{extract::Path, Extension, Json};
use http::StatusCode;
use log::info;
use serde::Deserialize;
use std::sync::Arc;
use tokio::sync::broadcast::Sender;
@@ -35,7 +37,7 @@ pub struct AddAssetRequest {
pub async fn add(
Extension(app_config): Extension<Arc<Config>>,
Extension(broadcast_sender): Extension<Sender<BroadcastMessage>>,
Extension(broadcast_bus_sender): Extension<Sender<BroadcastMessage>>,
Json(request): Json<AddAssetRequest>,
) -> Result<(StatusCode, Json<Asset>), StatusCode> {
if database::assets::select_where_symbol(&app_config.clickhouse_client, &request.symbol)
@@ -66,22 +68,19 @@ pub async fn add(
}
let asset = Asset::from(asset);
database::assets::upsert(&app_config.clickhouse_client, &asset).await;
broadcast_sender
broadcast_bus_sender
.send(BroadcastMessage::Asset((
asset::BroadcastMessage::Added,
state::asset::BroadcastMessage::Add,
vec![asset.clone()],
)))
.unwrap();
info!("Added asset {}.", asset.symbol);
Ok((StatusCode::CREATED, Json(asset)))
}
pub async fn delete(
Extension(app_config): Extension<Arc<Config>>,
Extension(broadcast_sender): Extension<Sender<BroadcastMessage>>,
Extension(broadcast_bus_sender): Extension<Sender<BroadcastMessage>>,
Path(symbol): Path<String>,
) -> Result<StatusCode, StatusCode> {
let asset = database::assets::select_where_symbol(&app_config.clickhouse_client, &symbol)
@@ -89,15 +88,12 @@ pub async fn delete(
.ok_or(StatusCode::NOT_FOUND)
.unwrap();
broadcast_sender
broadcast_bus_sender
.send(BroadcastMessage::Asset((
asset::BroadcastMessage::Deleted,
vec![asset.clone()],
state::asset::BroadcastMessage::Delete,
vec![asset],
)))
.unwrap();
database::assets::delete_where_symbol(&app_config.clickhouse_client, &symbol).await;
info!("Deleted asset {}.", symbol);
Ok(StatusCode::NO_CONTENT)
}