From 7a0e9173dc61132837e6709cf91058337231c251 Mon Sep 17 00:00:00 2001 From: zrll_ <46812903+zrll12@users.noreply.github.com> Date: Sun, 18 Aug 2024 00:11:48 +0800 Subject: [PATCH] feat: add post question --- Cargo.lock | 44 ----------------- Cargo.toml | 3 +- migration/src/lib.rs | 2 + .../m20240816_073728_create_answer_table.rs | 4 -- .../m20240817_154332_create_score_table.rs | 47 +++++++++++++++++++ src/controller/question/modify.rs | 17 ++++--- src/model/generated/admin.rs | 2 +- src/model/generated/mod.rs | 1 + src/model/generated/prelude.rs | 1 + src/model/generated/score.rs | 20 ++++++++ src/model/question.rs | 3 ++ 11 files changed, 87 insertions(+), 57 deletions(-) create mode 100644 migration/src/m20240817_154332_create_score_table.rs create mode 100644 src/model/generated/score.rs diff --git a/Cargo.lock b/Cargo.lock index ab42d9f..083a529 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -464,33 +464,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - [[package]] name = "clap" version = "4.5.8" @@ -651,12 +624,6 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "crypto-common" version = "0.1.6" @@ -1013,16 +980,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if", - "crunchy", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -1328,7 +1285,6 @@ dependencies = [ "axum", "axum-server", "chrono", - "ciborium", "diff", "futures", "lazy_static", diff --git a/Cargo.toml b/Cargo.toml index e8b7110..f6cb6e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,14 +31,13 @@ diff = "0.1.13" moka = { version = "0.12.8", features = ["future"] } rand = "0.8.5" reqwest = "0.12.5" +uuid = { version = "1.9.1", features = ["v4"] } #database migration = {path = "migration"} sea-orm = { version = "0.12.15", features = ["macros", "sqlx-postgres", "runtime-tokio-rustls"] } futures = "0.3.30" chrono = "0.4.38" -uuid = { version = "1.9.1", features = ["v4"] } -ciborium = "0.2.2" [build-dependencies] diff --git a/migration/src/lib.rs b/migration/src/lib.rs index 3102b5a..8d1e9ca 100644 --- a/migration/src/lib.rs +++ b/migration/src/lib.rs @@ -7,6 +7,7 @@ mod m20240816_073728_create_answer_table; mod m20240817_030711_add_required_to_question; mod m20240817_035143_add_control_to_survey; mod m20240817_100708_create_admin_table; +mod m20240817_154332_create_score_table; pub struct Migrator; @@ -21,6 +22,7 @@ impl MigratorTrait for Migrator { Box::new(m20240817_030711_add_required_to_question::Migration), Box::new(m20240817_035143_add_control_to_survey::Migration), Box::new(m20240817_100708_create_admin_table::Migration), + Box::new(m20240817_154332_create_score_table::Migration), ] } } diff --git a/migration/src/m20240816_073728_create_answer_table.rs b/migration/src/m20240816_073728_create_answer_table.rs index 411fba3..f546dcd 100644 --- a/migration/src/m20240816_073728_create_answer_table.rs +++ b/migration/src/m20240816_073728_create_answer_table.rs @@ -20,11 +20,9 @@ impl MigrationTrait for Migration { ) .col(ColumnDef::new(Answer::Survey).integer().not_null()) .col(ColumnDef::new(Answer::User).big_unsigned().not_null()) - .col(ColumnDef::new(Answer::Judge).big_unsigned().null()) .col(ColumnDef::new(Answer::Answers).json().not_null()) .col(ColumnDef::new(Answer::Score).integer().null()) .col(ColumnDef::new(Answer::CreateTime).timestamp().not_null().default(Expr::current_timestamp())) - .col(ColumnDef::new(Answer::JudgedTime).timestamp().null()) .col(ColumnDef::new(Answer::Completed).boolean().not_null().default(false)) .to_owned(), ) @@ -44,10 +42,8 @@ enum Answer { Id, Survey, User, - Judge, Answers, Score, CreateTime, - JudgedTime, Completed } diff --git a/migration/src/m20240817_154332_create_score_table.rs b/migration/src/m20240817_154332_create_score_table.rs new file mode 100644 index 0000000..8b44af1 --- /dev/null +++ b/migration/src/m20240817_154332_create_score_table.rs @@ -0,0 +1,47 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(Score::Table) + .if_not_exists() + .col( + ColumnDef::new(Score::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(Score::User).big_unsigned().not_null()) + .col(ColumnDef::new(Score::Judge).big_unsigned().not_null()) + .col(ColumnDef::new(Score::Survey).integer().not_null()) + .col(ColumnDef::new(Score::Answer).integer().not_null()) + .col(ColumnDef::new(Score::Scores).array(ColumnType::Json).not_null()) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop().table(Score::Table).to_owned()) + .await + } +} + +#[derive(DeriveIden)] +enum Score { + Table, + Id, + User, + Judge, + Survey, + Answer, + Scores, +} diff --git a/src/controller/question/modify.rs b/src/controller/question/modify.rs index 6d33d42..8f34ea7 100644 --- a/src/controller/question/modify.rs +++ b/src/controller/question/modify.rs @@ -1,19 +1,24 @@ -use crate::model::question::QuestionType; +use crate::model::question::{Condition, QuestionType}; use crate::service::questions::save_question; use axum::Json; -use sea_orm::JsonValue; use serde::Serialize; +use crate::model::ValueWithTitle; pub async fn new_question(Json(question): Json) -> String { - let id = save_question(question.content, question.r#type, question.values, question.condition, question.required, None).await; + let content = serde_json::to_value(question.content).unwrap(); + let values = question.values.map(|values| + values.iter().map(|v| serde_json::to_value(v).unwrap()).collect()); + let condition = question.condition.map(|c| serde_json::to_string(&c).unwrap()); + + let id = save_question(content, question.r#type, values, condition, question.required, None).await; id.to_string() } #[derive(serde::Deserialize, Serialize)] pub struct NewQuestionRequest { - pub content: JsonValue, + pub content: ValueWithTitle, pub r#type: QuestionType, - pub values: Option>, - pub condition: Option, + pub values: Option>, + pub condition: Option>, pub required: bool, } \ No newline at end of file diff --git a/src/model/generated/admin.rs b/src/model/generated/admin.rs index 104d861..991a3d4 100644 --- a/src/model/generated/admin.rs +++ b/src/model/generated/admin.rs @@ -6,7 +6,7 @@ use sea_orm::entity::prelude::*; #[sea_orm(table_name = "admin")] pub struct Model { #[sea_orm(primary_key, auto_increment = false)] - pub id: i32, + pub id: i64, pub username: String, pub disabled: bool, } diff --git a/src/model/generated/mod.rs b/src/model/generated/mod.rs index fc32de1..39d30c6 100644 --- a/src/model/generated/mod.rs +++ b/src/model/generated/mod.rs @@ -6,4 +6,5 @@ pub mod admin; pub mod answer; pub mod page; pub mod question; +pub mod score; pub mod survey; diff --git a/src/model/generated/prelude.rs b/src/model/generated/prelude.rs index dcb1923..dd3b4c1 100644 --- a/src/model/generated/prelude.rs +++ b/src/model/generated/prelude.rs @@ -4,4 +4,5 @@ pub use super::admin::Entity as Admin; pub use super::answer::Entity as Answer; pub use super::page::Entity as Page; pub use super::question::Entity as Question; +pub use super::score::Entity as Score; pub use super::survey::Entity as Survey; diff --git a/src/model/generated/score.rs b/src/model/generated/score.rs new file mode 100644 index 0000000..5262e67 --- /dev/null +++ b/src/model/generated/score.rs @@ -0,0 +1,20 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] +#[sea_orm(table_name = "score")] +pub struct Model { + #[sea_orm(primary_key)] + pub id: i32, + pub user: i64, + pub judge: i64, + pub survey: i32, + pub answer: i32, + pub scores: Vec, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/src/model/question.rs b/src/model/question.rs index 7463e73..8a7f659 100644 --- a/src/model/question.rs +++ b/src/model/question.rs @@ -30,8 +30,11 @@ pub struct ConditionInner { #[derive(Serialize, Deserialize, Clone, Debug)] pub enum ConditionType { + #[serde(rename = "and")] And, + #[serde(rename = "or")] Or, + #[serde(rename = "not")] Not, }