feat: add basic commands for setting up
This commit is contained in:
parent
3d3e92cf38
commit
0172e9bdad
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -649,6 +649,7 @@ dependencies = [
|
|||||||
"chrono",
|
"chrono",
|
||||||
"dotenv",
|
"dotenv",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
|
"pico-args",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sqlx",
|
"sqlx",
|
||||||
@ -1617,6 +1618,12 @@ version = "2.3.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
|
checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pico-args"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project-lite"
|
name = "pin-project-lite"
|
||||||
version = "0.2.9"
|
version = "0.2.9"
|
||||||
|
@ -20,3 +20,4 @@ actix-files = "0.6.5"
|
|||||||
askama_actix = "0.14.0"
|
askama_actix = "0.14.0"
|
||||||
futures-util = "0.3.30"
|
futures-util = "0.3.30"
|
||||||
serde_json = "1.0.114"
|
serde_json = "1.0.114"
|
||||||
|
pico-args = "0.5.0"
|
||||||
|
91
src/main.rs
91
src/main.rs
@ -1,4 +1,6 @@
|
|||||||
use std::env;
|
use std::env;
|
||||||
|
use std::io::{stdin, stdout, Write};
|
||||||
|
use std::process::exit;
|
||||||
|
|
||||||
use actix_identity::IdentityMiddleware;
|
use actix_identity::IdentityMiddleware;
|
||||||
use actix_session::{storage::CookieSessionStore, SessionMiddleware};
|
use actix_session::{storage::CookieSessionStore, SessionMiddleware};
|
||||||
@ -8,17 +10,106 @@ use dotenv::dotenv;
|
|||||||
use sqlx::postgres::PgPool;
|
use sqlx::postgres::PgPool;
|
||||||
|
|
||||||
use crate::auth::redirect;
|
use crate::auth::redirect;
|
||||||
|
use crate::auth::utils::generate_salt_and_hash_plain_password;
|
||||||
|
use crate::models::User;
|
||||||
|
|
||||||
mod auth;
|
mod auth;
|
||||||
mod calendar;
|
mod calendar;
|
||||||
mod models;
|
mod models;
|
||||||
mod endpoints;
|
mod endpoints;
|
||||||
|
|
||||||
|
pub enum Command {
|
||||||
|
Migrate,
|
||||||
|
CreateAdmin
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Args {
|
||||||
|
command: Option<Command>
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_args() -> Result<Args, pico_args::Error> {
|
||||||
|
let mut pargs = pico_args::Arguments::from_env();
|
||||||
|
|
||||||
|
let command = pargs.free_from_str::<String>();
|
||||||
|
|
||||||
|
let mut args = Args {
|
||||||
|
command: None
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Ok(parsed) = command {
|
||||||
|
match parsed.trim() {
|
||||||
|
"migrate" => args.command = Some(Command::Migrate),
|
||||||
|
"createadmin" => args.command = Some(Command::CreateAdmin),
|
||||||
|
_ => ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn prompt(prompt: &str) -> anyhow::Result<String> {
|
||||||
|
print!("{}: ", prompt);
|
||||||
|
stdout().flush()?;
|
||||||
|
|
||||||
|
let mut input = String::new();
|
||||||
|
stdin().read_line(&mut input)?;
|
||||||
|
|
||||||
|
Ok(input.trim().to_string())
|
||||||
|
}
|
||||||
|
|
||||||
#[actix_web::main]
|
#[actix_web::main]
|
||||||
async fn main() -> anyhow::Result<()> {
|
async fn main() -> anyhow::Result<()> {
|
||||||
dotenv()?;
|
dotenv()?;
|
||||||
|
|
||||||
|
let args = match parse_args() {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(err) => {
|
||||||
|
eprintln!("Error: {err}");
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let pool = PgPool::connect(&env::var("DATABASE_URL")?).await?;
|
let pool = PgPool::connect(&env::var("DATABASE_URL")?).await?;
|
||||||
let secret_key = Key::generate();
|
let secret_key = Key::generate();
|
||||||
|
|
||||||
|
match args.command {
|
||||||
|
Some(Command::Migrate) => {
|
||||||
|
sqlx::migrate!("./migrations")
|
||||||
|
.run(&pool)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
},
|
||||||
|
Some(Command::CreateAdmin) => {
|
||||||
|
let name = prompt("Full name of Admin")?;
|
||||||
|
let email = prompt("E-Mail of Admin (for login)")?;
|
||||||
|
let password = prompt("Password of Admin")?;
|
||||||
|
let retyped_password = prompt("Retype Passsword of Admin")?;
|
||||||
|
|
||||||
|
if password != retyped_password {
|
||||||
|
eprintln!("Given passwords don't match!");
|
||||||
|
exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
let (hash, salt) = generate_salt_and_hash_plain_password("admin")?;
|
||||||
|
|
||||||
|
User::create(
|
||||||
|
&pool,
|
||||||
|
&name,
|
||||||
|
&email,
|
||||||
|
&hash,
|
||||||
|
&salt,
|
||||||
|
models::Role::Admin,
|
||||||
|
models::Function::Wachhabender,
|
||||||
|
1,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
},
|
||||||
|
None => ()
|
||||||
|
};
|
||||||
|
|
||||||
println!("Starting server on http://localhost:8080.");
|
println!("Starting server on http://localhost:8080.");
|
||||||
|
|
||||||
HttpServer::new(move || {
|
HttpServer::new(move || {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user