添加feedback业务
This commit is contained in:
parent
0acdbcb344
commit
ec6b061ed7
29
api/src/controller/feedback.rs
Normal file
29
api/src/controller/feedback.rs
Normal 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
|
||||||
|
}
|
@ -1 +1,2 @@
|
|||||||
pub mod player_info;
|
pub mod player_info;
|
||||||
|
pub mod feedback;
|
@ -8,7 +8,9 @@ use tower_http::trace::TraceLayer;
|
|||||||
pub(crate) fn init() -> Router {
|
pub(crate) fn init() -> Router {
|
||||||
let open = Router::new().route("/", get(|| async { "hello" }));
|
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()
|
Router::new()
|
||||||
.nest("/", open)
|
.nest("/", open)
|
||||||
|
11
domain/src/dto/feedback.rs
Normal file
11
domain/src/dto/feedback.rs
Normal 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>
|
||||||
|
}
|
@ -1 +1,3 @@
|
|||||||
pub mod player_info;
|
pub mod player_info;
|
||||||
|
pub mod feedback;
|
||||||
|
pub mod pageable;
|
7
domain/src/dto/pageable.rs
Normal file
7
domain/src/dto/pageable.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct PageParams {
|
||||||
|
pub page: u64,
|
||||||
|
pub page_size: u64,
|
||||||
|
}
|
@ -1,7 +1,8 @@
|
|||||||
use sea_orm::entity::prelude::*;
|
use sea_orm::entity::prelude::*;
|
||||||
use sea_orm::prelude::DateTime;
|
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")]
|
#[sea_orm(table_name = "feedback")]
|
||||||
pub struct Model {
|
pub struct Model {
|
||||||
#[sea_orm(primary_key)]
|
#[sea_orm(primary_key)]
|
||||||
|
@ -3,4 +3,4 @@
|
|||||||
pub mod prelude;
|
pub mod prelude;
|
||||||
pub mod account;
|
pub mod account;
|
||||||
pub mod player_info;
|
pub mod player_info;
|
||||||
mod feedback;
|
pub mod feedback;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
pub mod rejection;
|
pub mod rejection;
|
||||||
pub mod response;
|
pub mod response;
|
||||||
pub mod status;
|
pub mod status;
|
||||||
|
pub mod pageable;
|
24
library/src/resp/pageable.rs
Normal file
24
library/src/resp/pageable.rs
Normal 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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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))
|
||||||
|
}
|
@ -1,2 +1,2 @@
|
|||||||
pub mod player_info;
|
pub mod player_info;
|
||||||
mod feedback;
|
pub mod feedback;
|
||||||
|
Loading…
Reference in New Issue
Block a user