Add some abstraction

This commit is contained in:
eraden 2023-06-13 07:20:05 +02:00
parent 87fb672497
commit 6f0fc918df
2 changed files with 169 additions and 6 deletions

View File

@ -84,6 +84,71 @@ impl CreateIndexExt for SchemaManager<'_> {
} }
} }
#[async_trait]
pub trait CreateBridgeTable: CreateIndexExt {
async fn create_bridge_table<T, C1, C2>(
&self,
table: T,
col1: C1,
col2: C2,
) -> Result<(), DbErr>
where
T: IntoIden + Copy + 'static + Sync + Send,
C1: IntoIden + Copy + 'static + Sync + Send,
C2: IntoIden + Copy + 'static + Sync + Send;
}
#[async_trait]
impl CreateBridgeTable for SchemaManager<'_> {
async fn create_bridge_table<T, C1, C2>(
&self,
table: T,
col1: C1,
col2: C2,
) -> Result<(), DbErr>
where
T: IntoIden + Copy + 'static + Sync + Send,
C1: IntoIden + Copy + 'static + Sync + Send,
C2: IntoIden + Copy + 'static + Sync + Send,
{
self.create_table(
Table::create()
.table(table)
.col(col1.col().uuid().not_null())
.col(col2.col().uuid().not_null())
.to_owned(),
)
.await?;
self.create_2col_idx(table, col1, col2).await?;
Ok(())
}
}
#[async_trait]
pub trait CreateTableExt {
async fn build_table<Enum>(&self, table: Enum, fields: Vec<ColumnDef>) -> Result<(), DbErr>
where
Enum: IntoIden + Copy + 'static + Sync + Send;
}
#[async_trait]
impl CreateTableExt for SchemaManager<'_> {
async fn build_table<Enum>(&self, table: Enum, mut fields: Vec<ColumnDef>) -> Result<(), DbErr>
where
Enum: IntoIden + Copy + 'static + Sync + Send,
{
let mut t = Table::create();
t.table(table);
fields.iter_mut().for_each(|col| {
t.col(col);
});
self.create_table(t).await?;
Ok(())
}
}
pub fn to_pk2_name<T1: IntoIden, C1: IntoIden, C2: IntoIden>(t1: T1, c1: C1, c2: C2) -> String { pub fn to_pk2_name<T1: IntoIden, C1: IntoIden, C2: IntoIden>(t1: T1, c1: C1, c2: C2) -> String {
let t1 = to_snake(t1.into_iden().to_string()); let t1 = to_snake(t1.into_iden().to_string());
let c1 = to_snake(c1.into_iden().to_string()); let c1 = to_snake(c1.into_iden().to_string());

View File

@ -3,8 +3,8 @@ use sea_orm_migration::prelude::*;
use crate::constraint::Check; use crate::constraint::Check;
use crate::sea_orm::Iterable; use crate::sea_orm::Iterable;
use crate::{ use crate::{
auto_uuid_not_null, ts_def_now_not_null, AsIden, CreateConstraint, CreateIndexExt, DropTable, auto_uuid_not_null, ts_def_now_not_null, AsIden, CreateBridgeTable, CreateConstraint,
IntoColumnDef, CreateIndexExt, DropTable, IntoColumnDef,
}; };
#[derive(DeriveMigrationName)] #[derive(DeriveMigrationName)]
@ -13,10 +13,55 @@ pub struct Migration;
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, m: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, m: &SchemaManager) -> Result<(), DbErr> {
self.create_price_lists(m).await?;
self.create_price_list_customer_groups(m).await?;
self.create_products(m).await?;
self.create_product_categories(m).await?;
self.create_product_category_products(m).await?;
self.create_product_collections(m).await?;
self.create_product_images(m).await?;
self.create_product_options(m).await?;
self.create_product_option_values(m).await?;
self.create_product_sales_channels(m).await?;
self.create_product_tags(m).await?;
self.create_product_to_tags(m).await?;
self.create_product_tax_rates(m).await?;
self.create_product_types(m).await?;
self.create_product_type_tax_rates(m).await?;
self.create_product_variants(m).await?;
self.create_product_variant_inventory_items(m).await?;
self.create_money_amounts(m).await?;
Ok(()) Ok(())
} }
async fn down(&self, m: &SchemaManager) -> Result<(), DbErr> { async fn down(&self, m: &SchemaManager) -> Result<(), DbErr> {
self.drop_table(m, PriceList::PriceLists).await?;
self.drop_table(m, PriceListCustomerGroup::PriceListCustomerGroups)
.await?;
self.drop_table(m, Product::Products).await?;
self.drop_table(m, ProductCategory::ProductCategories)
.await?;
self.drop_table(m, ProductCategoryProduct::ProductCategoryProducts)
.await?;
self.drop_table(m, ProductCollection::ProductCollections)
.await?;
self.drop_table(m, ProductImage::ProductImages).await?;
self.drop_table(m, ProductOption::ProductOptions).await?;
self.drop_table(m, ProductOptionValue::ProductOptionValues)
.await?;
self.drop_table(m, ProductSalesChannel::ProductSalesChannels)
.await?;
self.drop_table(m, ProductTag::ProductTags).await?;
self.drop_table(m, ProductToTag::ProductToTags).await?;
self.drop_table(m, ProductTaxRate::ProductTaxRates).await?;
self.drop_table(m, ProductType::ProductTypes).await?;
self.drop_table(m, ProductTypeTaxRate::ProductTypeTaxRates)
.await?;
self.drop_table(m, ProductVariant::ProductVariants).await?;
self.drop_table(m, ProductVariantInventoryItem::ProductVariantInventoryItems)
.await?;
self.drop_table(m, MoneyAmount::MoneyAmounts).await?;
Ok(()) Ok(())
} }
} }
@ -40,6 +85,41 @@ impl Migration {
async fn create_price_lists(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> { async fn create_price_lists(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use PriceList::*; use PriceList::*;
m.create_table(
Table::create()
.table(PriceLists)
.col(auto_uuid_not_null!(Id))
.col(Name.col().string().not_null())
.col(Description.col().string().not_null())
.col(
PriceListType
.col()
.enumeration(
crate::types::PriceListType::PriceListTypes,
crate::types::PriceListType::iter().skip(1),
)
.default(crate::types::PriceListType::Sale.to_string())
.not_null(),
)
.col(
Status
.col()
.enumeration(
crate::types::PriceListStatus::PriceListStatuses,
crate::types::PriceListStatus::iter().skip(1),
)
.default(crate::types::PriceListStatus::Draft.to_string())
.not_null(),
)
.col(StartsAt.col().timestamp())
.col(EndsAt.col().timestamp())
.col(ts_def_now_not_null!(CreatedAt))
.col(ts_def_now_not_null!(UpdatedAt))
.col(DeletedAt.col().timestamp())
.to_owned(),
)
.await?;
Ok(()) Ok(())
} }
/// ```sql /// ```sql
@ -52,6 +132,9 @@ impl Migration {
async fn create_price_list_customer_groups(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> { async fn create_price_list_customer_groups(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use PriceListCustomerGroup::*; use PriceListCustomerGroup::*;
m.create_bridge_table(PriceListCustomerGroups, PriceListId, CustomerGroupId)
.await?;
Ok(()) Ok(())
} }
/// ```sql /// ```sql
@ -109,6 +192,9 @@ impl Migration {
async fn create_product_categories(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> { async fn create_product_categories(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use ProductCategory::*; use ProductCategory::*;
m.create_constraint(ProductCategories, Check::greater_eq(Rank, 0.iden()), None)
.await?;
Ok(()) Ok(())
} }
/// ```sql /// ```sql
@ -121,6 +207,9 @@ impl Migration {
async fn create_product_category_products(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> { async fn create_product_category_products(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use ProductCategoryProduct::*; use ProductCategoryProduct::*;
m.create_bridge_table(ProductCategoryProducts, ProductCategoryId, ProductId)
.await?;
Ok(()) Ok(())
} }
/// ```sql /// ```sql
@ -150,6 +239,9 @@ impl Migration {
async fn create_product_images(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> { async fn create_product_images(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use ProductImage::*; use ProductImage::*;
m.create_bridge_table(ProductImages, ProductId, ImageId)
.await?;
Ok(()) Ok(())
} }
/// ```sql /// ```sql
@ -197,6 +289,9 @@ impl Migration {
async fn create_product_sales_channels(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> { async fn create_product_sales_channels(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use ProductSalesChannel::*; use ProductSalesChannel::*;
m.create_bridge_table(ProductSalesChannels, ProductId, SalesChannelId)
.await?;
Ok(()) Ok(())
} }
/// ```sql /// ```sql
@ -225,6 +320,9 @@ impl Migration {
async fn create_product_to_tags(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> { async fn create_product_to_tags(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use ProductToTag::*; use ProductToTag::*;
m.create_bridge_table(ProductToTags, ProductId, ProductTagId)
.await?;
Ok(()) Ok(())
} }
/// ```sql /// ```sql
@ -302,7 +400,7 @@ impl Migration {
/// ); /// );
/// ``` /// ```
async fn create_product_variants(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> { async fn create_product_variants(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use ::*; use ProductVariant::*;
Ok(()) Ok(())
} }
@ -319,11 +417,11 @@ impl Migration {
/// ); /// );
/// ``` /// ```
async fn create_product_variant_inventory_items( async fn create_product_variant_inventory_items(
use ::*;
&self, &self,
m: &SchemaManager<'_>, m: &SchemaManager<'_>,
) -> Result<(), DbErr> { ) -> Result<(), DbErr> {
use ProductVariantInventoryItem::*;
Ok(()) Ok(())
} }
/// ```sql /// ```sql
@ -343,7 +441,7 @@ impl Migration {
/// ); /// );
/// ``` /// ```
async fn create_money_amounts(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> { async fn create_money_amounts(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use ::*; use MoneyAmount::*;
Ok(()) Ok(())
} }