1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2024-11-29 16:56:28 +00:00
comunicapiv3/src/helpers/survey_helper.rs

63 lines
2.1 KiB
Rust
Raw Normal View History

2020-07-04 14:44:42 +00:00
//! # Survey helper
//!
//! @author Pierre Hubert
use crate::constants::database_tables_names::{SURVEY_CHOICES_TABLE, SURVEY_INFO_TABLE, SURVEY_RESPONSE_TABLE};
use crate::data::error::ResultBoxError;
use crate::data::survey::{Survey, SurveyChoice};
use crate::data::user::UserID;
use crate::helpers::database;
/// Get information about a survey
pub fn get_info(post_id: u64) -> ResultBoxError<Survey> {
database::QueryInfo::new(SURVEY_INFO_TABLE)
.cond_u64("ID_texte", post_id)
.query_row(db_to_survey)
}
/// Get the choices of a survey
fn get_survey_choices(survey_id: u64) -> ResultBoxError<Vec<SurveyChoice>> {
database::QueryInfo::new(SURVEY_CHOICES_TABLE)
.alias("c")
.set_join_type(database::DatabaseQueryJoinType::LEFT)
.join(SURVEY_RESPONSE_TABLE, "r", "c.ID = r.ID_sondage_choix")
.cond_u64("c.ID_sondage", survey_id)
.set_group_by("c.ID")
.add_field("c.*")
.add_field("COUNT(r.ID) AS count_choice")
.exec(db_to_survey_choice)
}
/// Get the choice of a user for a survey
pub fn get_user_choice(survey_id: u64, user_id: &UserID) -> ResultBoxError<u64> {
Ok(database::QueryInfo::new(SURVEY_RESPONSE_TABLE)
.cond_u64("ID_sondage", survey_id)
.cond_user_id("ID_utilisateurs", user_id)
.exec(|r| r.get_u64("ID_sondage_choix"))?
.pop()
.unwrap_or(0))
}
/// Turn a database entry into a row object
fn db_to_survey(row: &database::RowResult) -> ResultBoxError<Survey> {
let survey_id = row.get_u64("ID")?;
Ok(Survey {
id: survey_id,
user_id: row.get_user_id("ID_utilisateurs")?,
time_create: row.get_date_as_time("date_creation")?,
post_id: row.get_u64("ID_texte")?,
question: row.get_str("question")?,
choices: get_survey_choices(survey_id)?,
allow_new_choices: row.get_legacy_bool("allow_new_choices")?,
})
}
/// Turn a database row into a survey choice
fn db_to_survey_choice(row: &database::RowResult) -> ResultBoxError<SurveyChoice> {
Ok(SurveyChoice {
id: row.get_u64("ID")?,
name: row.get_str("Choix")?,
count: row.get_u64("count_choice")?,
})
}