chore: checkpoint admin editor and perf work

This commit is contained in:
2026-03-31 00:12:02 +08:00
parent 92a85eef20
commit 99b308e800
45 changed files with 7265 additions and 833 deletions

View File

@@ -21,6 +21,10 @@ mod m20260328_000010_add_paragraph_comments_toggle_to_site_settings;
mod m20260328_000011_add_post_images_and_music_playlist;
mod m20260329_000012_add_link_url_to_reviews;
mod m20260329_000013_add_ai_provider_presets_to_site_settings;
mod m20260329_000014_create_query_events;
mod m20260330_000015_add_image_ai_settings_to_site_settings;
mod m20260330_000016_add_r2_media_settings_to_site_settings;
mod m20260330_000017_add_media_storage_provider_to_site_settings;
pub struct Migrator;
#[async_trait::async_trait]
@@ -46,6 +50,10 @@ impl MigratorTrait for Migrator {
Box::new(m20260328_000011_add_post_images_and_music_playlist::Migration),
Box::new(m20260329_000012_add_link_url_to_reviews::Migration),
Box::new(m20260329_000013_add_ai_provider_presets_to_site_settings::Migration),
Box::new(m20260329_000014_create_query_events::Migration),
Box::new(m20260330_000015_add_image_ai_settings_to_site_settings::Migration),
Box::new(m20260330_000016_add_r2_media_settings_to_site_settings::Migration),
Box::new(m20260330_000017_add_media_storage_provider_to_site_settings::Migration),
// inject-above (do not remove this comment)
]
}

View File

@@ -0,0 +1,73 @@
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, manager: &SchemaManager) -> Result<(), DbErr> {
create_table(
manager,
"query_events",
&[
("id", ColType::PkAuto),
("event_type", ColType::String),
("query_text", ColType::Text),
("normalized_query", ColType::Text),
("request_path", ColType::StringNull),
("referrer", ColType::StringNull),
("user_agent", ColType::TextNull),
("result_count", ColType::IntegerNull),
("success", ColType::BooleanNull),
("response_mode", ColType::StringNull),
("provider", ColType::StringNull),
("chat_model", ColType::StringNull),
("latency_ms", ColType::IntegerNull),
],
&[],
)
.await?;
manager
.create_index(
Index::create()
.name("idx_query_events_event_type_created_at")
.table(Alias::new("query_events"))
.col(Alias::new("event_type"))
.col(Alias::new("created_at"))
.to_owned(),
)
.await?;
manager
.create_index(
Index::create()
.name("idx_query_events_normalized_query")
.table(Alias::new("query_events"))
.col(Alias::new("normalized_query"))
.to_owned(),
)
.await?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
for index_name in [
"idx_query_events_normalized_query",
"idx_query_events_event_type_created_at",
] {
manager
.drop_index(
Index::drop()
.name(index_name)
.table(Alias::new("query_events"))
.to_owned(),
)
.await?;
}
drop_table(manager, "query_events").await
}
}

View File

@@ -0,0 +1,101 @@
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> {
let table = Alias::new("site_settings");
if !manager
.has_column("site_settings", "ai_image_provider")
.await?
{
manager
.alter_table(
Table::alter()
.table(table.clone())
.add_column(
ColumnDef::new(Alias::new("ai_image_provider"))
.string()
.null(),
)
.to_owned(),
)
.await?;
}
if !manager
.has_column("site_settings", "ai_image_api_base")
.await?
{
manager
.alter_table(
Table::alter()
.table(table.clone())
.add_column(
ColumnDef::new(Alias::new("ai_image_api_base"))
.string()
.null(),
)
.to_owned(),
)
.await?;
}
if !manager
.has_column("site_settings", "ai_image_api_key")
.await?
{
manager
.alter_table(
Table::alter()
.table(table.clone())
.add_column(ColumnDef::new(Alias::new("ai_image_api_key")).text().null())
.to_owned(),
)
.await?;
}
if !manager
.has_column("site_settings", "ai_image_model")
.await?
{
manager
.alter_table(
Table::alter()
.table(table)
.add_column(ColumnDef::new(Alias::new("ai_image_model")).string().null())
.to_owned(),
)
.await?;
}
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
let table = Alias::new("site_settings");
for column in [
"ai_image_model",
"ai_image_api_key",
"ai_image_api_base",
"ai_image_provider",
] {
if manager.has_column("site_settings", column).await? {
manager
.alter_table(
Table::alter()
.table(table.clone())
.drop_column(Alias::new(column))
.to_owned(),
)
.await?;
}
}
Ok(())
}
}

View File

@@ -0,0 +1,128 @@
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> {
let table = Alias::new("site_settings");
if !manager
.has_column("site_settings", "media_r2_account_id")
.await?
{
manager
.alter_table(
Table::alter()
.table(table.clone())
.add_column(
ColumnDef::new(Alias::new("media_r2_account_id"))
.string()
.null(),
)
.to_owned(),
)
.await?;
}
if !manager
.has_column("site_settings", "media_r2_bucket")
.await?
{
manager
.alter_table(
Table::alter()
.table(table.clone())
.add_column(
ColumnDef::new(Alias::new("media_r2_bucket"))
.string()
.null(),
)
.to_owned(),
)
.await?;
}
if !manager
.has_column("site_settings", "media_r2_public_base_url")
.await?
{
manager
.alter_table(
Table::alter()
.table(table.clone())
.add_column(
ColumnDef::new(Alias::new("media_r2_public_base_url"))
.string()
.null(),
)
.to_owned(),
)
.await?;
}
if !manager
.has_column("site_settings", "media_r2_access_key_id")
.await?
{
manager
.alter_table(
Table::alter()
.table(table.clone())
.add_column(
ColumnDef::new(Alias::new("media_r2_access_key_id"))
.string()
.null(),
)
.to_owned(),
)
.await?;
}
if !manager
.has_column("site_settings", "media_r2_secret_access_key")
.await?
{
manager
.alter_table(
Table::alter()
.table(table)
.add_column(
ColumnDef::new(Alias::new("media_r2_secret_access_key"))
.text()
.null(),
)
.to_owned(),
)
.await?;
}
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
let table = Alias::new("site_settings");
for column in [
"media_r2_secret_access_key",
"media_r2_access_key_id",
"media_r2_public_base_url",
"media_r2_bucket",
"media_r2_account_id",
] {
if manager.has_column("site_settings", column).await? {
manager
.alter_table(
Table::alter()
.table(table.clone())
.drop_column(Alias::new(column))
.to_owned(),
)
.await?;
}
}
Ok(())
}
}

View File

@@ -0,0 +1,53 @@
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> {
if manager
.has_column("site_settings", "media_storage_provider")
.await?
{
return Ok(());
}
manager
.alter_table(
Table::alter()
.table(SiteSettings::Table)
.add_column(
ColumnDef::new(SiteSettings::MediaStorageProvider)
.string()
.null(),
)
.to_owned(),
)
.await
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
if !manager
.has_column("site_settings", "media_storage_provider")
.await?
{
return Ok(());
}
manager
.alter_table(
Table::alter()
.table(SiteSettings::Table)
.drop_column(SiteSettings::MediaStorageProvider)
.to_owned(),
)
.await
}
}
#[derive(DeriveIden)]
enum SiteSettings {
Table,
MediaStorageProvider,
}