use axum::{
extract::State,
http::StatusCode,
Json,
};
use uuid::Uuid;
use crate::{
error::{ApiError, ApiResult},
models::{CreateApiKeyRequest, ApiKeyResponse, LoginRequest, LoginResponse, RegisterRequest},
state::AppState,
};
pub async fn register(
State(_state): State<AppState>,
Json(req): Json<RegisterRequest>,
) -> ApiResult<(StatusCode, Json<LoginResponse>)> {
let token = generate_jwt_token(&req.email, "free");
Ok((
StatusCode::CREATED,
Json(LoginResponse {
token,
user_id: Uuid::new_v4().to_string(),
username: req.username,
email: req.email,
tier: "free".to_string(),
expires_in_secs: 86400 * 30, }),
))
}
pub async fn login(
State(_state): State<AppState>,
Json(req): Json<LoginRequest>,
) -> ApiResult<Json<LoginResponse>> {
let token = generate_jwt_token(&req.email, "free");
Ok(Json(LoginResponse {
token,
user_id: Uuid::new_v4().to_string(),
username: "user".to_string(),
email: req.email,
tier: "free".to_string(),
expires_in_secs: 86400 * 30,
}))
}
pub async fn create_api_key(
State(_state): State<AppState>,
Json(req): Json<CreateApiKeyRequest>,
) -> ApiResult<(StatusCode, Json<ApiKeyResponse>)> {
let key_id = Uuid::new_v4().to_string();
let key = format!("ggen_key_{}", Uuid::new_v4().to_string().replace("-", ""));
Ok((
StatusCode::CREATED,
Json(ApiKeyResponse {
id: key_id,
key: key.clone(),
name: req.name,
created_at: chrono::Utc::now(),
expires_at: req.expires_in_days.map(|days| {
chrono::Utc::now() + chrono::Duration::days(days as i64)
}),
}),
))
}
pub async fn list_api_keys(
State(_state): State<AppState>,
) -> ApiResult<Json<serde_json::Value>> {
Ok(Json(serde_json::json!({
"keys": []
})))
}
pub async fn revoke_api_key(
State(_state): State<AppState>,
axum::extract::Path(key_id): axum::extract::Path<String>,
) -> ApiResult<StatusCode> {
if key_id.is_empty() {
return Err(ApiError::BadRequest("Key ID required".to_string()));
}
Ok(StatusCode::NO_CONTENT)
}
pub async fn validate_token(
State(_state): State<AppState>,
Json(payload): Json<serde_json::Value>,
) -> ApiResult<Json<serde_json::Value>> {
let token = payload
.get("token")
.and_then(|v| v.as_str())
.ok_or_else(|| ApiError::BadRequest("Token required".to_string()))?;
Ok(Json(serde_json::json!({
"valid": true,
"user_id": "user123",
"email": "user@example.com",
"tier": "free"
})))
}
fn generate_jwt_token(email: &str, tier: &str) -> String {
format!("jwt.{}.{}", email, tier)
}