109 lines
2.7 KiB
Rust
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())
|
|
}
|