1- use crate :: { models:: * , unifi_api:: * } ;
2- use axum:: { extract:: Query , http:: StatusCode , response:: Json } ;
3- use tracing:: { debug, error} ;
1+ use axum:: {
2+ extract:: Query ,
3+ http:: { HeaderMap , StatusCode } ,
4+ response:: Json ,
5+ } ;
6+ use tracing:: { debug, error, info} ;
7+
8+ use crate :: { models:: * , unifi_api:: UNIFI_API } ;
49
510pub async fn get_vouchers_handler ( ) -> Result < Json < GetVouchersResponse > , StatusCode > {
611 debug ! ( "Received request to get vouchers" ) ;
@@ -14,7 +19,20 @@ pub async fn get_vouchers_handler() -> Result<Json<GetVouchersResponse>, StatusC
1419 }
1520}
1621
17- pub async fn get_newest_voucher_handler ( ) -> Result < Json < Option < Voucher > > , StatusCode > {
22+ pub async fn get_rolling_voucher_handler ( ) -> Result < Json < Voucher > , StatusCode > {
23+ debug ! ( "Received request to get rolling voucher" ) ;
24+ let client = UNIFI_API . get ( ) . expect ( "UnifiAPI not initialized" ) ;
25+ match client. get_rolling_voucher ( ) . await {
26+ Ok ( Some ( voucher) ) => Ok ( Json ( voucher) ) ,
27+ Ok ( None ) => Err ( StatusCode :: NOT_FOUND ) ,
28+ Err ( e) => {
29+ error ! ( "Failed to get rolling voucher: {}" , e) ;
30+ Err ( e)
31+ }
32+ }
33+ }
34+
35+ pub async fn get_newest_voucher_handler ( ) -> Result < Json < Voucher > , StatusCode > {
1836 debug ! ( "Received request to get newest voucher" ) ;
1937 let client = UNIFI_API . get ( ) . expect ( "UnifiAPI not initialized" ) ;
2038 match client. get_newest_voucher ( ) . await {
@@ -54,6 +72,38 @@ pub async fn create_voucher_handler(
5472 }
5573}
5674
75+ pub async fn create_rolling_voucher_handler (
76+ headers : HeaderMap ,
77+ ) -> Result < Json < Voucher > , StatusCode > {
78+ debug ! ( "Received request to create voucher" ) ;
79+
80+ let client = UNIFI_API . get ( ) . expect ( "UnifiAPI not initialized" ) ;
81+
82+ if let Some ( forwarded) = headers. get ( "x-forwarded-for" ) {
83+ if let Ok ( ip) = forwarded. to_str ( ) {
84+ debug ! ( "Client IP from x-forwarded-for: {}" , ip) ;
85+
86+ // Check if user already rotated the rolling voucher
87+ if client. check_rolling_voucher_ip ( ip) . await ? {
88+ info ! ( "Rolling voucher already rotated for IP: {}" , ip) ;
89+ return Err ( StatusCode :: FORBIDDEN ) ;
90+ }
91+
92+ // Voucher rotation allowed, create a new rolling voucher
93+ match client. create_rolling_voucher ( ip) . await {
94+ Ok ( response) => return Ok ( Json ( response) ) ,
95+ Err ( e) => {
96+ error ! ( "Failed to create rolling voucher: {}" , e) ;
97+ return Err ( e) ;
98+ }
99+ }
100+ }
101+ }
102+
103+ error ! ( "Invalid x-forwarded-for header" ) ;
104+ Err ( StatusCode :: BAD_REQUEST )
105+ }
106+
57107pub async fn delete_selected_handler (
58108 Query ( params) : Query < DeleteRequest > ,
59109) -> Result < Json < DeleteResponse > , StatusCode > {
@@ -81,6 +131,18 @@ pub async fn delete_expired_handler() -> Result<Json<DeleteResponse>, StatusCode
81131 }
82132}
83133
134+ pub async fn delete_expired_rolling_handler ( ) -> Result < Json < DeleteResponse > , StatusCode > {
135+ debug ! ( "Received request to delete expired rolling voucher" ) ;
136+ let client = UNIFI_API . get ( ) . expect ( "UnifiAPI not initialized" ) ;
137+ match client. delete_expired_rolling_vouchers ( ) . await {
138+ Ok ( response) => Ok ( Json ( response) ) ,
139+ Err ( e) => {
140+ error ! ( "Failed to delete expired rolling voucher: {}" , e) ;
141+ Err ( e)
142+ }
143+ }
144+ }
145+
84146pub async fn health_check_handler ( ) -> Result < Json < HealthCheckResponse > , StatusCode > {
85147 debug ! ( "Received health check request" ) ;
86148 let response = HealthCheckResponse {
0 commit comments