293 lines
16 KiB
Rust
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));
|
|
}))
|
|
} |