Skip to main content

tdm_server_rust/web/
reward_controller.rs

1//! 奖励/悬赏接口 (Reward Controller)
2//!
3//! 奖品兑换、奖券抽选、转账。
4//! 对应 Java RewardController。
5
6use crate::{
7    app::AppState,
8    common::result::ResultBody,
9    common::AppJson,
10    entity::reward::RewardTicketTransferRequest,
11    entity::reward::{
12        EventBalanceDto, RewardRecordResultDto, RewardTicketResultDto, RewardTicketTransferLog,
13        RewardTicketsDetailDto, RewardWinnerDto, Rewardtb,
14    },
15    error::ApiResult,
16    middleware::AuthMember,
17    service::reward_service::RewardService,
18};
19use axum::{
20    extract::{Extension, Path, State},
21    routing::{get, post},
22    Router,
23};
24
25/// 奖励路由(挂载于 `/api/reward`)
26pub fn routes() -> Router<AppState> {
27    Router::new()
28        .route("/balance/:eventId", get(get_reward_balance))
29        .route("/", get(get_rewards))
30        .route(
31            "/exchange/:rewardId/:exchangeNumber/:eventId",
32            post(exchange),
33        )
34        .route("/getRewardRecords", get(get_reward_records))
35        .route("/getRewardTickets", get(get_reward_tickets))
36        .route("/getRewardTicketsDetails", get(get_reward_tickets_details))
37        .route(
38            "/selectWinner/:eventId/:rewardId/:winnerNumber",
39            post(select_winner),
40        )
41        .route(
42            "/changeEventEndTime/:eventId/:endTime",
43            post(change_end_time),
44        )
45        .route("/transfer", post(transfer_ticket))
46        .route("/transfer/getLog", post(get_transfer_log))
47}
48
49/// 查询活动余额
50#[tracing::instrument(skip_all, level = "info")]
51pub async fn get_reward_balance(
52    State(state): State<AppState>,
53    Extension(AuthMember(member)): Extension<AuthMember>,
54    Path(event_id): Path<i32>,
55) -> ApiResult<ResultBody<EventBalanceDto>> {
56    let member_id = member.map(|m| m.id).unwrap_or(0);
57    let data = RewardService::get_reward_balance(&state, member_id, event_id).await?;
58    Ok(ResultBody::success_data(data))
59}
60
61/// 奖品列表
62#[tracing::instrument(skip_all, level = "info")]
63pub async fn get_rewards(State(state): State<AppState>) -> ApiResult<ResultBody<Vec<Rewardtb>>> {
64    let data = RewardService::get_rewards_list(&state).await?;
65    Ok(ResultBody::success_data(data))
66}
67
68/// 兑换奖品
69#[tracing::instrument(skip_all, level = "info")]
70pub async fn exchange(
71    State(state): State<AppState>,
72    Extension(AuthMember(member)): Extension<AuthMember>,
73    Path((reward_id, exchange_number, event_id)): Path<(i32, i32, i32)>,
74) -> ApiResult<ResultBody<()>> {
75    let member_id = member.map(|m| m.id).unwrap_or(0);
76    RewardService::exchange(&state, member_id, reward_id, exchange_number, event_id).await?;
77    Ok(ResultBody::success())
78}
79
80/// 兑换记录
81#[tracing::instrument(skip_all, level = "info")]
82pub async fn get_reward_records(
83    State(state): State<AppState>,
84    Extension(AuthMember(member)): Extension<AuthMember>,
85) -> ApiResult<ResultBody<Vec<RewardRecordResultDto>>> {
86    let member_id = member.map(|m| m.id).unwrap_or(0);
87    let data = RewardService::get_reward_record(&state, member_id).await?;
88    Ok(ResultBody::success_data(data))
89}
90
91/// 奖券列表
92#[tracing::instrument(skip_all, level = "info")]
93pub async fn get_reward_tickets(
94    State(state): State<AppState>,
95    Extension(AuthMember(member)): Extension<AuthMember>,
96) -> ApiResult<ResultBody<Vec<RewardTicketResultDto>>> {
97    let member_id = member.map(|m| m.id).unwrap_or(0);
98    let data = RewardService::get_reward_tickets(&state, member_id).await?;
99    Ok(ResultBody::success_data(data))
100}
101
102/// 奖券详情
103#[tracing::instrument(skip_all, level = "info")]
104pub async fn get_reward_tickets_details(
105    State(state): State<AppState>,
106    Extension(AuthMember(member)): Extension<AuthMember>,
107) -> ApiResult<ResultBody<Vec<RewardTicketsDetailDto>>> {
108    let member_id = member.map(|m| m.id).unwrap_or(0);
109    let data = RewardService::get_tickets_details(&state, member_id).await?;
110    Ok(ResultBody::success_data(data))
111}
112
113/// 抽取中奖者
114#[tracing::instrument(skip_all, level = "info")]
115pub async fn select_winner(
116    State(state): State<AppState>,
117    Extension(AuthMember(member)): Extension<AuthMember>,
118    Path((event_id, reward_id, winner_number)): Path<(i32, i32, i32)>,
119) -> ApiResult<ResultBody<Vec<RewardWinnerDto>>> {
120    let member_id = member.map(|m| m.id).unwrap_or(0);
121    let data =
122        RewardService::select_winner(&state, member_id, reward_id, event_id, winner_number).await?;
123    Ok(ResultBody::success_data(data))
124}
125
126/// 修改活动结束时间
127#[tracing::instrument(skip_all, level = "info")]
128pub async fn change_end_time(
129    State(state): State<AppState>,
130    Extension(AuthMember(member)): Extension<AuthMember>,
131    Path((event_id, end_time)): Path<(String, String)>,
132) -> ApiResult<ResultBody<()>> {
133    let member_id = member.map(|m| m.id).unwrap_or(0);
134    RewardService::change_end_time(&state, member_id, &event_id, &end_time).await?;
135    Ok(ResultBody::success())
136}
137
138/// 转账
139#[tracing::instrument(skip_all, level = "info")]
140pub async fn transfer_ticket(
141    State(state): State<AppState>,
142    Extension(AuthMember(member)): Extension<AuthMember>,
143    AppJson(body): AppJson<RewardTicketTransferRequest>,
144) -> ApiResult<ResultBody<()>> {
145    let from_id = member.map(|m| m.id).unwrap_or(0);
146    RewardService::transfer(&state, from_id, body).await?;
147    Ok(ResultBody::success())
148}
149
150/// 转账日志
151#[tracing::instrument(skip_all, level = "info")]
152pub async fn get_transfer_log(
153    State(state): State<AppState>,
154    Extension(AuthMember(member)): Extension<AuthMember>,
155) -> ApiResult<ResultBody<Vec<RewardTicketTransferLog>>> {
156    let member_id = member.map(|m| m.id).unwrap_or(0);
157    let data = RewardService::get_transfer_log(&state, member_id).await?;
158    Ok(ResultBody::success_data(data))
159}