Skip to content

Commit

Permalink
fix: complete state error
Browse files Browse the repository at this point in the history
  • Loading branch information
zrll12 committed Aug 30, 2024
1 parent d145c7b commit 8c69cb0
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 26 deletions.
2 changes: 1 addition & 1 deletion src/controller/admin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ pub async fn get_admin_info(Query(query): Query<AdminInfoRequest>, AdminTokenInf
let admin = Admin::find()
.filter(crate::model::generated::admin::Column::Id.eq(query.id))
.one(&*crate::DATABASE).await.unwrap()
.ok_or(ErrorMessage::NotFound)?;
.ok_or(ErrorMessage::PermissionDenied)?;

Ok(serde_json::to_string(&admin).unwrap())
}
Expand Down
39 changes: 32 additions & 7 deletions src/controller/answer/search.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
use crate::controller::error::ErrorMessage;
use crate::model::generated::prelude::Answer;
use crate::model::generated::{answer, score};
use crate::service::admin::AdminTokenInfo;
use crate::DATABASE;
use axum::extract::Query;
use sea_orm::ColumnTrait;
use sea_orm::prelude::DateTime;
use sea_orm::{ColumnTrait, FromQueryResult, QuerySelect};
use sea_orm::{EntityTrait, PaginatorTrait, QueryFilter};
use serde::{Deserialize, Serialize};
use tracing::info;
use crate::model::generated::answer;

pub async fn search_answer(AdminTokenInfo(admin): AdminTokenInfo, Query(request): Query<SearchAnswerQuery>) -> Result<String, ErrorMessage> {
info!("Admin {} search answer", admin.id);
Expand All @@ -20,13 +21,27 @@ pub async fn search_answer(AdminTokenInfo(admin): AdminTokenInfo, Query(request)
if let Some(user) = request.user {
answers = answers.filter(answer::Column::User.eq(user));
}
if let Some(true) = request.only_unfinished {
answers = answers.filter(answer::Column::Completed.eq(false));
if let Some(true) = request.only_unfinished {
answers = answers.filter(score::Column::Completed.eq(false));
}


let answers = answers
.columns(vec![
answer::Column::Id,
answer::Column::Survey,
answer::Column::User,
answer::Column::Score,
answer::Column::CreateTime,
])
.column_as(answer::Column::Completed, "done")
.column(score::Column::Completed)
.filter(answer::Column::Completed.eq(true))
.inner_join(score::Entity)
.into_model::<AnswerQueryResult>();

let paginator = answers.paginate(&*DATABASE, request.size.unwrap_or(10));
let answers = paginator.fetch_page(request.page).await.unwrap();

let answers = SearchAnswerResponse {
records: answers,
total: paginator.num_pages().await.unwrap(),
Expand All @@ -46,6 +61,16 @@ pub struct SearchAnswerQuery {

#[derive(Serialize)]
pub struct SearchAnswerResponse {
records: Vec<answer::Model>,
records: Vec<AnswerQueryResult>,
total: u64,
}

#[derive(Serialize, FromQueryResult)]
pub struct AnswerQueryResult {
pub id: i32,
pub survey: i32,
pub user: i64,
pub score: Option<i32>,
pub create_time: DateTime,
pub completed: bool,
}
37 changes: 21 additions & 16 deletions src/controller/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ use axum::http::StatusCode;
use axum::response::{IntoResponse, Response};

pub enum ErrorMessage {
InvalidParams(String),
// InvalidParams(String),
InvalidToken,
TokenNotActivated,
PermissionDenied,
TooManySubmit,
NotFound,
InvalidField,
MissingField,
Other(String),
// InvalidField,
// MissingField,
// Other(String),
DatabaseError(String),
}

Expand All @@ -19,9 +19,9 @@ impl IntoResponse for ErrorMessage {
let builder = Response::builder();

match self {
ErrorMessage::InvalidParams(name) => {
builder.status(StatusCode::BAD_REQUEST).body(format!("Invalid params: {}.", name).into()).unwrap()
}
// ErrorMessage::InvalidParams(name) => {
// builder.status(StatusCode::BAD_REQUEST).body(format!("Invalid params: {}.", name).into()).unwrap()
// }

ErrorMessage::InvalidToken => {
builder.status(StatusCode::UNAUTHORIZED).body("Invalid token.".into()).unwrap()
Expand All @@ -38,18 +38,23 @@ impl IntoResponse for ErrorMessage {
ErrorMessage::NotFound => {
builder.status(StatusCode::NOT_FOUND).body("Not found.".into()).unwrap()
}
ErrorMessage::Other(text) => {
builder.status(StatusCode::INTERNAL_SERVER_ERROR).body(text.into()).unwrap()
}

// ErrorMessage::Other(text) => {
// builder.status(StatusCode::INTERNAL_SERVER_ERROR).body(text.into()).unwrap()
// }

ErrorMessage::TooManySubmit => {
builder.status(StatusCode::TOO_MANY_REQUESTS).body("Too many submit.".into()).unwrap()
}
ErrorMessage::InvalidField => {
builder.status(StatusCode::BAD_REQUEST).body("Invalid field.".into()).unwrap()
}
ErrorMessage::MissingField => {
builder.status(StatusCode::BAD_REQUEST).body("Missing field.".into()).unwrap()
}

// ErrorMessage::InvalidField => {
// builder.status(StatusCode::BAD_REQUEST).body("Invalid field.".into()).unwrap()
// }
//
// ErrorMessage::MissingField => {
// builder.status(StatusCode::BAD_REQUEST).body("Missing field.".into()).unwrap()
// }

ErrorMessage::DatabaseError(text) => {
builder.status(StatusCode::INTERNAL_SERVER_ERROR).body(format!("Database error: {}", text).into()).unwrap()
}
Expand Down
11 changes: 10 additions & 1 deletion src/model/generated/answer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,15 @@ pub struct Model {
}

#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
pub enum Relation {
#[sea_orm(has_one = "super::score::Entity")]
Score
}

impl Related<super::score::Entity> for Entity {
fn to() -> RelationDef {
Relation::Score.def()
}
}

impl ActiveModelBehavior for ActiveModel {}
15 changes: 14 additions & 1 deletion src/model/generated/score.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,19 @@ pub struct Model {
}

#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
pub enum Relation {
#[sea_orm(
belongs_to = "super::answer::Entity",
from = "Column::Id",
to = "super::answer::Column::Id"
)]
Answer,
}

impl Related<super::answer::Entity> for Entity {
fn to() -> RelationDef {
Relation::Answer.def()
}
}

impl ActiveModelBehavior for ActiveModel {}

0 comments on commit 8c69cb0

Please sign in to comment.