JaneDoe-ZS/nap_sdk/src/services/granter_api.rs
2024-07-20 15:59:36 +03:00

80 lines
2.1 KiB
Rust

use axum::extract::State;
use serde::Deserialize;
use serde_json::from_str;
use crate::{
database::{self, DbError, SelectSdkAccount},
services::fail_json,
SdkState,
};
use super::{json, post, Json, Router, Value};
#[derive(Deserialize)]
struct RequestData {
pub uid: String,
pub token: String,
}
#[derive(Deserialize)]
struct GranterTokenRequest {
pub data: String,
pub device: String,
}
pub fn routes() -> Router<SdkState> {
Router::new().route(
"/:product_name/combo/granter/login/v2/login",
post(granter_login_verification),
)
}
async fn granter_login_verification(
state: State<SdkState>,
request: Json<GranterTokenRequest>,
) -> Json<Value> {
let Ok(data) = from_str::<RequestData>(&request.data) else {
return fail_json(-101, "Account token error");
};
let Ok(uid) = data.uid.parse::<i32>() else {
return fail_json(-101, "Account token error");
};
match database::select_sdk_account(&state.pg_pool, SelectSdkAccount::ByUid(uid)).await {
Ok(account) if account.token == data.token => (),
_ => return fail_json(-101, "Account token error"),
}
match database::select_combo_token_by_account(&state.pg_pool, &data.uid).await {
Ok(token) => success_json(&data.uid, &token.token),
Err(DbError::NotFound) => {
let Ok(token) =
database::insert_combo_token(&state.pg_pool, &data.uid, &request.device).await
else {
return fail_json(-1, "Internal server error");
};
success_json(&data.uid, &token.token)
}
Err(DbError::SqlxError(err)) => {
tracing::error!("SQL error: {err}");
fail_json(-1, "Internal server error")
}
}
}
fn success_json(uid: &str, token: &str) -> Json<Value> {
Json(json!({
"data": {
"account_type": 1,
"combo_id": uid,
"combo_token": token,
"data": "{\"guest\":false}",
"heartbeat": false,
"open_id": uid
},
"message": "OK",
"retcode": 0
}))
}