init
This commit is contained in:
+42
-11
@@ -1,6 +1,9 @@
|
||||
use crate::services::ServicesContext;
|
||||
use crate::models::category;
|
||||
use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, TransactionTrait, Set};
|
||||
use crate::models::server_item_order::{self, OrderedResourceType};
|
||||
use crate::services::ServicesContext;
|
||||
use sea_orm::{
|
||||
ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QuerySelect, Set, TransactionTrait,
|
||||
};
|
||||
use std::sync::Arc;
|
||||
use uuid::Uuid;
|
||||
|
||||
@@ -22,16 +25,40 @@ impl CategoryService {
|
||||
let db = &self.service_context.repositories.server.context.db;
|
||||
let event_bus = &self.service_context.event_bus;
|
||||
|
||||
let txn = db.begin().await?;
|
||||
let cat = db
|
||||
.transaction::<_, category::Model, anyhow::Error>(|txn| {
|
||||
Box::pin(async move {
|
||||
let active = category::ActiveModel {
|
||||
server_id: Set(server_id),
|
||||
name: Set(name),
|
||||
..Default::default()
|
||||
};
|
||||
let cat = active.insert(txn).await?;
|
||||
|
||||
let active = category::ActiveModel {
|
||||
server_id: Set(server_id),
|
||||
name: Set(name),
|
||||
..Default::default()
|
||||
};
|
||||
let cat = active.insert(&txn).await?;
|
||||
let max_order: Option<i64> = server_item_order::Entity::find()
|
||||
.filter(server_item_order::Column::ServerId.eq(server_id))
|
||||
.filter(server_item_order::Column::ParentCategoryId.is_null())
|
||||
.select_only()
|
||||
.column_as(server_item_order::Column::OrderKey.max(), "max_key")
|
||||
.into_tuple::<Option<i64>>()
|
||||
.one(txn)
|
||||
.await?
|
||||
.flatten();
|
||||
|
||||
txn.commit().await?;
|
||||
let order_item = server_item_order::ActiveModel {
|
||||
server_id: Set(server_id),
|
||||
resource_id: Set(cat.id),
|
||||
resource_type: Set(OrderedResourceType::Category),
|
||||
parent_category_id: Set(None),
|
||||
order_key: Set(max_order.unwrap_or(0) + 1),
|
||||
..Default::default()
|
||||
};
|
||||
order_item.insert(txn).await?;
|
||||
|
||||
Ok(cat)
|
||||
})
|
||||
})
|
||||
.await?;
|
||||
|
||||
event_bus.emit("category_created", cat.clone());
|
||||
|
||||
@@ -71,10 +98,14 @@ impl CategoryService {
|
||||
|
||||
let txn = db.begin().await?;
|
||||
|
||||
let res = category::Entity::delete_by_id(id)
|
||||
server_item_order::Entity::delete_many()
|
||||
.filter(server_item_order::Column::ResourceId.eq(id))
|
||||
.filter(server_item_order::Column::ResourceType.eq(OrderedResourceType::Category))
|
||||
.exec(&txn)
|
||||
.await?;
|
||||
|
||||
let res = category::Entity::delete_by_id(id).exec(&txn).await?;
|
||||
|
||||
let deleted = res.rows_affected > 0;
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
Reference in New Issue
Block a user