mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2024-11-29 16:56:28 +00:00
63 lines
2.1 KiB
Rust
63 lines
2.1 KiB
Rust
|
//! # 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")?,
|
||
|
})
|
||
|
}
|