添加feedback业务

This commit is contained in:
liyunjia 2024-04-22 21:45:57 +08:00
parent 0acdbcb344
commit ec6b061ed7
12 changed files with 136 additions and 7 deletions

View File

@ -0,0 +1,29 @@
use axum::extract::Query;
use axum::Json;
use axum_extra::extract::WithRejection;
use validator::Validate;
use domain::dto::feedback::FeedbackAdd;
use domain::dto::pageable::PageParams;
use domain::entities::feedback;
use library::resp::pageable::Pageable;
use library::resp::rejection::IRejection;
use library::resp::response::{ResErr, ResOK, ResResult};
/// 添加反馈信息
pub async fn add_feedback(
WithRejection(Json(req), _): IRejection<Json<FeedbackAdd>>
) -> ResResult<ResOK<()>> {
if let Err(err) = req.validate() {
return Err(ResErr::ErrParams(Some(err.to_string())));
}
service::feedback::add_feedback(req).await?;
Ok(ResOK(None))
}
/// 获取反馈信息列表
pub async fn get_feedback_list_by_page(
Query(pageParams): Query<PageParams>
) -> ResResult<ResOK<Pageable<feedback::Model>>> {
service::feedback::get_feedback_list_by_page(pageParams.page, pageParams.page_size).await
}

View File

@ -1 +1,2 @@
pub mod player_info;
pub mod feedback;

View File

@ -8,7 +8,9 @@ use tower_http::trace::TraceLayer;
pub(crate) fn init() -> Router {
let open = Router::new().route("/", get(|| async { "hello" }));
let auth = Router::new().route("/game_accounts", post(controller::player_info::create));
let auth = Router::new()
.route("/game_accounts", post(controller::player_info::create))
.route("/feedback", post(controller::feedback::add_feedback).get(controller::feedback::get_feedback_list_by_page));
Router::new()
.nest("/", open)

View File

@ -0,0 +1,11 @@
use sea_orm::prelude::DateTime;
use serde::{Deserialize, Serialize};
use validator::Validate;
#[derive(Debug, Validate, Deserialize, Serialize)]
pub struct FeedbackAdd {
#[validate(required(message = "用户ID不能为空"))]
pub user_id: Option<u64>,
#[validate(required, length(min = 1, message = "反馈内容不能为空"))]
pub content: Option<String>
}

View File

@ -1 +1,3 @@
pub mod player_info;
pub mod feedback;
pub mod pageable;

View File

@ -0,0 +1,7 @@
use serde::Deserialize;
#[derive(Deserialize)]
pub struct PageParams {
pub page: u64,
pub page_size: u64,
}

View File

@ -1,7 +1,8 @@
use sea_orm::entity::prelude::*;
use sea_orm::prelude::DateTime;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, Serialize, Deserialize)]
#[sea_orm(table_name = "feedback")]
pub struct Model {
#[sea_orm(primary_key)]

View File

@ -3,4 +3,4 @@
pub mod prelude;
pub mod account;
pub mod player_info;
mod feedback;
pub mod feedback;

View File

@ -1,3 +1,4 @@
pub mod rejection;
pub mod response;
pub mod status;
pub mod pageable;

View File

@ -0,0 +1,24 @@
use std::fmt::Debug;
use serde::Serialize;
#[derive(Debug, Serialize)]
pub struct Pageable<T> where T: Debug + Serialize {
pub data: Vec<T>,
pub total: u64,
}
impl <T> Pageable<T> where T: Debug + Serialize {
pub fn new(data: Vec<T>, total: u64) -> Self {
Self {
data,
total,
}
}
pub fn empty() -> Self {
Self {
data: vec![],
total: 0,
}
}
}

View File

@ -1 +1,52 @@
use sea_orm::{EntityTrait, PaginatorTrait};
use sea_orm::ActiveValue::Set;
use domain::dto::feedback::FeedbackAdd;
use domain::entities::feedback;
use domain::entities::prelude::Feedback;
use library::db;
use library::resp::pageable::Pageable;
use library::resp::response::{ResOK, ResResult};
/// 获取反馈信息列表
pub async fn get_feedback_list_by_page(page: u64, page_size: u64) -> ResResult<ResOK<Pageable<feedback::Model>>> {
let feedback_list = Feedback::find()
.paginate(db!(), page_size)
.fetch_page(page)
.await
.ok();
if feedback_list.is_none() {
tracing::error!("反馈信息为空");
return Ok(ResOK(Some(Pageable::<feedback::Model>::empty())));
}
let total = get_feedback_count().await;
Ok(ResOK(Some(Pageable::new(feedback_list.unwrap(), total))))
}
/// 获取反馈信息总数
async fn get_feedback_count() -> u64 {
let count = Feedback::find().count(db!()).await.ok();
if count.is_none() {
tracing::error!("反馈信息为空");
return 0;
}
count.unwrap()
}
/// 添加反馈信息
pub async fn add_feedback(req: FeedbackAdd) -> ResResult<ResOK<()>> {
let now = chrono::Local::now().naive_local();
let model = feedback::ActiveModel {
user_id: Set(req.user_id.unwrap()),
content: Set(req.content.unwrap()),
created_at: Set(now),
..Default::default()
};
if let Err(err) = Feedback::insert(model).exec(db!()).await {
tracing::error!(error = ?err, "添加反馈信息失败");
return Err(library::resp::response::ResErr::ErrSystem(None));
}
Ok(ResOK(None))
}

View File

@ -1,2 +1,2 @@
pub mod player_info;
mod feedback;
pub mod feedback;