//! # 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 { 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> { 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 { 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 { 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 { Ok(SurveyChoice { id: row.get_u64("ID")?, name: row.get_str("Choix")?, count: row.get_u64("count_choice")?, }) }