92 lines
3.1 KiB
Rust
92 lines
3.1 KiB
Rust
use loco_rs::schema::*;
|
|
use sea_orm_migration::prelude::*;
|
|
|
|
#[derive(DeriveMigrationName)]
|
|
pub struct Migration;
|
|
|
|
#[async_trait::async_trait]
|
|
impl MigrationTrait for Migration {
|
|
async fn up(&self, m: &SchemaManager) -> Result<(), DbErr> {
|
|
// A reusable, named discount layer: a percentage (basis points, 5% = 500)
|
|
// over a product scope. `scope_type` is 'include' (covers the listed
|
|
// products) or 'all_except' (covers everything but the listed products).
|
|
create_table(
|
|
m,
|
|
"discount_profiles",
|
|
&[
|
|
("id", ColType::PkAuto),
|
|
("name", ColType::String),
|
|
("percent_bp", ColType::Integer),
|
|
("scope_type", ColType::StringWithDefault("include".to_string())),
|
|
],
|
|
&[],
|
|
)
|
|
.await?;
|
|
|
|
// Which products the scope lists (meaning depends on scope_type).
|
|
create_table(
|
|
m,
|
|
"discount_profile_products",
|
|
&[("id", ColType::PkAuto)],
|
|
&[("discount_profile", ""), ("product", "")],
|
|
)
|
|
.await?;
|
|
m.create_index(
|
|
Index::create()
|
|
.name("idx_discount_profile_products_unique")
|
|
.table(Alias::new("discount_profile_products"))
|
|
.col(Alias::new("discount_profile_id"))
|
|
.col(Alias::new("product_id"))
|
|
.unique()
|
|
.to_owned(),
|
|
)
|
|
.await?;
|
|
|
|
// Which profiles a business account has (mixable).
|
|
create_table(
|
|
m,
|
|
"account_discount_profiles",
|
|
&[("id", ColType::PkAuto)],
|
|
&[("user", ""), ("discount_profile", "")],
|
|
)
|
|
.await?;
|
|
m.create_index(
|
|
Index::create()
|
|
.name("idx_account_discount_profiles_unique")
|
|
.table(Alias::new("account_discount_profiles"))
|
|
.col(Alias::new("user_id"))
|
|
.col(Alias::new("discount_profile_id"))
|
|
.unique()
|
|
.to_owned(),
|
|
)
|
|
.await?;
|
|
|
|
// The admin's chosen winning profile when two assigned profiles cover the
|
|
// same product for an account (collision resolution).
|
|
create_table(
|
|
m,
|
|
"account_product_resolutions",
|
|
&[("id", ColType::PkAuto)],
|
|
&[("user", ""), ("product", ""), ("discount_profile", "")],
|
|
)
|
|
.await?;
|
|
m.create_index(
|
|
Index::create()
|
|
.name("idx_account_product_resolutions_unique")
|
|
.table(Alias::new("account_product_resolutions"))
|
|
.col(Alias::new("user_id"))
|
|
.col(Alias::new("product_id"))
|
|
.unique()
|
|
.to_owned(),
|
|
)
|
|
.await
|
|
}
|
|
|
|
async fn down(&self, m: &SchemaManager) -> Result<(), DbErr> {
|
|
drop_table(m, "account_product_resolutions").await?;
|
|
drop_table(m, "account_discount_profiles").await?;
|
|
drop_table(m, "discount_profile_products").await?;
|
|
drop_table(m, "discount_profiles").await
|
|
}
|
|
}
|