EinsatzOnline/src/main.rs

293 lines
16 KiB
Rust

extern crate argon2;
extern crate base64;
extern crate chrono;
extern crate chrono_tz;
extern crate config;
extern crate core;
#[macro_use]
extern crate diesel;
extern crate iban;
extern crate log;
#[macro_use]
extern crate rocket;
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
use std::{thread, time};
use std::io::Write;
use std::process::Command;
use std::sync::Arc;
use rocket::fs::FileServer;
use rocket::tokio;
use rocket_dyn_templates::handlebars::Handlebars;
use rocket_dyn_templates::Template;
use helper::settings::Settings;
use crate::helper::handlebars_in_list_helper::in_list_block_helper;
use crate::helper::mail_queue::queue::MailQueue;
use crate::helper::mail_templates::MailTemplates;
use crate::helper::session_cookies::model::SessionCookieStorage;
pub mod database;
pub mod helper;
pub mod modules;
pub mod permissions;
pub mod schema;
pub mod logger;
#[launch]
fn rocket() -> _ {
env_logger::init(); //Initializes logger. Set environment variable RUST_LOG=debug|info|warn|error to set loglevel
let settings = match Settings::new() {
Ok(settings) => settings,
Err(e) => {
error!("Failed to read config: {}", e);
std::process::exit(1);
}
};
let version = Command::new("sh")
.args(&["-c", "git describe --tags --long"])
.output();
match version {
Ok(v) => {
match std::fs::File::create("resources/templates/versiontag.hbs") {
Ok(mut file) => match file.write_all(&v.stdout) {
Ok(_) => {}
Err(e) => {
warn!("Couldn't write version tag to file: {}", e);
}
},
Err(e) => {
warn!("Couldn't write version tag to file: {}", e);
}
};
}
Err(e) => {
warn!("Couldn't obtain version tag: {}", e);
}
}
// Initialize storage for session cookies
let cookie_storage = SessionCookieStorage::new();
// Initialize mail queue for second thread handling outgoing mails
// We are using Arc to access mail queue in all threads
let mail_queue = Arc::new(MailQueue::load_or_create_new());
let c_lock = mail_queue.clone();
let settings_clone = settings.clone();
thread::spawn(move || {
let mut rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
loop {
let c_lock2 = c_lock.clone();
let settings_clone2 = settings_clone.clone();
if c_lock2.mails.read().unwrap().len() != 0 {
tokio::spawn(async move {
c_lock2.process_next(&settings_clone2).await;
});
}
thread::sleep(time::Duration::from_millis(500)) // Only check for new mails ever 500 ms
}
});
});
let mut mail_templates = MailTemplates {
registry: Handlebars::new(),
};
match mail_templates.registry.register_template_file("password-reset-de", "resources/mail_templates/password-reset-de.hbs")
{
Ok(_) => {}
Err(e) => {
error!("Couldn't register mail template: {}", e);
std::process::exit(1);
}
}
match mail_templates.registry.register_template_file("new_event_request_published-de", "resources/mail_templates/new_event_request_published-de.hbs")
{
Ok(_) => {}
Err(e) => {
error!("Couldn't register mail template: {}", e);
std::process::exit(1);
}
}
rocket::build()
.manage(settings)
.manage(cookie_storage)
.manage(mail_queue)
.manage(mail_templates)
.mount( //TODO: find a way to get rip of this crap
"/",
routes![
modules::dashboard::view::dashboard,
modules::welcome::view::welcome_get::welcome_get,
modules::welcome::view::welcome_post::welcome_post,
modules::welcome::view::welcome_post::password_reset_post,
modules::welcome::view::welcome_post::password_change_post,
modules::welcome::view::welcome_post::password_change_get,
modules::welcome::view::login_select_get::login_select_get,
modules::welcome::view::logout::logout_get,
modules::member_management::view::selection_get::member_management_selection,
modules::member_management::view::profile_get::member_management_core_data_get,
modules::member_management::view::profile_post::member_management_core_data_post,
modules::member_management::view::groups_get::member_management_groups_get,
modules::api::member_management::view::member_qualifications::api_member_remove_qualification,
modules::api::member_management::view::member_qualifications::api_member_get_qualifications_for_category,
modules::api::member_management::view::member_qualifications::api_member_add_qualification,
modules::api::member_management::view::member_driving_permissions::api_member_add_driving_license,
modules::api::member_management::view::member_driving_permissions::api_member_add_driving_permission,
modules::api::member_management::view::member_driving_permissions::api_member_remove_driving_license,
modules::api::members::get_member::api_members_get,
modules::api::members::get_member::api_members_search_name,
modules::api::members::delete_member::api_members_delete,
modules::api::members::member_communication::api_communication_targets_update,
modules::api::members::member_communication::api_communication_types_get,
modules::api::members::member_communication::api_communication_targets_create,
modules::api::members::member_communication::api_communication_targets_delete,
modules::api::members::member_qualification::api_member_qualifications_read,
modules::api::groups::create::create_group,
modules::api::groups::delete::delete_groups,
modules::api::groups::read::get_groups,
modules::api::groups::read::read_group_detailed,
modules::api::groups::read::read_group_simple,
modules::api::groups::update::put_member_in_group,
modules::api::groups::delete::delete_member_from_group,
modules::api::groups::update::update_group,
modules::api::groups::update::put_member_in_state,
modules::api::groups::read::read_group_entity_states,
modules::api::units::read::read_unit_list,
modules::api::units::update::put_member_in_unit,
modules::api::units::delete::delete_member_from_unit,
modules::api::users::create::create_user,
modules::api::users::delete::delete_user,
modules::api::users::update::update_user,
modules::api::communicator::create::create_email,
modules::member_management::view::personal_profile::member_management_personal_profile_get,
modules::member_management::view::personal_profile::member_management_personal_profile_post,
modules::member_management::view::create_member::member_management_add_member,
modules::member_management::view::create_member::member_management_add_member_post,
modules::communicator::send_email::communicator_email_get,
modules::resource_management::vehicles::vehicle_list::vehicle_list,
modules::api::resources::vehicles::read::read_vehicle_categories,
modules::api::resources::vehicles::read::read_vehicle_list,
modules::api::resources::vehicles::create::create_vehicle,
modules::api::resources::vehicles::update::update_vehicle,
modules::api::resources::vehicles::delete::delete_vehicles,
modules::api::appointments::read::read_appointment_types,
modules::api::appointments::create::create_appointment,
modules::api::appointments::read::read_appointments_for_entity,
modules::api::appointments::delete::delete_appointment,
modules::api::info::caller::check_caller_has_permission,
modules::api::info::caller::get_caller_permission_context,
modules::event_management::eventlist::eventlist,
modules::event_management::organisers::organisers,
modules::event_management::add_event::add_event,
modules::api::event_organisers::read::read_organisers,
modules::api::event_organisers::create::create_organiser,
modules::api::event_organisers::delete::delete_organisers,
modules::api::event_organisers::update::update_organiser,
modules::api::event_organisers::read::read_organiser,
modules::api::events::read::read_events,
modules::api::events::read::read_event,
modules::api::events::types::read::read_event_types,
modules::api::events::types::read::read_event_type,
modules::api::events::create::create_event,
modules::api::events::update::update_event,
modules::api::events::delete::delete_event,
modules::api::events::update::close_event,
modules::api::events::update::approve_times,
modules::api::events::read::read_min_billing_states_for_event,
modules::event_management::event_unit_positions::event_unit_positions,
modules::event_management::event_unit_templates::event_unit_templates,
modules::api::members::licenses::read::read_license_categories,
modules::api::members::member_qualification::read_qualifications,
modules::api::events::event_units::position::create::create_event_unit_position,
modules::api::events::event_units::position::read::read_event_unit_position,
modules::api::events::event_units::position::delete::delete_event_unit_positions,
modules::api::events::event_units::position::update::update_event_unit_position,
modules::api::events::event_units::position::update::update_vehicle_position,
modules::api::events::event_units::templates::create::create_event_unit_template,
modules::api::events::event_units::templates::create::put_position_in_template,
modules::api::events::event_units::templates::read::read_event_unit_templates,
modules::api::events::event_units::templates::delete::delete_templates,
modules::api::events::event_units::templates::delete::delete_positions_from_template,
modules::api::events::event_units::templates::read::read_event_unit_template_positions,
modules::api::events::event_units::templates::update::update_template,
modules::api::events::event_units::templates::update::update_position_for_template,
modules::event_management::edit_event::edit_event,
modules::api::events::instances::create::create_instance,
modules::api::events::instances::create::add_position_instance,
modules::api::events::instances::delete::delete_position_instance,
modules::api::events::instances::update::patch_position_instance,
modules::api::events::instances::read::read_instances,
modules::api::events::instances::update::patch_instance,
modules::api::events::event_units::position::create::create_event_unit_vehicle_position,
modules::api::events::event_units::templates::read::read_event_unit_template_vehicle_positions,
modules::api::events::event_units::position::delete::delete_event_unit_vehicle_positions,
modules::api::events::instances::read::read_positions_for_instance,
modules::api::events::instances::update::remove_entity_from_position,
modules::api::events::instances::update::put_entity_in_position,
modules::api::events::instances::read::read_vehicle_positions_for_instance,
modules::api::resources::vehicles::read::read_vehicle,
modules::api::events::instances::delete::delete_instance,
modules::api::events::event_units::position::read::get_check_position_requirements,
modules::api::events::read::read_future_event_for_member,
modules::api::users::read::matrix_check_credentials,
modules::api::users::read::http_basic_auth,
modules::api::users::read::http_basic_auth2,
modules::admin_settings::permissions::settings_permissions,
modules::api::members::get_member::api_member_list,
modules::api::events::read::check_event_cast_status,
modules::event_management::requests::request_list,
modules::event_management::add_request::add_request,
modules::api::events::requests::create::create_event_request,
modules::api::events::requests::read::read_event_requests,
modules::api::events::requests::update::update_event_request,
modules::api::events::requests::delete::delete_event_request,
modules::api::permissions::roles::read::get_role_permissions,
modules::api::permissions::read::get_permissions,
modules::api::permissions::roles::update::api_add_permission_to_role,
modules::api::permissions::roles::update::api_remove_permission_from_role,
modules::api::permissions::roles::read::get_context_for_permission_role,
modules::api::permissions::roles::update::api_add_context,
modules::api::permissions::roles::update::api_remove_context,
modules::admin_settings::roles::settings_roles,
modules::api::permissions::roles::read::get_all_roles,
modules::api::permissions::roles::read::get_role_members,
modules::api::permissions::roles::update::api_add_member_to_role,
modules::api::permissions::roles::update::api_remove_member_from_role,
modules::api::permissions::roles::update::api_update_role,
modules::print::event_note::print_event_note,
modules::event_billing::event::event_view,
modules::event_billing::close_event::close_event,
modules::event_billing::edit_times::edit_times,
modules::api::events::update::finish_personnel_billing,
modules::event_billing::approve::approve,
modules::event_billing::edit_personnel_billing::edit_personnel_billing,
modules::api::billing_states::read::read_billing_states,
modules::api::billing_rates::read::read_personnel_billing_rates,
modules::api::personnel_billing::create::add_personnel_billing_entry,
modules::api::personnel_billing::delete::delete_position_instance,
modules::api::personnel_billing::read::get_personnel_billing,
modules::api::events::update::approve,
modules::event_billing::event_billing_list::event_billing_list,
],
)
.mount("/css", FileServer::from("resources/css"))
.mount("/js", FileServer::from("resources/js"))//TODO: Replace popper and bootstrap with local files
.mount("/img", FileServer::from("resources/images"))
.mount("/templates", FileServer::from("resources/ajax_templates"))
.register("/portal", catchers![crate::helper::server_errors::unauthorized, crate::helper::server_errors::forbidden, crate::helper::server_errors::notfound, crate::helper::server_errors::notimplemented])
.attach(Template::custom(|engine|{
engine.handlebars.register_helper("if_in_list", Box::new(in_list_block_helper));
}))
}