Skip to content

Commit

Permalink
add Ranking question type
Browse files Browse the repository at this point in the history
  • Loading branch information
KavikaPalletenne committed Nov 5, 2024
1 parent 848d476 commit f491684
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 3 deletions.
2 changes: 1 addition & 1 deletion backend/migrations/20240406031400_create_questions.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
CREATE TYPE question_type AS ENUM ('ShortAnswer', 'MultiChoice', 'MultiSelect', 'DropDown');
CREATE TYPE question_type AS ENUM ('ShortAnswer', 'MultiChoice', 'MultiSelect', 'DropDown', 'Ranking');

CREATE TABLE questions (
id BIGINT PRIMARY KEY,
Expand Down
17 changes: 17 additions & 0 deletions backend/migrations/20240406031915_create_applications.sql
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,23 @@ CREATE TABLE multi_option_answer_options (
ON UPDATE CASCADE
);

CREATE TABLE ranking_answer_rankings (
id BIGSERIAL PRIMARY KEY,
option_id BIGINT NOT NULL,
rank INTEGER NOT NULL,
answer_id BIGINT NOT NULL,
CONSTRAINT FK_ranking_answer_rankings_question_options
FOREIGN KEY(option_id)
REFERENCES multi_option_question_options(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT FK_ranking_answer_rankings_answers
FOREIGN KEY(answer_id)
REFERENCES answers(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);

CREATE INDEX IDX_multi_option_answer_options_question_options on multi_option_answer_options (option_id);
CREATE INDEX IDX_multi_option_answer_options_answers on multi_option_answer_options (answer_id);

Expand Down
15 changes: 15 additions & 0 deletions backend/server/src/models/answer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ pub enum AnswerData {
MultiChoice(i64),
MultiSelect(Vec<i64>),
DropDown(i64),
Ranking(Vec<i64>)
}

impl AnswerData {
Expand Down Expand Up @@ -88,6 +89,20 @@ impl AnswerData {
let query = query_builder.build();
let result = query.execute(pool).await?;

Ok(())
},
Self::Ranking(option_ids) => {
let mut query_builder = sqlx::QueryBuilder::new("INSERT INTO ranking_answer_rankings (option_id, rank, answer_id)");

let mut rank = 1;
query_builder.push_values(option_ids, |mut b, option_id| {
b.push_bind(option_id).push_bind(rank).push_bind(answer_id);
rank += 1;
});

let query = query_builder.build();
let result = query.execute(pool).await?;

Ok(())
}
}
Expand Down
7 changes: 5 additions & 2 deletions backend/server/src/models/question.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ pub enum QuestionData {
MultiChoice(MultiOptionData),
MultiSelect(MultiOptionData),
DropDown(MultiOptionData),
Ranking(MultiOptionData),
}

#[derive(Deserialize, Serialize)]
Expand All @@ -75,7 +76,8 @@ impl QuestionData {
Self::ShortAnswer => Ok(()),
Self::MultiChoice(data)
| Self::MultiSelect(data)
| Self::DropDown(data) => {
| Self::DropDown(data)
| Self::Ranking(data) => {
if data.options.len() > 0 {
return Ok(());
};
Expand All @@ -90,7 +92,8 @@ impl QuestionData {
Self::ShortAnswer => Ok(()),
Self::MultiChoice(data)
| Self::MultiSelect(data)
| Self::DropDown(data) => {
| Self::DropDown(data)
| Self::Ranking(data) => {
let mut query_builder =
QueryBuilder::new("INSERT INTO multi_option_question_options (id, text, question_id, rank)");

Expand Down

0 comments on commit f491684

Please sign in to comment.