use actix_web::{web, HttpResponse, Responder, post};
use serde::Deserialize;
use std::net::IpAddr;
use crate::core::behavior_bio::BehaviorInput;
use crate::core::cross_location::CrossValidationInput;
use crate::AppState;
use crate::security::jwt::JwtManager;
use actix_web::HttpRequest;
#[derive(Deserialize)]
pub struct GeoResolveRequest {
pub ip_address: Option<IpAddr>, pub gps_data: Option<(f64, f64, u8, f64)>, pub os_info: String, pub device_details: String, pub environment_context: String, pub behavior_input: BehaviorInput, }
#[post("/geo/resolve")]
pub async fn resolve_geo(
req: HttpRequest, payload: web::Json<GeoResolveRequest> ) -> impl Responder {
let token = match req.headers().get("Authorization") {
Some(hv) => hv.to_str().unwrap_or("").replace("Bearer ", ""),
None => String::new(),
};
if token.is_empty() {
return HttpResponse::Unauthorized().body("Missing Authorization token");
}
let jwt_manager = JwtManager::new(
secrecy::Secret::new("a_very_secure_and_long_secret_key_that_is_at_least_32_bytes_long".to_string()),
60,
"my_app".to_string(),
"user_service".to_string(),
);
match jwt_manager.decode_token(&token) {
Ok(_) => {},
Err(_) => return HttpResponse::Unauthorized().body("Invalid or expired token"),
};
let input = CrossValidationInput {
ip_address: payload.ip_address, gps_data: payload.gps_data, os_info: &payload.os_info, device_details: &payload.device_details, environment_context: &payload.environment_context, behavior_input: payload.behavior_input.clone(), };
let engine = &req.app_data::<web::Data<AppState>>().unwrap().x_engine;
match engine.validate(input).await {
Ok(result) => HttpResponse::Ok().json(result), Err(e) => HttpResponse::InternalServerError().json(e.to_string()), }
}