1
0
mirror of https://git.ngram.ca/OpenJam/rc-servers synced 2026-08-23 23:08:52 +00:00

Add garage add, select, and re-order operations for #14

This commit is contained in:
NGnius (Graham)
2025-05-10 13:19:35 -04:00
parent e05649f09d
commit 221a5d5ca9
15 changed files with 420 additions and 34 deletions

View File

@@ -4,3 +4,15 @@ use sea_orm::FromQueryResult;
pub struct Id {
pub id: u32,
}
#[derive(FromQueryResult)]
pub struct SingleColumn<T: sea_orm::TryGetable> {
pub column: T,
}
impl <T: sea_orm::TryGetable> std::ops::Deref for SingleColumn<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.column
}
}

View File

@@ -39,4 +39,5 @@ pub enum Descriptor {
UserRank, // u32
UserFreeCurrency, // u64
UserPaidCurrency, // u64
GarageSlotOrder, // Vec<u32>,
}

View File

@@ -1,5 +1,5 @@
use sea_orm_migration::MigratorTrait;
use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect};
use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect, TransactionTrait};
pub struct Database {
orm: sea_orm::DatabaseConnection,
@@ -46,6 +46,26 @@ impl Database {
Ok(())
}
pub async fn update_user_aux_by_user_id_and_descriptor(&self, mut entity: crate::schema::user_aux::ActiveModel, user_id: u32, descriptor: crate::schema::user_aux::Descriptor) -> Result<Option<crate::schema::user_aux::Model>, sea_orm::DbErr> {
let id_opt = crate::schema::user_aux::Entity::find()
.select_only()
.column(crate::schema::user_aux::Column::Id)
.filter(crate::schema::user_aux::Column::UserId.eq(user_id))
.filter(crate::schema::user_aux::Column::Descriptor.eq(descriptor.clone()))
.into_model::<crate::schema::common_query::Id>()
.one(&self.orm)
.await?;
if let Some(id) = id_opt {
// update
entity.id = sea_orm::ActiveValue::Set(id.id);
Ok(Some(crate::schema::user_aux::Entity::update(entity)
.exec(&self.orm)
.await?))
} else {
Ok(None)
}
}
pub async fn perms_by_user_id(&self, user_id: u32) -> Result<Option<crate::schema::permissions::Model>, sea_orm::DbErr> {
crate::schema::permissions::Entity::find()
.filter(crate::schema::permissions::Column::UserId.eq(user_id))
@@ -57,6 +77,17 @@ impl Database {
entity.insert(&self.orm).await
}
pub async fn garage_max_slot_by_user_id(&self, user_id: u32) -> Result<u32, sea_orm::DbErr> {
let result = crate::schema::garage::Entity::find()
.select_only()
.column_as(crate::schema::garage::Column::Slot.max(), "column")
.filter(crate::schema::garage::Column::UserId.eq(user_id))
.into_model::<crate::schema::common_query::SingleColumn<u32>>()
.one(&self.orm)
.await?;
Ok(result.map(|x| *x).unwrap_or(0))
}
pub async fn garage_selected(&self, user_id: u32) -> Result<Option<crate::schema::garage::Model>, sea_orm::DbErr> {
crate::schema::garage::Entity::find()
.filter(crate::schema::garage::Column::UserId.eq(user_id))
@@ -86,12 +117,16 @@ impl Database {
Ok(())
}
pub async fn update_garage(&self, entity: crate::schema::garage::ActiveModel, id: u32) -> Result<crate::schema::garage::Model, sea_orm::DbErr> {
pub async fn insert_garage(&self, entity: crate::schema::garage::ActiveModel) -> Result<crate::schema::garage::Model, sea_orm::DbErr> {
entity.insert(&self.orm).await
}
/*pub async fn update_garage(&self, entity: crate::schema::garage::ActiveModel, id: u32) -> Result<crate::schema::garage::Model, sea_orm::DbErr> {
crate::schema::garage::Entity::update(entity)
.filter(crate::schema::garage::Column::Id.eq(id))
.exec(&self.orm)
.await
}
}*/
pub async fn update_garage_by_user_id_and_slot(&self, mut entity: crate::schema::garage::ActiveModel, user_id: u32, slot: u32) -> Result<Option<crate::schema::garage::Model>, sea_orm::DbErr> {
let id_opt = crate::schema::garage::Entity::find()
@@ -110,6 +145,33 @@ impl Database {
} else {
Ok(None)
}
}
pub async fn update_garage_selected_by_user_id_and_slot(&self, user_id: u32, slot: u32) -> Result<(), sea_orm::DbErr> {
self.orm.transaction(|txn| {
Box::pin(async move {
crate::schema::garage::Entity::update_many()
.col_expr(crate::schema::garage::Column::Selected, sea_orm::sea_query::Expr::value(false))
.filter(crate::schema::garage::Column::UserId.eq(user_id))
.filter(crate::schema::garage::Column::Slot.ne(slot))
.exec(txn)
.await?;
crate::schema::garage::Entity::update_many()
.col_expr(crate::schema::garage::Column::Selected, sea_orm::sea_query::Expr::value(true))
.filter(crate::schema::garage::Column::UserId.eq(user_id))
.filter(crate::schema::garage::Column::Slot.eq(slot))
.exec(txn)
.await?;
Ok(())
})
}).await.map_err(|e| {
match e {
sea_orm::TransactionError::Connection(db) => db,
sea_orm::TransactionError::Transaction(txn) => txn,
}
})?;
Ok(())
}
}