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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,4 +39,5 @@ pub enum Descriptor {
|
||||
UserRank, // u32
|
||||
UserFreeCurrency, // u64
|
||||
UserPaidCurrency, // u64
|
||||
GarageSlotOrder, // Vec<u32>,
|
||||
}
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user