use anyhow::Result;
use sqlx::postgres::PgPoolOptions;
use std::env;
use backbone_mail::seeders::SeedMailActivitySeeder;
use backbone_mail::seeders::SeedMailActivityTypeSeeder;
use backbone_mail::seeders::SeedMailActivityPlanSeeder;
use backbone_mail::seeders::SeedMailActivityPlanTemplateSeeder;
use backbone_mail::seeders::SeedMailAliasDomainSeeder;
use backbone_mail::seeders::SeedMailAliasSeeder;
use backbone_mail::seeders::SeedMailAttachmentSeeder;
use backbone_mail::seeders::SeedMailMessageAttachmentSeeder;
use backbone_mail::seeders::SeedMailMessageStarSeeder;
use backbone_mail::seeders::SeedMailMessageSeeder;
use backbone_mail::seeders::SeedMailSeeder;
use backbone_mail::seeders::SeedMailNotificationSeeder;
use backbone_mail::seeders::SeedMailMessageSubtypeSeeder;
use backbone_mail::seeders::SeedMailMessageReactionSeeder;
use backbone_mail::seeders::SeedMailFollowersSeeder;
use backbone_mail::seeders::SeedMailPresenceSeeder;
use backbone_mail::seeders::SeedMailBlacklistSeeder;
use backbone_mail::seeders::SeedMailTrackingValueSeeder;
use backbone_mail::seeders::SeedDiscussChannelSeeder;
use backbone_mail::seeders::SeedDiscussChannelMemberSeeder;
use backbone_mail::seeders::SeedMailGuestSeeder;
use backbone_mail::seeders::SeedMailServerSeeder;
use backbone_mail::seeders::SeedFetchmailServerSeeder;
use backbone_mail::seeders::SeedMailGatewayAllowedSeeder;
use backbone_mail::seeders::SeedPhoneBlacklistSeeder;
use backbone_mail::seeders::SeedMailMessageScheduleSeeder;
use backbone_mail::seeders::SeedMailScheduledMessageSeeder;
use backbone_mail::seeders::SeedSmsSeeder;
use backbone_mail::seeders::SeedSmsTemplateSeeder;
use backbone_mail::seeders::SeedSmsTrackerSeeder;
use backbone_mail::seeders::Seeder;
#[tokio::main]
async fn main() -> Result<()> {
let args: Vec<String> = env::args().collect();
let force = args.iter().any(|a| a == "--force");
let filter: Option<&str> = args.iter()
.skip(1)
.find(|a| !a.starts_with("-"))
.map(|s| s.as_str());
let database_url = env::var("DATABASE_URL")
.map_err(|e| anyhow::anyhow!("DATABASE_URL must be set: {e}"))?;
println!("Connecting to database...");
let pool = PgPoolOptions::new()
.max_connections(5)
.connect(&database_url)
.await?;
println!("Connected to database");
println!();
println!("Running seeders for module: messaging");
println!();
let mut seeders: Vec<Box<dyn Seeder + Send + Sync>> = Vec::new();
seeders.push(Box::new(SeedMailActivitySeeder::new()));
seeders.push(Box::new(SeedMailActivityTypeSeeder::new()));
seeders.push(Box::new(SeedMailActivityPlanSeeder::new()));
seeders.push(Box::new(SeedMailActivityPlanTemplateSeeder::new()));
seeders.push(Box::new(SeedMailAliasDomainSeeder::new()));
seeders.push(Box::new(SeedMailAliasSeeder::new()));
seeders.push(Box::new(SeedMailAttachmentSeeder::new()));
seeders.push(Box::new(SeedMailMessageAttachmentSeeder::new()));
seeders.push(Box::new(SeedMailMessageStarSeeder::new()));
seeders.push(Box::new(SeedMailMessageSeeder::new()));
seeders.push(Box::new(SeedMailSeeder::new()));
seeders.push(Box::new(SeedMailNotificationSeeder::new()));
seeders.push(Box::new(SeedMailMessageSubtypeSeeder::new()));
seeders.push(Box::new(SeedMailMessageReactionSeeder::new()));
seeders.push(Box::new(SeedMailFollowersSeeder::new()));
seeders.push(Box::new(SeedMailPresenceSeeder::new()));
seeders.push(Box::new(SeedMailBlacklistSeeder::new()));
seeders.push(Box::new(SeedMailTrackingValueSeeder::new()));
seeders.push(Box::new(SeedDiscussChannelSeeder::new()));
seeders.push(Box::new(SeedDiscussChannelMemberSeeder::new()));
seeders.push(Box::new(SeedMailGuestSeeder::new()));
seeders.push(Box::new(SeedMailServerSeeder::new()));
seeders.push(Box::new(SeedFetchmailServerSeeder::new()));
seeders.push(Box::new(SeedMailGatewayAllowedSeeder::new()));
seeders.push(Box::new(SeedPhoneBlacklistSeeder::new()));
seeders.push(Box::new(SeedMailMessageScheduleSeeder::new()));
seeders.push(Box::new(SeedMailScheduledMessageSeeder::new()));
seeders.push(Box::new(SeedSmsSeeder::new()));
seeders.push(Box::new(SeedSmsTemplateSeeder::new()));
seeders.push(Box::new(SeedSmsTrackerSeeder::new()));
seeders.sort_by_key(|s| s.order());
for seeder in &seeders {
let name = seeder.name();
if let Some(f) = filter {
if !name.contains(f) {
continue;
}
}
if force {
println!(" Running {}...", name);
seeder.run(&pool).await?;
println!(" {} completed", name);
} else {
println!(" Checking {}...", name);
if seeder.should_run(&pool).await? {
println!(" Running {}...", name);
seeder.run(&pool).await?;
println!(" {} completed", name);
} else {
println!(" {} already applied, skipping", name);
}
}
}
println!();
println!("All seeders completed successfully!");
Ok(())
}