EinsatzOnline/src/database/controller/billing/states.rs

95 lines
3.7 KiB
Rust

use diesel::{ExpressionMethods, OptionalExtension, QueryDsl, RunQueryDsl, sql_query};
use diesel::pg::types::sql_types::Uuid;
use rocket::State;
use crate::database::controller::connector::establish_connection;
use crate::logger::entries::LogEntry;
use crate::Settings;
#[derive(Queryable, Clone, Deserialize, Serialize)]
pub struct BillingState {
pub entity_id: uuid::Uuid,
pub name: String,
pub description: Option<String>,
pub final_approve: bool,
}
pub fn get_billing_states(settings: &State<Settings>) -> Result<Vec<BillingState>, diesel::result::Error> {
use crate::schema::billing_states::dsl::*;
let connection = establish_connection(settings);
match billing_states.order(order.asc()).select((entity_id, name, description, final_approve)).get_results(&connection) {
Ok(bs) => Ok(bs),
Err(e) => {
error!("Couldn't get billing states: {}", e);
Err(e)
}
}
}
pub fn get_billing_state(settings: &State<Settings>, state: uuid::Uuid) -> Result<BillingState, diesel::result::Error> {
use crate::schema::billing_states::dsl::*;
let connection = establish_connection(settings);
match billing_states.select((entity_id, name, description, final_approve)).filter(entity_id.eq(state)).get_result(&connection) {
Ok(bs) => Ok(bs),
Err(e) => {
error!("Couldn't get billing state: {}", e);
Err(e)
}
}
}
pub fn get_billing_states_for_event(settings: &State<Settings>, event: uuid::Uuid) -> Result<Vec<uuid::Uuid>, diesel::result::Error> {
use crate::schema::eu_instances::dsl::*;
let connection = establish_connection(settings);
match eu_instances.filter(event_id.eq(event)).filter(billing_state_id.is_not_null()).select(billing_state_id).get_results(&connection) {
Ok(states) => Ok(states.iter().map(|state: &Option<uuid::Uuid>| state.clone().unwrap()).collect()),
Err(e) => {
error!("Couldn't get billing states from instance for event: {}", e);
Err(e)
}
}
}
#[derive(QueryableByName)]
struct TempQuery {
#[sql_type = "Uuid"]
pub(crate) billing_state_id: uuid::Uuid,
}
pub fn get_min_billing_states_for_event(settings: &State<Settings>, event: uuid::Uuid) -> Result<Option<uuid::Uuid>, diesel::result::Error> {
let connection = establish_connection(settings);
let res: Result<Option<TempQuery>, diesel::result::Error> = sql_query("SELECT billing_state_id FROM eu_instances AS eui INNER JOIN billing_states bs on eui.billing_state_id = bs.entity_id WHERE event_id = $1 ORDER BY bs.order ASC LIMIT 1;").bind::<crate::diesel::sql_types::Uuid, _>(event).get_result(&connection).optional();
match res {
Ok(res) => {
match res {
Some(res) => Ok(Some(res.billing_state_id)),
None => Ok(None),
}
},
Err(e) => {
error!("Couldn't get min billing states from instance for event: {}", e);
Err(e)
}
}
}
pub fn get_billing_approve_log_entry_with_state(settings: &State<Settings>, event: uuid::Uuid, state: uuid::Uuid) -> Result<Option<LogEntry>, diesel::result::Error>{
let connection = establish_connection(settings);
let res: Result<Option<LogEntry>, diesel::result::Error> = sql_query("SELECT * FROM log WHERE affected_entity = $1 AND details->>'state' = $2 ORDER BY timestamp DESC LIMIT 1;").bind::<crate::diesel::sql_types::Uuid, _>(event).bind::<crate::diesel::sql_types::Text, _>(state.to_string()).get_result(&connection).optional();
match res{
Err(e) => {
error!("Couldn't get billing approve log entry: {}", e);
Err(e)
},
Ok(res) => Ok(res)
}
}