95 lines
3.7 KiB
Rust
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)
|
|
}
|
|
|
|
} |