[AI] fix some modules, develop the big part of modules. TODO fix critical errors, update pipeline, test everything
This commit is contained in:
@@ -6,41 +6,72 @@ use axum::{
|
||||
};
|
||||
use serde::Deserialize;
|
||||
use serde_json::{json, Value};
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::{api::ApiState, db::models::User, error::AppError, modules::auth::guard::auth_guard};
|
||||
|
||||
#[derive(Deserialize)]
|
||||
pub struct SubPayload {
|
||||
pub struct InitiatePaymentPayload {
|
||||
pub plan: String,
|
||||
pub provider: String,
|
||||
pub currency: String,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
pub struct ConfirmPaymentPayload {
|
||||
pub invoice_id: Uuid,
|
||||
pub external_tx_id: String,
|
||||
}
|
||||
|
||||
pub fn router(state: ApiState) -> Router<ApiState> {
|
||||
Router::new()
|
||||
.route("/subscribe", post(buy_sub_api))
|
||||
.route("/pay/initiate", post(initiate_payment_api))
|
||||
.route("/pay/confirm", post(confirm_payment_api))
|
||||
.route("/trial", post(activate_trial_api))
|
||||
.route_layer(middleware::from_fn_with_state(state, auth_guard))
|
||||
}
|
||||
|
||||
async fn buy_sub_api(
|
||||
/// Шаг 1: Запрашиваем у провайдера данные для оплаты (адрес, ссылку и т.д.)
|
||||
async fn initiate_payment_api(
|
||||
Extension(user): Extension<User>,
|
||||
State(state): State<ApiState>,
|
||||
Json(payload): Json<SubPayload>,
|
||||
Json(payload): Json<InitiatePaymentPayload>,
|
||||
) -> Result<Json<Value>, AppError> {
|
||||
let checkout_data = state
|
||||
.billing_service
|
||||
.initiate_payment(&user, &payload.plan, &payload.provider, &payload.currency)
|
||||
.await?;
|
||||
|
||||
Ok(Json(json!({
|
||||
"status": "success",
|
||||
"checkout_data": checkout_data
|
||||
})))
|
||||
}
|
||||
|
||||
/// Шаг 2: Подтверждаем транзакцию после того как юзер её оплатил
|
||||
async fn confirm_payment_api(
|
||||
Extension(_user): Extension<User>, // В будущем можно сверять ID юзера с инвойсом
|
||||
State(state): State<ApiState>,
|
||||
Json(payload): Json<ConfirmPaymentPayload>,
|
||||
) -> Result<Json<Value>, AppError> {
|
||||
state
|
||||
.billing_service
|
||||
.buy_subscription(user.tg_id, &payload.plan)
|
||||
.confirm_payment(payload.invoice_id, &payload.external_tx_id)
|
||||
.await?;
|
||||
Ok(Json(
|
||||
json!({"status": "success", "message": format!("Mock payment for {} successful", payload.plan)}),
|
||||
))
|
||||
|
||||
Ok(Json(json!({
|
||||
"status": "success",
|
||||
"message": "Payment verified. Uplink activated."
|
||||
})))
|
||||
}
|
||||
|
||||
async fn activate_trial_api(
|
||||
Extension(user): Extension<User>,
|
||||
State(state): State<ApiState>,
|
||||
) -> Result<Json<Value>, AppError> {
|
||||
state.billing_service.activate_trial(user.tg_id).await?;
|
||||
Ok(Json(
|
||||
json!({"status": "success", "message": "Trial Uplink Activated"}),
|
||||
))
|
||||
state.billing_service.activate_trial(&user).await?;
|
||||
Ok(Json(json!({
|
||||
"status": "success",
|
||||
"message": "Trial Uplink Activated"
|
||||
})))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user