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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
use rouille; use rouille::router; use serde::Deserialize; use serde::Serialize; use serde_json; use log::warn; use crate::errors::Error; use crate::errors::ErrorKind; use crate::tests::questions::models::NewQuestion; use crate::tests::questions::models::Question; use super::schema::question_categories; #[derive(Queryable, Serialize, Deserialize, Debug)] pub struct RawQuestionCategory { pub id: u64, pub title: String, } #[derive(Insertable, Serialize, Deserialize, Debug)] #[table_name = "question_categories"] pub struct NewRawQuestionCategory { pub title: String, } #[derive(Queryable, Debug)] pub struct JoinedQuestionCategory { pub question_category: RawQuestionCategory, pub question: Option<Question>, } #[derive(Serialize, Deserialize, Debug)] pub struct QuestionCategory { pub id: u64, pub title: String, pub questions: Vec<Question>, } #[derive(Serialize, Deserialize, Debug)] pub struct NewQuestionCategory { pub title: String, pub questions: Vec<NewQuestion>, } #[derive(Serialize, Deserialize, Debug)] pub struct QuestionCategoryList { pub question_categories: Vec<QuestionCategory>, } pub enum QuestionCategoryRequest { GetQuestionCategories, GetQuestionCategory(u64), CreateQuestionCategory(NewQuestionCategory), DeleteQuestionCategory(u64), } impl QuestionCategoryRequest { pub fn from_rouille(request: &rouille::Request) -> Result<QuestionCategoryRequest, Error> { router!(request, (GET) (/) => { Ok(QuestionCategoryRequest::GetQuestionCategories) }, (GET) (/{id: u64}) => { Ok(QuestionCategoryRequest::GetQuestionCategory(id)) }, (POST) (/) => { let request_body = request.data().ok_or(Error::new(ErrorKind::Body))?; let new_question_category: NewQuestionCategory = serde_json::from_reader(request_body)?; Ok(QuestionCategoryRequest::CreateQuestionCategory(new_question_category)) }, (DELETE) (/{id: u64}) => { Ok(QuestionCategoryRequest::DeleteQuestionCategory(id)) }, _ => { warn!("Could not create a question_category request for the given rouille request"); Err(Error::new(ErrorKind::NotFound)) } ) } } pub enum QuestionCategoryResponse { OneQuestionCategory(QuestionCategory), ManyQuestionCategories(QuestionCategoryList), NoResponse, } impl QuestionCategoryResponse { pub fn to_rouille(self) -> rouille::Response { match self { QuestionCategoryResponse::OneQuestionCategory(question_category) => { rouille::Response::json(&question_category) } QuestionCategoryResponse::ManyQuestionCategories(question_categories) => { rouille::Response::json(&question_categories) } QuestionCategoryResponse::NoResponse => rouille::Response::empty_204(), } } }