refactor: fix database

This commit is contained in:
2025-01-03 05:32:25 +08:00
parent 70932900cd
commit caaa5dc0cc
22 changed files with 1223 additions and 128 deletions

View File

@@ -38,7 +38,6 @@ pub enum Bangumi {
Id,
MikanBangumiId,
DisplayName,
SubscriptionId,
SubscriberId,
RawName,
Season,
@@ -54,6 +53,14 @@ pub enum Bangumi {
Extra,
}
#[derive(DeriveIden)]
pub enum SubscriptionBangumi {
Table,
Id,
SubscriptionId,
BangumiId,
}
#[derive(DeriveIden)]
pub enum Episodes {
Table,
@@ -62,7 +69,6 @@ pub enum Episodes {
RawName,
DisplayName,
BangumiId,
SubscriptionId,
SubscriberId,
DownloadId,
SavePath,
@@ -79,13 +85,23 @@ pub enum Episodes {
Extra,
}
#[derive(DeriveIden)]
pub enum SubscriptionEpisode {
Table,
Id,
SubscriptionId,
EpisodeId,
}
#[derive(DeriveIden)]
pub enum Downloads {
Table,
Id,
OriginalName,
RawName,
DisplayName,
SubscriptionId,
SubscriberId,
DownloaderId,
EpisodeId,
Status,
CurrSize,
AllSize,

View File

@@ -2,7 +2,8 @@ use loco_rs::schema::jsonb_null;
use sea_orm_migration::{prelude::*, schema::*};
use super::defs::{
Bangumi, CustomSchemaManagerExt, Episodes, GeneralIds, Subscribers, Subscriptions,
Bangumi, CustomSchemaManagerExt, Episodes, GeneralIds, Subscribers, SubscriptionBangumi,
SubscriptionEpisode, Subscriptions,
};
use crate::models::{
subscribers::SEED_SUBSCRIBER,
@@ -37,12 +38,15 @@ impl MigrationTrait for Migration {
)
.await?;
let insert = Query::insert()
.into_table(Subscribers::Table)
.columns([Subscribers::Pid, Subscribers::DisplayName])
.values_panic([SEED_SUBSCRIBER.into(), SEED_SUBSCRIBER.into()])
.to_owned();
manager.exec_stmt(insert).await?;
manager
.exec_stmt(
Query::insert()
.into_table(Subscribers::Table)
.columns([Subscribers::Pid, Subscribers::DisplayName])
.values_panic([SEED_SUBSCRIBER.into(), SEED_SUBSCRIBER.into()])
.to_owned(),
)
.await?;
create_postgres_enum_for_active_enum!(
manager,
@@ -70,7 +74,7 @@ impl MigrationTrait for Migration {
.name("fk_subscriptions_subscriber_id")
.from(Subscriptions::Table, Subscriptions::SubscriberId)
.to(Subscribers::Table, Subscribers::Id)
.on_update(ForeignKeyAction::Restrict)
.on_update(ForeignKeyAction::Cascade)
.on_delete(ForeignKeyAction::Cascade),
)
.to_owned(),
@@ -89,7 +93,6 @@ impl MigrationTrait for Migration {
table_auto(Bangumi::Table)
.col(pk_auto(Bangumi::Id))
.col(text_null(Bangumi::MikanBangumiId))
.col(integer(Bangumi::SubscriptionId))
.col(integer(Bangumi::SubscriberId))
.col(text(Bangumi::DisplayName))
.col(text(Bangumi::RawName))
@@ -104,22 +107,24 @@ impl MigrationTrait for Migration {
.col(boolean(Bangumi::Deleted).default(false))
.col(text_null(Bangumi::Homepage))
.col(jsonb_null(Bangumi::Extra))
.foreign_key(
ForeignKey::create()
.name("fk_bangumi_subscription_id")
.from(Bangumi::Table, Bangumi::SubscriptionId)
.to(Subscriptions::Table, Subscriptions::Id)
.on_update(ForeignKeyAction::Restrict)
.on_delete(ForeignKeyAction::Cascade),
)
.foreign_key(
ForeignKey::create()
.name("fk_bangumi_subscriber_id")
.from(Bangumi::Table, Bangumi::SubscriberId)
.to(Subscribers::Table, Subscribers::Id)
.on_update(ForeignKeyAction::Restrict)
.on_update(ForeignKeyAction::Cascade)
.on_delete(ForeignKeyAction::Cascade),
)
.index(
Index::create()
.if_not_exists()
.name("idx_bangumi_mikan_bangumi_id_mikan_fansub_id_subscriber_id")
.table(Bangumi::Table)
.col(Bangumi::MikanBangumiId)
.col(Bangumi::MikanFansubId)
.col(Bangumi::SubscriberId)
.unique(),
)
.to_owned(),
)
.await?;
@@ -150,6 +155,44 @@ impl MigrationTrait for Migration {
.create_postgres_auto_update_ts_trigger_for_col(Bangumi::Table, GeneralIds::UpdatedAt)
.await?;
manager
.create_table(
table_auto(SubscriptionBangumi::Table)
.col(pk_auto(SubscriptionBangumi::Id))
.col(integer(SubscriptionBangumi::SubscriptionId))
.col(integer(SubscriptionBangumi::BangumiId))
.foreign_key(
ForeignKey::create()
.name("fk_subscription_bangumi_subscription_id")
.from(
SubscriptionBangumi::Table,
SubscriptionBangumi::SubscriptionId,
)
.to(Subscriptions::Table, Subscriptions::Id)
.on_update(ForeignKeyAction::Cascade)
.on_delete(ForeignKeyAction::Cascade),
)
.foreign_key(
ForeignKey::create()
.name("fk_subscription_bangumi_bangumi_id")
.from(SubscriptionBangumi::Table, SubscriptionBangumi::BangumiId)
.to(Bangumi::Table, Bangumi::Id)
.on_update(ForeignKeyAction::Cascade)
.on_delete(ForeignKeyAction::Cascade),
)
.index(
Index::create()
.if_not_exists()
.name("constraint_subscription_bangumi_subscription_id_bangumi_id")
.table(SubscriptionBangumi::Table)
.col(SubscriptionBangumi::SubscriptionId)
.col(SubscriptionBangumi::BangumiId)
.unique(),
)
.to_owned(),
)
.await?;
manager
.create_table(
table_auto(Episodes::Table)
@@ -158,7 +201,6 @@ impl MigrationTrait for Migration {
.col(text(Episodes::RawName))
.col(text(Episodes::DisplayName))
.col(integer(Episodes::BangumiId))
.col(integer(Episodes::SubscriptionId))
.col(integer(Episodes::SubscriberId))
.col(text_null(Episodes::SavePath))
.col(text_null(Episodes::Resolution))
@@ -172,20 +214,12 @@ impl MigrationTrait for Migration {
.col(boolean(Episodes::Deleted).default(false))
.col(text_null(Episodes::Source))
.col(jsonb_null(Episodes::Extra))
.foreign_key(
ForeignKey::create()
.name("fk_episodes_subscription_id")
.from(Episodes::Table, Episodes::SubscriptionId)
.to(Subscriptions::Table, Subscriptions::Id)
.on_update(ForeignKeyAction::Restrict)
.on_delete(ForeignKeyAction::Cascade),
)
.foreign_key(
ForeignKey::create()
.name("fk_episodes_bangumi_id")
.from(Episodes::Table, Episodes::BangumiId)
.to(Bangumi::Table, Bangumi::Id)
.on_update(ForeignKeyAction::Restrict)
.on_update(ForeignKeyAction::Cascade)
.on_delete(ForeignKeyAction::Cascade),
)
.foreign_key(
@@ -193,7 +227,7 @@ impl MigrationTrait for Migration {
.name("fk_episodes_subscriber_id")
.from(Episodes::Table, Episodes::SubscriberId)
.to(Subscribers::Table, Subscribers::Id)
.on_update(ForeignKeyAction::Restrict)
.on_update(ForeignKeyAction::Cascade)
.on_delete(ForeignKeyAction::Cascade),
)
.to_owned(),
@@ -228,12 +262,50 @@ impl MigrationTrait for Migration {
.create_postgres_auto_update_ts_trigger_for_col(Episodes::Table, GeneralIds::UpdatedAt)
.await?;
manager
.create_table(
table_auto(SubscriptionEpisode::Table)
.col(pk_auto(SubscriptionEpisode::Id))
.col(integer(SubscriptionEpisode::SubscriptionId))
.col(integer(SubscriptionEpisode::EpisodeId))
.foreign_key(
ForeignKey::create()
.name("fk_subscription_episode_subscription_id")
.from(
SubscriptionEpisode::Table,
SubscriptionEpisode::SubscriptionId,
)
.to(Subscriptions::Table, Subscriptions::Id)
.on_update(ForeignKeyAction::Cascade)
.on_delete(ForeignKeyAction::Cascade),
)
.foreign_key(
ForeignKey::create()
.name("fk_subscription_episode_episode_id")
.from(SubscriptionEpisode::Table, SubscriptionEpisode::EpisodeId)
.to(Episodes::Table, Episodes::Id)
.on_update(ForeignKeyAction::Cascade)
.on_delete(ForeignKeyAction::Cascade),
)
.index(
Index::create()
.if_not_exists()
.name("constraint_subscription_episode_subscription_id_episode_id")
.table(SubscriptionEpisode::Table)
.col(SubscriptionEpisode::SubscriptionId)
.col(SubscriptionEpisode::EpisodeId)
.unique(),
)
.to_owned(),
)
.await?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_table(Table::drop().table(Episodes::Table).to_owned())
.drop_table(Table::drop().table(SubscriptionEpisode::Table).to_owned())
.await?;
manager
@@ -241,7 +313,11 @@ impl MigrationTrait for Migration {
.await?;
manager
.drop_table(Table::drop().table(Bangumi::Table).to_owned())
.drop_table(Table::drop().table(Episodes::Table).to_owned())
.await?;
manager
.drop_table(Table::drop().table(SubscriptionBangumi::Table).to_owned())
.await?;
manager
@@ -249,7 +325,7 @@ impl MigrationTrait for Migration {
.await?;
manager
.drop_table(Table::drop().table(Subscriptions::Table).to_owned())
.drop_table(Table::drop().table(Bangumi::Table).to_owned())
.await?;
manager
@@ -260,7 +336,7 @@ impl MigrationTrait for Migration {
.await?;
manager
.drop_table(Table::drop().table(Subscribers::Table).to_owned())
.drop_table(Table::drop().table(Subscriptions::Table).to_owned())
.await?;
manager
@@ -268,17 +344,21 @@ impl MigrationTrait for Migration {
.await?;
manager
.drop_postgres_enum_for_active_enum(subscriptions::SubscriptionCategoryEnum)
.drop_table(Table::drop().table(Subscribers::Table).to_owned())
.await?;
manager
.drop_postgres_auto_update_ts_fn_for_col(GeneralIds::UpdatedAt)
.drop_postgres_enum_for_active_enum(subscriptions::SubscriptionCategoryEnum)
.await?;
manager
.drop_postgres_enum_for_active_enum(SubscriptionCategoryEnum)
.await?;
manager
.drop_postgres_auto_update_ts_fn_for_col(GeneralIds::UpdatedAt)
.await?;
Ok(())
}
}

View File

@@ -2,9 +2,12 @@ use loco_rs::schema::table_auto;
use sea_orm_migration::{prelude::*, schema::*};
use super::defs::*;
use crate::models::prelude::{
downloads::{DownloadMimeEnum, DownloadStatusEnum},
DownloadMime, DownloadStatus,
use crate::models::{
downloaders::DownloaderCategoryEnum,
prelude::{
downloads::{DownloadMimeEnum, DownloadStatusEnum},
DownloadMime, DownloadStatus, DownloaderCategory,
},
};
#[derive(DeriveMigrationName)]
@@ -13,6 +16,48 @@ pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
create_postgres_enum_for_active_enum!(
manager,
DownloaderCategoryEnum,
DownloaderCategory::QBittorrent
)
.await?;
manager
.create_table(
table_auto(Downloaders::Table)
.col(pk_auto(Downloaders::Id))
.col(text(Downloaders::Endpoint))
.col(string_null(Downloaders::Username))
.col(string_null(Downloaders::Password))
.col(enumeration(
Downloaders::Category,
DownloaderCategoryEnum,
DownloaderCategory::iden_values(),
))
.col(text(Downloaders::SavePath))
.col(integer(Downloaders::SubscriberId))
.foreign_key(
ForeignKey::create()
.name("fk_downloader_subscriber_id")
.from_tbl(Downloaders::Table)
.from_col(Downloaders::SubscriberId)
.to_tbl(Subscribers::Table)
.to_col(Subscribers::Id)
.on_delete(ForeignKeyAction::Cascade)
.on_update(ForeignKeyAction::Cascade),
)
.to_owned(),
)
.await?;
manager
.create_postgres_auto_update_ts_trigger_for_col(
Downloaders::Table,
GeneralIds::UpdatedAt,
)
.await?;
create_postgres_enum_for_active_enum!(
manager,
DownloadMimeEnum,
@@ -37,9 +82,11 @@ impl MigrationTrait for Migration {
.create_table(
table_auto(Downloads::Table)
.col(pk_auto(Downloads::Id))
.col(string(Downloads::OriginalName))
.col(string(Downloads::RawName))
.col(string(Downloads::DisplayName))
.col(integer(Downloads::SubscriptionId))
.col(integer(Downloads::SubscriberId))
.col(integer(Downloads::DownloaderId))
.col(integer(Downloads::EpisodeId))
.col(enumeration(
Downloads::Status,
DownloadStatusEnum,
@@ -57,16 +104,42 @@ impl MigrationTrait for Migration {
.col(text_null(Downloads::SavePath))
.foreign_key(
ForeignKey::create()
.name("fk_downloads_subscription_id")
.from(Downloads::Table, Downloads::SubscriptionId)
.to(Subscriptions::Table, Subscriptions::Id)
.on_update(ForeignKeyAction::Restrict)
.on_delete(ForeignKeyAction::Cascade),
.name("fk_downloads_subscriber_id")
.from_tbl(Downloads::Table)
.from_col(Downloads::SubscriberId)
.to_tbl(Subscribers::Table)
.to_col(Subscribers::Id)
.on_delete(ForeignKeyAction::Cascade)
.on_update(ForeignKeyAction::Cascade),
)
.foreign_key(
ForeignKey::create()
.name("fk_downloads_downloader_id")
.from_tbl(Downloads::Table)
.from_col(Downloads::DownloaderId)
.to_tbl(Downloaders::Table)
.to_col(Downloaders::Id)
.on_delete(ForeignKeyAction::Cascade)
.on_update(ForeignKeyAction::Cascade),
)
.foreign_key(
ForeignKey::create()
.name("fk_downloads_episode_id")
.from_tbl(Downloads::Table)
.from_col(Downloads::EpisodeId)
.to_tbl(Episodes::Table)
.to_col(Episodes::Id)
.on_delete(ForeignKeyAction::Cascade)
.on_update(ForeignKeyAction::Cascade),
)
.to_owned(),
)
.await?;
manager
.create_postgres_auto_update_ts_trigger_for_col(Downloads::Table, GeneralIds::UpdatedAt)
.await?;
manager
.create_index(
Index::create()
@@ -78,37 +151,12 @@ impl MigrationTrait for Migration {
)
.await?;
manager
.alter_table(
Table::alter()
.table(Episodes::Table)
.add_column_if_not_exists(integer_null(Episodes::DownloadId))
.add_foreign_key(
TableForeignKey::new()
.name("fk_episodes_download_id")
.from_tbl(Episodes::Table)
.from_col(Episodes::DownloadId)
.to_tbl(Downloads::Table)
.to_col(Downloads::Id)
.on_update(ForeignKeyAction::Restrict)
.on_delete(ForeignKeyAction::SetNull),
)
.to_owned(),
)
.await?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.alter_table(
Table::alter()
.table(Episodes::Table)
.drop_foreign_key(Alias::new("fk_episodes_download_id"))
.drop_column(Episodes::DownloadId)
.to_owned(),
)
.drop_postgres_auto_update_ts_trigger_for_col(Downloads::Table, GeneralIds::UpdatedAt)
.await?;
manager
@@ -123,6 +171,18 @@ impl MigrationTrait for Migration {
.drop_postgres_enum_for_active_enum(DownloadStatusEnum)
.await?;
manager
.drop_postgres_auto_update_ts_trigger_for_col(Downloaders::Table, GeneralIds::UpdatedAt)
.await?;
manager
.drop_table(Table::drop().table(Downloaders::Table).to_owned())
.await?;
manager
.drop_postgres_enum_for_active_enum(DownloaderCategoryEnum)
.await?;
Ok(())
}
}

View File

@@ -3,7 +3,10 @@ use sea_orm_migration::{prelude::*, schema::*};
use super::defs::Auth;
use crate::{
migrations::defs::{CustomSchemaManagerExt, GeneralIds, Subscribers},
models::auth::{AuthType, AuthTypeEnum},
models::{
auth::{AuthType, AuthTypeEnum},
subscribers::SEED_SUBSCRIBER,
},
};
#[derive(DeriveMigrationName)]
@@ -40,7 +43,7 @@ impl MigrationTrait for Migration {
.to_tbl(Subscribers::Table)
.to_col(Subscribers::Id)
.on_delete(ForeignKeyAction::Cascade)
.on_update(ForeignKeyAction::Restrict),
.on_update(ForeignKeyAction::Cascade),
)
.to_owned(),
)
@@ -62,6 +65,20 @@ impl MigrationTrait for Migration {
.create_postgres_auto_update_ts_trigger_for_col(Auth::Table, GeneralIds::UpdatedAt)
.await?;
manager
.exec_stmt(
Query::insert()
.into_table(Auth::Table)
.columns([Auth::Pid, Auth::AuthType, Auth::SubscriberId])
.values_panic([
SEED_SUBSCRIBER.into(),
SimpleExpr::from(AuthType::Basic).as_enum(AuthTypeEnum),
1.into(),
])
.to_owned(),
)
.await?;
Ok(())
}

View File

@@ -4,7 +4,6 @@ pub use sea_orm_migration::prelude::*;
pub mod defs;
pub mod m20220101_000001_init;
pub mod m20240224_082543_add_downloads;
pub mod m20240225_060853_subscriber_add_downloader;
pub mod m20241231_000001_auth;
pub struct Migrator;
@@ -15,7 +14,6 @@ impl MigratorTrait for Migrator {
vec![
Box::new(m20220101_000001_init::Migration),
Box::new(m20240224_082543_add_downloads::Migration),
Box::new(m20240225_060853_subscriber_add_downloader::Migration),
Box::new(m20241231_000001_auth::Migration),
]
}