bazzar/migration/src/stores/m20230603_120810_store_ext.rs
2023-06-19 17:09:53 +02:00

245 lines
7.0 KiB
Rust

use sea_orm_migration::prelude::*;
use crate::*;
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, m: &SchemaManager) -> Result<(), DbErr> {
self.create_stores(m).await?;
self.create_store_currencies(m).await?;
self.create_tax_providers(m).await?;
self.create_tax_rates(m).await?;
self.create_region_fulfillment_providers(m).await?;
self.create_region_payment_providers(m).await?;
Ok(())
}
async fn down(&self, m: &SchemaManager) -> Result<(), DbErr> {
self.drop_table(m, Store::Stores).await?;
self.drop_table(m, StoreCurrency::StoreCurrencies).await?;
self.drop_table(m, TaxProvider::TaxProviders).await?;
self.drop_table(m, TaxRate::TaxRates).await?;
self.drop_table(m, RegionFulfillmentProvider::RegionFulfillmentProviders)
.await?;
self.drop_table(m, RegionPaymentProvider::RegionPaymentProviders)
.await?;
Ok(())
}
}
impl Migration {
/// ```sql
/// CREATE TABLE stores
/// (
/// id uuid NOT NULL,
/// name character varying DEFAULT 'Bazaar'::character varying NOT NULL,
/// default_currency_code character varying DEFAULT 'pln'::character varying NOT NULL,
/// swap_link_template character varying,
/// created_at timestamp with time zone DEFAULT now() NOT NULL,
/// updated_at timestamp with time zone DEFAULT now() NOT NULL,
/// metadata jsonb,
/// payment_link_template character varying,
/// invite_link_template character varying,
/// default_sales_channel_id uuid,
/// default_location_id uuid
/// );
/// ```
async fn create_stores(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use Store::*;
m.build_table(
Stores,
&mut [
Id.col().uuid().not_null().primary_key().default_gen_uuid(),
Name.col().string().default("Bazzar".to_string()).not_null(),
DefaultCurrencyCode.col().string().default("pln").not_null(),
SwapLinkTemplate.col().string(),
CreatedAt.col().timestamp().not_null().default_now(),
UpdatedAt.col().timestamp().not_null().default_now(),
Metadata.col().json_binary(),
PaymentLinkTemplate.col().string(),
InviteLinkTemplate.col().string(),
DefaultSalesChannelId.col().uuid(),
DefaultLocationId.col().uuid(),
],
)
.await?;
Ok(())
}
/// ```sql
/// CREATE TABLE store_currencies
/// (
/// store_id uuid NOT NULL,
/// currency_code character varying NOT NULL
/// );
/// ```
async fn create_store_currencies(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use StoreCurrency::*;
m.create_table(
Table::create()
.table(StoreCurrencies)
.col(StoreId.col().uuid().not_null())
.col(CurrencyCode.col().string().not_null())
.primary_key(&mut m.bridge_primary_key(StoreCurrencies, StoreId, CurrencyCode))
.to_owned(),
)
.await?;
Ok(())
}
/// ```sql
/// CREATE TABLE tax_providers
/// (
/// id uuid NOT NULL,
/// is_installed boolean DEFAULT true NOT NULL
/// );
/// ```
async fn create_tax_providers(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use TaxProvider::*;
m.build_table(
TaxProviders,
&mut [
Id.col().uuid().not_null().default_gen_uuid().primary_key(),
IsInstalled.col().boolean().default(true).not_null(),
],
)
.await?;
Ok(())
}
/// ```sql
/// CREATE TABLE tax_rates
/// (
/// id uuid NOT NULL,
/// rate real,
/// code character varying,
/// name character varying NOT NULL,
/// region_id uuid NOT NULL,
/// created_at timestamp with time zone DEFAULT now() NOT NULL,
/// updated_at timestamp with time zone DEFAULT now() NOT NULL,
/// metadata jsonb
/// );
/// ```
async fn create_tax_rates(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use TaxRate::*;
m.build_table(
TaxRates,
&mut [
Id.col().uuid().primary_key().default_gen_uuid(),
Rate.col().double(),
Code.col().string(),
Name.col().string().not_null(),
RegionId.col().uuid().not_null(),
CreatedAt.col().timestamp().not_null().default_now(),
UpdatedAt.col().timestamp().not_null().default_now(),
Metadata.col().json_binary(),
],
)
.await?;
Ok(())
}
/// ```sql
/// CREATE TABLE region_fulfillment_providers
/// (
/// region_id uuid NOT NULL,
/// provider_id uuid NOT NULL
/// );
/// ```
async fn create_region_fulfillment_providers(
&self,
m: &SchemaManager<'_>,
) -> Result<(), DbErr> {
use RegionFulfillmentProvider::*;
m.create_bridge_table(RegionFulfillmentProviders, RegionId, ProviderId)
.await?;
Ok(())
}
/// ```sql
/// CREATE TABLE region_payment_providers
/// (
/// region_id uuid NOT NULL,
/// provider_id uuid NOT NULL
/// );
/// ```
async fn create_region_payment_providers(&self, m: &SchemaManager<'_>) -> Result<(), DbErr> {
use RegionPaymentProvider::*;
m.create_bridge_table(RegionPaymentProviders, RegionId, ProviderId)
.await?;
Ok(())
}
}
#[derive(Iden, Clone, Copy)]
pub enum Store {
Stores,
Id,
Name,
DefaultCurrencyCode,
SwapLinkTemplate,
CreatedAt,
UpdatedAt,
Metadata,
PaymentLinkTemplate,
InviteLinkTemplate,
DefaultSalesChannelId,
DefaultLocationId,
}
#[derive(Iden, Clone, Copy)]
pub enum StoreCurrency {
StoreCurrencies,
StoreId,
CurrencyCode,
}
#[derive(Iden, Clone, Copy)]
pub enum TaxProvider {
TaxProviders,
Id,
IsInstalled,
}
#[derive(Iden, Clone, Copy)]
pub enum TaxRate {
TaxRates,
Id,
Rate,
Code,
Name,
RegionId,
CreatedAt,
UpdatedAt,
Metadata,
}
#[derive(Iden, Clone, Copy)]
pub enum RegionFulfillmentProvider {
RegionFulfillmentProviders,
RegionId,
ProviderId,
}
#[derive(Iden, Clone, Copy)]
pub enum RegionPaymentProvider {
RegionPaymentProviders,
RegionId,
ProviderId,
}