rss-reader/src/main.rs
Greg Shuflin 202a7e5224 cargo fmt
2025-02-02 21:01:54 -08:00

109 lines
2.7 KiB
Rust

#[macro_use]
extern crate rocket;
use clap::Parser;
mod feed_utils;
mod feeds;
mod poll;
mod user;
use rocket::fs::FileServer;
use rocket::response::Redirect;
use rocket_db_pools::{sqlx, Connection, Database};
use rocket_dyn_templates::{context, Template};
use user::AuthenticatedUser;
/// RSS Reader application
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
/// Path to the SQLite database file
#[arg(short, long)]
database: String,
}
#[derive(Database)]
#[database("rss_data")]
struct Db(sqlx::SqlitePool);
#[get("/")]
fn index(_user: AuthenticatedUser) -> Template {
Template::render("index", context! {})
}
#[get("/", rank = 2)]
async fn index_redirect(mut db: Connection<Db>) -> Redirect {
// Check if any users exist
let count = sqlx::query!("SELECT COUNT(*) as count FROM users")
.fetch_one(&mut **db)
.await
.map_err(|_| Redirect::to(uri!(login)))
.unwrap()
.count;
if count == 0 {
Redirect::to(uri!(user::setup_page))
} else {
Redirect::to(uri!(login))
}
}
#[get("/login")]
fn login() -> Template {
Template::render("login", context! {})
}
#[launch]
fn rocket() -> _ {
let args = Args::parse();
let db_url = format!("sqlite:{}", args.database);
// Check if database file exists, create it if it doesn't
if !std::path::Path::new(&args.database).exists() {
use std::fs::File;
File::create(&args.database).expect("Failed to create database file");
}
// Run migrations before starting the server
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
let pool = sqlx::SqlitePool::connect(&db_url).await.unwrap();
sqlx::migrate!("./migrations")
.run(&pool)
.await
.expect("Failed to run database migrations");
});
let figment = rocket::Config::figment().merge((
"databases.rss_data.url",
format!("sqlite:{}", args.database),
));
rocket::custom(figment)
.mount(
"/",
routes![
index,
index_redirect,
login,
user::create_user,
user::get_users,
user::delete_user,
user::login,
user::logout,
user::setup_page,
user::setup,
feeds::create_feed,
feeds::get_feed,
feeds::list_feeds,
feeds::delete_feed,
poll::poll_feed,
],
)
.mount("/static", FileServer::from("static"))
.attach(Template::fairing())
.attach(Db::init())
}