use std::env; use diesel::dsl::sql; use diesel::prelude::*; use diesel_migrations::embed_migrations; use dotenv::dotenv; use errors::DatabaseError; use models::*; use schema::schedules::dsl::*; use crate::types::EmgauwaUid; pub mod errors; pub mod models; pub mod schema; embed_migrations!("migrations"); fn get_connection() -> SqliteConnection { dotenv().ok(); let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); SqliteConnection::establish(&database_url) .unwrap_or_else(|_| panic!("Error connecting to {}", database_url)) } pub fn run_migrations() { let connection = get_connection(); embedded_migrations::run(&connection).expect("Failed to run migrations."); } pub fn get_schedules() -> Vec<Schedule> { let connection = get_connection(); schedules .load::<Schedule>(&connection) .expect("Error loading schedules") } pub fn get_schedule_by_uid(filter_uid: EmgauwaUid) -> Result<Schedule, DatabaseError> { let connection = get_connection(); let result = schedules .filter(uid.eq(filter_uid)) .first::<Schedule>(&connection) .or(Err(DatabaseError::NotFound))?; Ok(result) } pub fn create_schedule(new_name: &str, new_periods: &Periods) -> Result<Schedule, DatabaseError> { let connection = get_connection(); let new_schedule = NewSchedule { uid: &EmgauwaUid::default(), name: new_name, periods: new_periods }; diesel::insert_into(schedules) .values(&new_schedule) .execute(&connection) .or(Err(DatabaseError::InsertError))?; let result = schedules .find(sql("last_insert_rowid()")) .get_result::<Schedule>(&connection) .or(Err(DatabaseError::InsertGetError))?; Ok(result) }