Fixed query building and dice track

This commit is contained in:
2024-12-22 16:59:35 -05:00
parent bd132d0c6b
commit b218cd50f2
11 changed files with 304 additions and 160 deletions

View File

@@ -10,6 +10,8 @@ use uuid::Uuid;
use crate::api::auth::{AuthCredential, AuthorizationMiddleware};
use crate::AppState;
use crate::bot::commands::fun::roll::{format_roll, parse_dice};
use crate::data::condition::Condition;
use crate::data::{ExecutableQuery, Value};
use crate::data::query::QueryBuilder;
use crate::error::{Error, SirenResult};
@@ -95,22 +97,26 @@ struct QueryDiceTrack {
}
impl QueryDiceTrack {
pub async fn find() -> SirenResult<Vec<Self>> {
let pool = crate::data::pool();
let query = QueryBuilder::new(TABLE_NAME)
// .where_condition(
// Condition::and(
// Condition::is_equal("guild_id", "$1"),
// Condition::and(
// Condition::is_equal("owner_id", "$2"),
//
// )
// )
// )
.build();
let items: Vec<QueryDiceTrack> = sqlx::query_as(&query.0).fetch_all(pool).await?;
Ok(items)
pub async fn find(dice: &InsertDiceTrack) -> Option<Self> {
QueryBuilder::new(TABLE_NAME)
.where_condition(Condition::and(
Condition::is_equal("guild_id", Value::BigInt(dice.guild_id)),
Condition::and(
Condition::is_equal("owner_id", Value::BigInt(dice.owner_id)),
Condition::and(
Condition::is_equal("dice", Value::Text(dice.dice.clone())),
Condition::and(
Condition::is_equal("user_id", Value::OptionalBigInt(dice.user_id)),
Condition::and(
Condition::is_equal("value", Value::OptionalInt(dice.value)),
Condition::is_equal("operator", Value::OptionalText(dice.operator.clone())),
),
),
),
),
))
.fetch_optional()
.await
}
}
@@ -168,7 +174,7 @@ pub async fn add_track_dice(
let dice = parse_dice(&payload.dice)?;
let dice = InsertDiceTrack {
let insert_dice = InsertDiceTrack {
guild_id: guild_id.get() as i64,
owner_id: owner_id.get() as i64,
dice: format_roll(dice.0, dice.1, dice.2),
@@ -180,6 +186,14 @@ pub async fn add_track_dice(
},
};
let dice_track = dice.insert().await?;
Ok(Json(dice_track))
// Check for existing dice tracks
let results = QueryDiceTrack::find(&insert_dice).await;
match results {
Some(dice_track) => Ok(Json(dice_track)),
None => {
let dice_track = insert_dice.insert().await?;
Ok(Json(dice_track))
}
}
}