use sea_orm_migration::prelude::*; #[derive(DeriveMigrationName)] pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { // 1. plugins 表 — 插件注册与生命周期 manager .create_table( Table::create() .table(Alias::new("plugins")) .if_not_exists() .col( ColumnDef::new(Alias::new("id")) .uuid() .not_null() .primary_key(), ) .col(ColumnDef::new(Alias::new("tenant_id")).uuid().not_null()) .col(ColumnDef::new(Alias::new("name")).string_len(200).not_null()) .col(ColumnDef::new(Alias::new("plugin_version")).string_len(50).not_null()) .col(ColumnDef::new(Alias::new("description")).text().null()) .col(ColumnDef::new(Alias::new("author")).string_len(200).null()) .col( ColumnDef::new(Alias::new("status")) .string_len(20) .not_null() .default("uploaded"), ) .col(ColumnDef::new(Alias::new("manifest_json")).json().not_null()) .col(ColumnDef::new(Alias::new("wasm_binary")).binary().not_null()) .col(ColumnDef::new(Alias::new("wasm_hash")).string_len(64).not_null()) .col( ColumnDef::new(Alias::new("config_json")) .json() .not_null() .default(Expr::val("{}")), ) .col(ColumnDef::new(Alias::new("error_message")).text().null()) .col(ColumnDef::new(Alias::new("installed_at")).timestamp_with_time_zone().null()) .col(ColumnDef::new(Alias::new("enabled_at")).timestamp_with_time_zone().null()) // 标准字段 .col( ColumnDef::new(Alias::new("created_at")) .timestamp_with_time_zone() .not_null() .default(Expr::current_timestamp()), ) .col( ColumnDef::new(Alias::new("updated_at")) .timestamp_with_time_zone() .not_null() .default(Expr::current_timestamp()), ) .col(ColumnDef::new(Alias::new("created_by")).uuid().null()) .col(ColumnDef::new(Alias::new("updated_by")).uuid().null()) .col(ColumnDef::new(Alias::new("deleted_at")).timestamp_with_time_zone().null()) .col( ColumnDef::new(Alias::new("version")) .integer() .not_null() .default(1), ) .to_owned(), ) .await?; manager .create_index( Index::create() .name("idx_plugins_tenant_status") .table(Alias::new("plugins")) .col(Alias::new("tenant_id")) .col(Alias::new("status")) .to_owned(), ) .await?; manager .create_index( Index::create() .name("idx_plugins_name") .table(Alias::new("plugins")) .col(Alias::new("name")) .to_owned(), ) .await?; // 2. plugin_entities 表 — 插件动态表注册 manager .create_table( Table::create() .table(Alias::new("plugin_entities")) .if_not_exists() .col( ColumnDef::new(Alias::new("id")) .uuid() .not_null() .primary_key(), ) .col(ColumnDef::new(Alias::new("tenant_id")).uuid().not_null()) .col(ColumnDef::new(Alias::new("plugin_id")).uuid().not_null()) .col(ColumnDef::new(Alias::new("entity_name")).string_len(100).not_null()) .col(ColumnDef::new(Alias::new("table_name")).string_len(200).not_null()) .col(ColumnDef::new(Alias::new("schema_json")).json().not_null()) // 标准字段 .col( ColumnDef::new(Alias::new("created_at")) .timestamp_with_time_zone() .not_null() .default(Expr::current_timestamp()), ) .col( ColumnDef::new(Alias::new("updated_at")) .timestamp_with_time_zone() .not_null() .default(Expr::current_timestamp()), ) .col(ColumnDef::new(Alias::new("created_by")).uuid().null()) .col(ColumnDef::new(Alias::new("updated_by")).uuid().null()) .col(ColumnDef::new(Alias::new("deleted_at")).timestamp_with_time_zone().null()) .col( ColumnDef::new(Alias::new("version")) .integer() .not_null() .default(1), ) .to_owned(), ) .await?; manager .create_index( Index::create() .name("idx_plugin_entities_plugin") .table(Alias::new("plugin_entities")) .col(Alias::new("plugin_id")) .to_owned(), ) .await?; // 3. plugin_event_subscriptions 表 — 事件订阅 manager .create_table( Table::create() .table(Alias::new("plugin_event_subscriptions")) .if_not_exists() .col( ColumnDef::new(Alias::new("id")) .uuid() .not_null() .primary_key(), ) .col(ColumnDef::new(Alias::new("plugin_id")).uuid().not_null()) .col(ColumnDef::new(Alias::new("event_pattern")).string_len(200).not_null()) .col( ColumnDef::new(Alias::new("created_at")) .timestamp_with_time_zone() .not_null() .default(Expr::current_timestamp()), ) .to_owned(), ) .await?; manager .create_index( Index::create() .name("idx_plugin_event_subs_plugin") .table(Alias::new("plugin_event_subscriptions")) .col(Alias::new("plugin_id")) .to_owned(), ) .await?; Ok(()) } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager .drop_table(Table::drop().table(Alias::new("plugin_event_subscriptions")).to_owned()) .await?; manager .drop_table(Table::drop().table(Alias::new("plugin_entities")).to_owned()) .await?; manager .drop_table(Table::drop().table(Alias::new("plugins")).to_owned()) .await } }