1use 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
25pub 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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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}