1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
use diesel; use diesel::mysql::MysqlConnection; use diesel::ExpressionMethods; use diesel::QueryDsl; use diesel::RunQueryDsl; use crate::errors::Error; use crate::errors::ErrorKind; use crate::permissions::requests::check_to_run; use crate::tests::questions::models::{ NewRawQuestion, Question, QuestionList, QuestionRequest, QuestionResponse, PartialQuestion }; use crate::tests::questions::schema::questions as questions_schema; pub fn handle_question( request: QuestionRequest, requested_user: Option<u64>, database_connection: &MysqlConnection, ) -> Result<QuestionResponse, Error> { match request { QuestionRequest::GetQuestions => { check_to_run(requested_user, "GetQuestions", database_connection)?; get_questions(database_connection).map(|u| QuestionResponse::ManyQuestions(u)) } QuestionRequest::CreateQuestion(question) => { check_to_run(requested_user, "CreateQuestions", database_connection)?; create_question(question, database_connection).map(|u| QuestionResponse::OneQuestion(u)) } QuestionRequest::DeleteQuestion(id) => { check_to_run(requested_user, "DeleteQuestions", database_connection)?; delete_question(id, database_connection).map(|_| QuestionResponse::NoResponse) } QuestionRequest::UpdateQuestion(id, question) => { check_to_run(requested_user, "UpdateQuestions", database_connection)?; update_question(id, question, database_connection) .map(|_| QuestionResponse::NoResponse) } } } pub(crate) fn get_questions(database_connection: &MysqlConnection) -> Result<QuestionList, Error> { let found_questions = questions_schema::table.load::<Question>(database_connection)?; Ok(QuestionList { questions: found_questions, }) } pub(crate) fn create_question( question: NewRawQuestion, database_connection: &MysqlConnection, ) -> Result<Question, Error> { diesel::insert_into(questions_schema::table) .values(question) .execute(database_connection)?; let mut inserted_questions = questions_schema::table .filter(diesel::dsl::sql("id = LAST_INSERT_ID()")) .load::<Question>(database_connection)?; if let Some(inserted_question) = inserted_questions.pop() { Ok(inserted_question) } else { Err(Error::new(ErrorKind::Database)) } } pub(crate) fn update_question( id: u64, question: PartialQuestion, database_connection: &MysqlConnection ) -> Result<(), Error> { diesel::update(questions_schema::table) .filter(questions_schema::id.eq(id)) .set(&question) .execute(database_connection)?; Ok(()) } pub(crate) fn delete_question(id: u64, database_connection: &MysqlConnection) -> Result<(), Error> { diesel::delete(questions_schema::table.filter(questions_schema::id.eq(id))) .execute(database_connection)?; Ok(()) }